oop - sustitucion - principio de sustitución de liskov
¿Cuál es el significado y el razonamiento detrás del Principio Abierto/Cerrado? (11)
El Principio Abierto / Cerrado establece que las entidades de software (clases, módulos, etc.) deben estar abiertas para la extensión, pero cerradas para su modificación. ¿Qué significa esto y por qué es un principio importante de un buen diseño orientado a objetos?
Las entidades de software deberían estar abiertas para la extensión, pero cerradas para su modificación
Eso significa que cualquier clase o módulo debe escribirse de forma tal que se pueda usar tal cual, se puede extender, pero no se ha modificado
Mal ejemplo en Javascript
var juiceTypes = [''Mango'',''Apple'',''Lemon''];
function juiceMaker(type){
if(juiceTypes.indexOf(type)!=-1)
console.log(''Here is your juice, Have a nice day'');
else
console.log(''sorry, Error happned'');
}
exports.makeJuice = juiceMaker;
Ahora, si desea agregar otro tipo de jugo, debe editar el módulo en sí. De esta manera, estamos rompiendo el OCP.
Buen ejemplo en Javascript
var juiceTypes = [];
function juiceMaker(type){
if(juiceTypes.indexOf(type)!=-1)
console.log(''Here is your juice, Have a nice day'');
else
console.log(''sorry, Error happned'');
}
function addType(typeName){
if(juiceTypes.indexOf(typeName)==-1)
juiceTypes.push(typeName);
}
function removeType(typeName){
if (juiceTypes.indexOf(typeName)==-1)
juiceTypes.splice(typeName,1);
}
exports.makeJuice = juiceMaker;
exports.addType = addType;
exports.removeType = removeType;
Ahora puede agregar nuevos tipos de jugo desde fuera del módulo sin editar el mismo módulo.
El principio significa que debería ser fácil agregar nuevas funcionalidades sin tener que cambiar la funcionalidad existente, estable y probada, ahorrando tiempo y dinero.
A menudo, el polimorfismo, por ejemplo, el uso de interfaces, es una buena herramienta para lograr esto.
En principio de diseño, SÓLIDO - la "O" en "SOLIDO" representa el principio abierto / cerrado.
El principio Open Closed es un principio de diseño que dice que una clase, módulos y funciones deben estar abiertos para la extensión pero cerrados para su modificación.
Este principio establece que el diseño y la redacción del código se deben realizar de forma que se agreguen nuevas funciones con cambios mínimos en el código existente (código probado). El diseño debe hacerse de una manera que permita agregar nuevas funcionalidades como nuevas clases, manteniendo inalterado tanto como sea posible el código existente.
Beneficio del Principio de Diseño Abierto Cerrado:
- La aplicación será más robusta porque no estamos cambiando la clase ya probada.
- Flexible porque podemos acomodar fácilmente nuevos requisitos.
- Fácil de probar y menos propenso a errores.
Mi blog publica sobre esto:
http://javaexplorer03.blogspot.in/2016/12/open-closed-design-principle.html
Es la respuesta al problema de la clase base frágil, que dice que las modificaciones aparentemente inocentes de las clases base pueden tener consecuencias no deseadas para los herederos que dependían del comportamiento anterior. Por lo tanto, debe tener cuidado de encapsular aquello en lo que no quiere depender para que las clases derivadas obedezcan los contratos definidos por la clase base. Y una vez que existen los herederos, debes tener mucho cuidado con lo que cambias en la clase base.
Específicamente, se trata de un "Santo Grial" de diseño en OOP para hacer que una entidad sea suficientemente extensible (a través de su diseño individual o mediante su participación en la arquitectura) para soportar cambios imprevistos futuros sin reescribir su código (y algunas veces incluso sin volver a compilar) **).
Algunas formas de hacerlo incluyen Polimorfismo / Herencia, Composición, Inversión de Control (también conocido como DIP), Programación Orientada a Aspectos, Patrones como Estrategia, Visitante, Método de Plantilla, y muchos otros principios, patrones y técnicas de OOAD.
** Ver los 6 "principios del paquete", REP, CCP, CRP, ADP, SDP, SAP
Esto significa que el software OO debe ser desarrollado, pero no modificado intrínsecamente. Esto es bueno porque garantiza un rendimiento confiable y predecible de las clases base.
Más específicamente que DaveK, generalmente significa que si desea agregar funcionalidad adicional o cambiar la funcionalidad de una clase, cree una subclase en lugar de cambiar la original. De esta manera, cualquier persona que use la clase para padres no tiene que preocuparse de que cambie más adelante. Básicamente, se trata de compatibilidad con versiones anteriores.
Otro principio realmente importante del diseño orientado a objetos es el acoplamiento flexible a través de una interfaz de método. Si el cambio que desea realizar no afecta la interfaz existente, realmente es bastante seguro cambiarlo. Por ejemplo, para hacer un algoritmo más eficiente. Los principios orientados a objetos también deben ser atemperados por el sentido común :)
Recientemente me dieron una idea adicional de lo que este principio implica: que el principio de Open-Closed describe a la vez una forma de escribir código, así como un resultado final de escribir código de una manera elástica.
Me gusta pensar en la división Abierta / Cerrada en dos partes estrechamente relacionadas:
- El código que está Abierto para cambiar puede cambiar su comportamiento para manejar sus entradas correctamente o requiere una modificación mínima para proporcionar nuevos escenarios de uso.
- El código que está cerrado para la modificación no requiere mucha intervención humana, si es que lo hace, para manejar nuevos escenarios de uso. La necesidad simplemente no existe.
Por lo tanto, el código que muestra un comportamiento Abierto / Cerrado (o, si lo prefiere, cumple con el Principio Abierto / Cerrado) requiere una modificación mínima o nula en respuesta a escenarios de uso más allá de lo que fue originalmente diseñado.
En cuanto a la implementación se refiere? Encuentro que la interpretación comúnmente establecida, "Abierto / Cerrado se refiere a que el código es polimórfico". ser, en el mejor de los casos, una declaración incompleta. El polimorfismo en el código es una herramienta para lograr este tipo de comportamiento; Herencia, Implementación ... realmente, cada principio de diseño orientado a objetos es necesario para escribir código que sea resistente de la manera implícita en este principio.
Significa que debes poner un nuevo código en nuevas clases / módulos. El código existente debe modificarse solo para la corrección de errores. Las nuevas clases pueden reutilizar el código existente a través de la herencia.
El principio abierto / cerrado está destinado a mitigar el riesgo al introducir nuevas funcionalidades. Como no modifica el código existente, puede estar seguro de que no se romperá. Reduce el costo de mantenimiento y aumenta la estabilidad del producto.
Solo quiero enfatizar que "Abierto / Cerrado", a pesar de ser obviamente útil en la programación de OO, es un método saludable para usar en todos los aspectos del desarrollo. Por ejemplo, en mi propia experiencia, es un gran analgésico utilizar "abierto / cerrado" tanto como sea posible cuando se trabaja con C.
/ Robert
Una regla empírica adicional para conformarse con OCP es hacer abstractas las clases base con respecto a la funcionalidad provista por las clases derivadas. O como dice Scott Meyers, ''Haz abstractas las clases de hojas''.
Esto significa tener métodos no implementados en la clase base y solo implementar estos métodos en clases que no tienen subclases. Entonces, el cliente de la clase base no puede confiar en una implementación particular en la clase base, ya que no existe ninguna.