Hay muchas heurísticas asociadas con el diseño orientado a objetos. Por ejemplo, "todas las variables miembro deben ser privadas", o "las variables globales deben evitarse", o "usar la identificación de tipo de tiempo de ejecución (RTTI) es peligroso". ¿Cuál es la fuente de estas heurísticas? ¿Qué los hace verdaderos? ¿Son siempre ciertas? Esta columna investiga el principio de diseño que subyace a estas heurísticas: el principio abierto-cerrado.
Como dijo Ivar Jacobson: “Todos los sistemas cambian durante sus ciclos de vida. Esto debe tenerse en cuenta al desarrollar sistemas que se espera que duren más que la primera versión ”. ¿Cómo podemos crear diseños que sean estables ante el cambio y que duren más que la primera versión? Bertrand Meyer nos dio orientación en 1988, cuando acuñó el ahora famoso principio abierto-cerrado. Parafraseándolo:
LAS ENTIDADES DE SOFTWARE (CLASES, MÓDULOS, FUNCIONES, ETC.) DEBEN ABRIRSE PARA SU EXTENSIÓN, PERO CERRARSE PARA MODIFICARSE.
Cuando un solo cambio en un programa resulta en una cascada de cambios en módulos dependientes, ese programa exhibe los atributos indeseables que hemos llegado a asociar con un diseño "malo". El programa se vuelve frágil, rígido, impredecible e irreutilizable. El principio abierto-cerrado ataca esto de una manera muy directa. Dice que debe diseñar módulos que nunca cambien . Cuando los requisitos cambian, amplía el comportamiento de dichos módulos agregando código nuevo, no cambiando el código antiguo que ya funciona.
Descripción
Los módulos que se ajustan al principio abierto-cerrado tienen dos atributos principales.
- Están "abiertos para la extensión".
Esto significa que el comportamiento del módulo puede extenderse. Que podemos hacer que el módulo se comporte de formas nuevas y diferentes a medida que cambian los requisitos de la aplicación, o para satisfacer las necesidades de las nuevas aplicaciones.
- Están "cerrados por modificación".
El código fuente de dicho módulo es inviolable. Nadie puede hacer cambios en el código fuente.
Parece que estos dos atributos están en desacuerdo entre sí. La forma normal de extender el comportamiento de un módulo es realizar cambios en ese módulo. Normalmente se cree que un módulo que no se puede cambiar tiene un comportamiento fijo. ¿Cómo se pueden resolver estos dos atributos opuestos?
La abstracción es la clave ...