Definición: una entidad de software, como clases, módulos y funciones, debe estar abierta a extensiones y cerrarse a modificaciones.
El origen del problema: durante el ciclo de vida del software, cuando el código original del software debe modificarse debido a cambios, actualizaciones y mantenimiento, los errores pueden introducirse en el código anterior, y también puede obligarnos a refactorizar toda la función, y el código original debe ser probado.
Solución: cuando el software necesita cambiar, intente lograr el cambio extendiendo el comportamiento de la entidad del software, en lugar de modificar el código existente.
El principio de apertura y cierre es el principio de diseño más básico en el diseño orientado a objetos, que nos guía cómo establecer un sistema estable y flexible. El principio de apertura y cierre puede ser la definición más vaga de los seis principios del patrón de diseño. Solo nos dice que abramos y cierran modificaciones, pero ¿cómo podemos estar abiertos y cerrados y no contarnos con claridad? En el pasado, si alguien me dijo: "Debes cumplir con el principio de abrir y cerrar al diseñar", sentiría que no dijo nada, pero parecía que lo dijo todo. Porque el principio de abrir y cerrar está realmente demasiado vacío.
Después de pensar cuidadosamente y leer muchos artículos sobre patrones de diseño, finalmente comprendí un poco del principio de apertura y cierre. De hecho, seguimos los primeros cinco principios de los patrones de diseño, y el propósito de usar 23 patrones de diseño es seguir los principios de apertura y cierre. En otras palabras, mientras cumplamos con los primeros cinco principios, el software diseñado naturalmente se ajustará a los principios de apertura y cierre. Este principio de apertura y cierre se parece más al "puntaje promedio" del grado de cumplimiento de los primeros cinco principios. Si los cinco principios anteriores están bien seguidos, el puntaje promedio será naturalmente más alto, lo que significa que los principios de apertura y cierre del diseño del software están bien seguidos; Si no se cumplen los cinco principios anteriores, significa que los principios de apertura y cierre no se cumplen.
De hecho, el autor cree que el principio de apertura y cierre no es más que expresar el significado: construir un marco con abstracción y expandir detalles con la implementación. Debido a la flexibilidad y una amplia adaptabilidad de la abstracción, siempre que la abstracción sea razonable, la estabilidad de la arquitectura del software se puede mantener básicamente. Para los detalles variables en el software, utilizamos la clase de implementación derivada del resumen para extender. Cuando el software necesita cambiar, solo necesitamos volver a perseguir una clase de implementación de acuerdo con las necesidades de extender. Por supuesto, la premisa es que nuestra abstracción debe ser razonable y debemos estar con visión de futuro y previsualizar los cambios en la demanda.
En la definición del principio de apertura y cierre, una entidad de software puede referirse a un módulo de software, una estructura local compuesta por múltiples clases o una clase independiente.
Cualquier software necesita enfrentar un problema importante, es decir, sus necesidades cambiarán con el tiempo. Cuando el sistema de software necesita enfrentar nuevas necesidades, debemos hacer todo lo posible para asegurarnos de que el marco de diseño del sistema sea estable. Si un diseño de software cumple con el principio de apertura y cierre, puede ser muy conveniente expandir el sistema, y no es necesario modificar el código existente al expandir, para que el sistema de software tenga una mejor estabilidad y continuidad al tiempo que tiene adaptabilidad y flexibilidad. A medida que la escala de software se vuelve cada vez más grande, la vida útil del software se vuelve más larga y los costos de mantenimiento del software se vuelven cada vez más altos, y el diseño de sistemas de software que cumplan con los principios de apertura y cierre se vuelve cada vez más importante.
Para cumplir con el principio de apertura y cierre, es necesario diseñar abstractamente el sistema, y la abstracción es la clave del principio de apertura y cierre. En lenguajes de programación como Java y C#, se puede definir una capa de abstracción relativamente estable para el sistema, y se pueden mover diferentes comportamientos de implementación a la capa de implementación específica para completar. En muchos lenguajes de programación orientados a objetos, se proporcionan mecanismos como interfaces y clases abstractas, a través de las cuales la capa de abstracción del sistema puede definirse y luego extenderse a través de clases concretas. Si necesita modificar el comportamiento del sistema, no es necesario hacer ningún cambio en la capa de abstracción. Solo necesita agregar nuevas clases concretas para implementar nuevas funciones comerciales, para expandir las funciones del sistema sin modificar los códigos existentes y cumplir con los requisitos del principio de apertura y cierre.
El sistema CRM desarrollado por Sunny Software puede mostrar varios tipos de gráficos, como gráficos circulares y gráficos de barras. Para admitir múltiples métodos de visualización de gráficos, el plan de diseño original se muestra en la figura a continuación:
El siguiente fragmento de código existe en el método Display () de la clase ChartDisplay:
...... if (type.equals ("pastel")) {piechart chart = new Piechart (); chart.display (); } else if (type.equals ("bar")) {barchart gráfico = new Barchart (); chart.display (); } ...... En este código, si necesita agregar una nueva clase de gráfico, como Linechart, debe modificar el código fuente del método Display () de la clase ChartDisplay y agregar una nueva lógica de juicio, que viola el principio de apertura y cierre.
El sistema ahora se reconfigura para que se ajuste al principio de apertura y cierre.
En este ejemplo, dado que cada clase de gráfico está programada en el método Display () de la clase ChartDisplay, agregar una nueva clase de gráfico tiene que modificar el código fuente. El sistema se puede refactorizar de manera abstracta para que al agregar nuevas clases de gráficos, no hay necesidad de modificar el código fuente, que satisface el principio de apertura y cierre. Los métodos específicos son los siguientes:
(1) Agregue un cuadro de resúmenes de clase de gráfico abstracto y use varias clases de gráficos de concreto como sus subclases;
(2) La clase ChartDisplay está programada para clases de gráficos abstractos, y el cliente decide qué gráfico específico usar.
La estructura después de la reconstrucción se muestra en la figura a continuación:
En la Figura 2, presentamos el cuadro de la clase de gráfico abstracto, y ChartDisplay está programado para la clase de gráfico abstracto, y el cliente establece el objeto de gráfico específico instanciado a través del método setchart (). En el método Display () de ChartDisplay, se llama al método Display () del objeto de gráfico para mostrar el gráfico. Si necesita agregar un nuevo gráfico, como Linechart, solo necesita usar Linechart como una subclase de AbstractChart e inyectar un objeto Linechart en ChartDisplay en el cliente, sin modificar el código fuente de la biblioteca de clases existente.
Nota: Debido a que los archivos de configuración en formatos como XML y las propiedades son archivos de texto sin formato, se pueden editar directamente a través del editor VI o el bloc de notas sin compilación, en el desarrollo de software, la modificación de los archivos de configuración generalmente no se considera una modificación del código fuente del sistema. Si un sistema solo implica modificar el archivo de configuración cuando se extiende, y el código Java original o el código C# no han realizado ninguna modificación, el sistema puede considerarse un sistema que cumple con el principio de apertura y cierre.