¿Cómo ser compatible con OCP y cambiar los algoritmos?

7

Todavía no estoy trabajando, solo estoy estudiando y tratando recientemente con los principios de SOLID. He leído mucho sobre el principio de apertura abierta, pero desafortunadamente la mayoría de los libros y artículos comparten los mismos ejemplos. No entiendo lo siguiente: si la clase no debe cambiarse después de haber sido

    
pregunta Ezoela Vacca 24.01.2018 - 17:23

3 respuestas

3
  

Pero no aborda el problema si la implementación de la clase base necesita cambiar (por ejemplo, un método que se implementa en el nivel de la clase base). ¿Por qué este principio no aborda eso?

El punto de mantenerlo abierto a la extensión es evitar la necesidad de realizar esa modificación directa.

La modificación directa siempre es posible, pero puede tener costos significativos. El OCP le pide que comience con un diseño que, con suerte, evita la necesidad de modificación directa, y sus costos, a medida que cambian los requisitos.

Un diseño que permite un reemplazo polimórfico del comportamiento ofensivo significa que no tiene que tocar el código que desea cambiar. Solo tienes que escribir el nuevo código.

Eso significa que si encuentra que TIENE QUE cambiar la implementación de la clase base, ya no pudo seguir el OCP. Debería haber utilizado un diseño que hubiera permitido que esa implementación fuera reemplazada por otro código escrito en otra parte.

Hay muchas maneras de hacer esto. El polimorfismo viene en muchas formas. Herencia, composición y delegación, envoltorios, sigue y sigue. Cualquiera de estos puede evitar ver esa implementación de código base llamada.

Si escribe código que accede directamente a esta implementación de una manera que no le da a nadie la forma de reemplazarla con alguna otra implementación, viola el OCP antes del cambio. No haga eso a menos que esté muy seguro de que la implementación nunca tendrá que cambiar o de que está dispuesto a asumir los costos de realizar modificaciones directas en la implementación.

No es que el principio no aborde la necesidad de cambiar directamente la implementación de la clase base. Le dice expresamente que evite crear la necesidad de hacerlo.

    
respondido por el candied_orange 24.01.2018 - 18:34
3

En el mundo real, a veces los requisitos cambiantes significan cambiar las cosas modificadas, pero hay formas de mitigar la frecuencia con la que sucede. SOLID es una lista de principios que a veces compiten entre sí y depende del desarrollador determinar cuáles son los más importantes para la situación en cuestión.

Para cambiar los algoritmos, una solución común es utilizar el patrón de estrategia para requerir que se proporcione el algoritmo cuando el objeto se crea en el tiempo de ejecución y, por lo tanto, se pueden usar diferentes objetos. Esto también es parte del principio de inversión de dependencia. Vamos a usar calidades de cálculo como ejemplo, puede haber múltiples formas de curva o no curva, por lo que su clase que calcula calificaciones requiere una función para proporcionar esa curva como parte de su creación. Esto significa que puede hacer que la misma clase calcule las calificaciones de manera diferente sin modificar esa clase.

Otra forma de ayudar a mantener las clases cerradas está relacionada con el principio de responsabilidad única, que también puede ayudar a decidir cuándo es necesario modificar una clase. Si hay un cambio en la responsabilidad de una clase, es muy probable que necesite modificarlo. Si una clase tiene múltiples responsabilidades, es mucho más probable que sea necesario modificarla y tener una mayor probabilidad de causar errores porque está modificando múltiples responsabilidades a la vez. Para calcular las calificaciones, puede tener una clase base que solo se preocupa por el proceso de cálculo de la calificación, y se extiende con las clases responsables de dar formato a esa calificación como una letra, un porcentaje, aprobar / rechazar o algo más.

Idealmente, la única razón por la que una clase debería modificarse son los requisitos directamente relacionados con su cambio de responsabilidad. Dependiendo del dominio, esto puede ser constante o extremadamente raro.

    
respondido por el Ryathal 24.01.2018 - 18:21
0

Se supone que una clase solo está cerrada a modificación. Aunque está abierto a la extensión.

Entonces, si su clase tiene un método, AddOne , que agrega uno a un valor, entonces AddOne no debería cambiarse un día para agregar dos a un valor. Eso sería una modificación y la clase está cerrada a eso.

En su lugar, se agrega un nuevo método, AddTwo , que maneja ese nuevo algoritmo. Esa es la extensión y la clase está abierta a eso.

La excepción a la regla es si se encuentra un error en AddOne . Entonces su comportamiento puede ser modificado.

    
respondido por el David Arno 24.01.2018 - 17:43

Lea otras preguntas en las etiquetas