Interfaz Segregación Principio con métodos "opcionales" en la implementación

jperez:

Interfaz Segregación Principio de SOLID dice que las clases no deberían tener que aplicar / dependerá de los métodos que no necesitan. Nunca se debe tener //Not used: just needed to implement interfaceen el código base.

¿Cómo se aplica este principio cuando algunos métodos son "opcionales", por su naturaleza, porque la clase de implementación es un caso específico de esquina.

Decir que tengo este ejemplo de interfaz:

Interface Input {
    Input create();
    void capitalizeInput(CAPITALIZATION cap);
    String getInput();
}

Class LatinInput implements Input {
    String input;
    Input create(String input){...}
    void capitalizeInput(CAPITALIZATION cap){...}
    String getInput(){...}
}

Class NumberOnlyInput implements Input {
    int input;
    Input create(int input){...}
    void capitalizeInput(CAPITALIZATION cap){
         // Needed because the interface requires it.
         return;
    }
    String getInput(){...}
}

Esa interfaz se utiliza ampliamente en el programa por otras clases. Actualmente en mis programas que estoy haciendo algo como lo siguiente.

Class B {
    Input input;
    B(Input input){
       this.input = input;
    }

    String doStuff(){
        ...
        methodA();
        ...
        methodB();
        ...
        methodC();
        ...
        methodA();
        ...
        return ...;
    }

    private void methodA(){
        ...
        input.transformInput(CAPITAL);
        input.getInput();
    }

    private void methodB(){
        ...
        input.getInput();
    }

    private void methodC(){
        ...
        input.transformInput();
    }
}

Y se llama por una clas C;

Class C {
    void doStuff() {
        List<A> list = new Arraylist<>();
        list.add(LatinInput.create("hello"));
        list.add(LatinInput.create("goodbye"));
        list.add(NumberOnlyInput.create(12345));

        for(Input input: list){
            B b = new B(a);
            b.doStuff();
        }
    }
}

¿Cómo debo cambiar el diseño para cumplir con los ISP, sin cambiar la clase C, y al mismo tiempo no tener que comprobar si el objeto está instance ofen tiempo de ejecución?

Peter Praszmo:

Interfaz principio de la segregación :

establece que ningún cliente debería ser forzado a depender de métodos que no utiliza.

No dice nada acerca de la implementación de métodos con cuerpo vacío. Sus clase Busos tanto capitalizeInputy getInput, siempre y cuando estos son sólo dos métodos en Input, no viola principio de la segregación interfaz. En su caso Busos NumberOnlyInput.capitalizeInputda la casualidad de que el cuerpo Empy es una aplicación válida de esta funcionalidad.

Sin embargo, Input.createhace violar ISP. Bdepende Input, pero no utiliza Input.create- no se llama en absoluto. En ese caso, sólo puede eliminarla de la interfaz.

Todavía se puede deshacerse de ese método vacío extraño. Puesto que NumberOnlyInputes el caso especial de LatinInputque puede volver a utilizar esa clase:

class NumberOnlyInput {
    static Input create(int input) {
        return new LatinInput(String.valueOf(input));
    }
}

Puede ser que sea menos clara o performant - lo que podría ser la razón por caso especial de los números fue creado en el primer lugar.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=363721&siteId=1
Recomendado
Clasificación