Sin embargo, siempre y cuando confíes en que se seguirá el Principio de sustitución de Liskov, ¿por qué no permitirías que se anule?
Por ejemplo, porque quiero que la implementación del esqueleto de un algoritmo sea reparada, y solo permita que partes específicas sean (re) definidas por subclases. Esto es ampliamente conocido como el patrón del Método de la plantilla (énfasis a continuación por mí):
El método de plantilla maneja así la imagen más amplia de la semántica de tareas y detalles de implementación más refinados de selección y secuencia de métodos. Esta imagen más amplia llama a métodos abstractos y no abstractos para la tarea en cuestión. Los métodos no abstractos están completamente controlados por el método de plantilla, pero los métodos abstractos, implementados en subclases, proporcionan el poder expresivo y el grado de libertad del patrón. Algunos o todos los métodos abstractos pueden especializarse en una subclase, lo que permite al escritor de la subclase proporcionar un comportamiento particular con modificaciones mínimas a la semántica más grande. El método de plantilla (que no es abstracto) permanece sin cambios en este patrón, asegurando que los métodos subordinados no abstractos y los métodos abstractos se invoquen en la secuencia originalmente prevista.
Actualizar
Algunos ejemplos concretos de proyectos en los que he estado trabajando:
- comunicarse con un sistema mainframe heredado a través de varias "pantallas". Cada pantalla tiene un montón de campos, de nombre fijo, posición y longitud, que contienen bits de datos específicos. Una solicitud llena ciertos campos con datos específicos. Una respuesta devuelve datos en uno o más campos. Cada transacción sigue la misma lógica básica, pero los detalles son diferentes en cada pantalla. Utilizamos el Método de plantilla en varios proyectos diferentes para implementar el esqueleto fijo de la lógica de manejo de pantalla, al tiempo que permitimos que las subclases definan los detalles específicos de la pantalla.
- exportando / importando datos de configuración en tablas DB a / desde archivos Excel. Nuevamente, el esquema básico de procesar un archivo de Excel e insertar / actualizar registros de base de datos, o volcar los registros a Excel es el mismo para cada tabla, pero los detalles de cada tabla son diferentes. Por lo tanto, el Método de plantilla es una opción muy obvia para eliminar las duplicaciones de código y hacer que el código sea más fácil de entender y mantener.
- Generando documentos PDF. Cada documento tiene la misma estructura, pero su contenido es diferente cada vez, dependiendo de muchos factores. Una vez más, el Método de plantilla facilita la separación del esqueleto fijo del algoritmo de generación de los detalles modificables específicos del caso. De hecho. incluso se aplica en múltiples niveles aquí, ya que el documento consta de varias secciones , cada una de las cuales consta de cero o más campos . El método de plantilla se aplica en 3 niveles distintos aquí.
En los primeros dos casos, la implementación heredada original usó la Estrategia , lo que resultó en una gran cantidad de código duplicado, que por supuesto a lo largo de los años creció diferencias sutiles aquí y allá, contenía muchos errores duplicados o ligeramente diferentes, y fue muy difícil de mantener. Refactorizar al método de plantilla (y algunas otras mejoras, como el uso de anotaciones Java) redujo el tamaño del código en aproximadamente un 40-70%.
Estos son solo los ejemplos más recientes que me vienen a la mente. Podría citar más casos de casi todos los proyectos en los que he estado trabajando hasta ahora.