Définition: Une entité logicielle telle que les classes, les modules et les fonctions doit être ouverte aux extensions et fermée aux modifications.
L'origine du problème: Pendant le cycle de vie du logiciel, lorsque le code d'origine du logiciel doit être modifié en raison de modifications, de mises à niveau et de maintenance, des erreurs peuvent être introduites dans l'ancien code, et il peut également nous forcer à refactoriser toute la fonction et le code d'origine doit être retesté.
Solution: Lorsque le logiciel doit changer, essayez de réaliser le changement en étendant le comportement de l'entité logicielle, plutôt que de modifier le code existant.
Le principe de l'ouverture et de la fermeture est le principe de conception le plus élémentaire dans la conception orientée objet, qui nous guide comment établir un système stable et flexible. Le principe de l'ouverture et de la fermeture peut être la définition la plus vague des six principes du modèle de conception. Il nous dit seulement d'ouvrir et de fermer des modifications, mais comment pouvons-nous être ouverts et fermés et ne pas nous dire clairement. Dans le passé, si quelqu'un me disait: "Vous devez respecter le principe de l'ouverture et de la fermeture lors de la conception", je sentirais qu'il n'a rien dit, mais il semblait qu'il avait tout dit. Parce que le principe de l'ouverture et de la fermeture est vraiment trop vide.
Après avoir soigneusement réfléchi et lu de nombreux articles sur les modèles de conception, j'ai finalement compris le principe de l'ouverture et de la fermeture. En fait, nous suivons les cinq premiers principes des modèles de conception, et le but d'utiliser 23 modèles de conception est de suivre les principes d'ouverture et de clôture. En d'autres termes, tant que nous nous contentions des cinq premiers principes, le logiciel conçu sera naturellement conforme aux principes d'ouverture et de clôture. Ce principe d'ouverture et de clôture ressemble plus au «score moyen» du degré de conformité des cinq premiers principes. Si les cinq principes précédents sont bien suivis, le score moyen sera naturellement plus élevé, ce qui signifie que les principes d'ouverture et de clôture de la conception du logiciel sont bien suivis; Si les cinq principes précédents ne sont pas respectés, cela signifie que les principes d'ouverture et de clôture ne sont pas respectés.
En fait, l'auteur estime que le principe de l'ouverture et de la fermeture n'est rien de plus que d'exprimer le sens: construire un cadre avec abstraction et développer les détails avec la mise en œuvre. En raison de la flexibilité et de la large adaptabilité de l'abstraction, tant que l'abstraction est raisonnable, la stabilité de l'architecture logicielle peut être essentiellement maintenue. Pour les détails variables du logiciel, nous utilisons la classe d'implémentation dérivée d'un résumé à l'étendue. Lorsque le logiciel doit changer, nous n'avons qu'à référencer une classe d'implémentation en fonction des besoins à étendre. Bien sûr, la prémisse est que notre abstraction doit être raisonnable et que nous devons être prospectives et prévues dans les changements de demande.
Dans la définition du principe d'ouverture et de clôture, une entité logicielle peut se référer à un module logiciel, à une structure locale composée de plusieurs classes ou d'une classe indépendante.
Tout logiciel doit faire face à un problème important, c'est-à-dire que leurs besoins changeront avec le temps. Lorsque le système logiciel doit faire face à de nouveaux besoins, nous devons faire de notre mieux pour nous assurer que le cadre de conception du système est stable. Si une conception de logiciels est conforme au principe de l'ouverture et de la fermeture, il peut être très pratique d'élargir le système, et il n'est pas nécessaire de modifier le code existant lors de l'expansion, afin que le système logiciel ait une meilleure stabilité et continuité tout en ayant l'adaptabilité et la flexibilité. À mesure que l'échelle du logiciel devient de plus en plus grande, la durée de vie du logiciel devient plus longue et les coûts de maintenance des logiciels deviennent de plus en plus élevés, et la conception de systèmes logiciels qui répondent aux principes d'ouverture et de clôture deviennent de plus en plus importants.
Afin de répondre au principe de l'ouverture et de la fermeture, il est nécessaire de concevoir abstrait le système, et l'abstraction est la clé du principe de l'ouverture et de la fermeture. Dans les langages de programmation tels que Java et C #, une couche d'abstraction relativement stable peut être définie pour le système, et différents comportements de mise en œuvre peuvent être déplacés vers la couche d'implémentation spécifique à terminer. Dans de nombreux langages de programmation orientés objet, des mécanismes tels que des interfaces et des classes abstraits sont fournis, à travers lesquels la couche d'abstraction du système peut être définie puis étendue à travers des classes de béton. Si vous devez modifier le comportement du système, il n'est pas nécessaire d'apporter des modifications à la couche d'abstraction. Il vous suffit d'ajouter de nouvelles classes concrètes pour implémenter de nouvelles fonctions commerciales, afin d'étendre les fonctions du système sans modifier les codes existants et répondre aux exigences du principe d'ouverture et de clôture.
Le système CRM développé par Sunny Software peut afficher divers types de graphiques, tels que les graphiques circulaires et les graphiques à barres. Afin de prendre en charge plusieurs méthodes d'affichage des graphiques, le plan de conception d'origine est illustré dans la figure ci-dessous:
L'extrait de code suivant existe dans la méthode Display () de la classe ChartDisplay:
...... if (type.equals ("PIE")) {Piechart Chart = new Piechart (); chart.display (); } else if (type.equals ("bar")) {BarChart chart = new BarChart (); chart.display (); } ...... Dans ce code, si vous avez besoin d'ajouter une nouvelle classe de graphique, telle que LineChart, vous devez modifier le code source de la méthode Affichage () de la classe ChartDisplay et ajouter une nouvelle logique de jugement, qui viole le principe de l'ouverture et de la fermeture.
Le système est maintenant reconfiguré pour le rendre conforme au principe de l'ouverture et de la fermeture.
Dans cet exemple, comme chaque classe de graphique est programmée dans la méthode Display () de la classe ChartDisplay, l'ajout d'une nouvelle classe de graphique doit modifier le code source. Le système peut être refactorisé de manière abstraite afin que lors de l'ajout de nouvelles classes de graphiques, il n'est pas nécessaire de modifier le code source, qui satisfait le principe de l'ouverture et de la fermeture. Les méthodes spécifiques sont les suivantes:
(1) Ajouter une classe de graphique abstraite AbstractChart et utiliser diverses classes de graphiques en béton comme sous-classes;
(2) La classe ChartDisplay est programmée pour les classes de graphiques abstraites, et le client décide quel graphique spécifique à utiliser.
La structure après reconstruction est indiquée dans la figure ci-dessous:
Dans la figure 2, nous présentons la classe de graphique abstraite AbstractChart, et ChartDisplay est programmé pour la classe de graphique abstraite, et le client définit l'objet de graphique spécifique instancié via la méthode SetChart (). Dans la méthode Display () de ChartDisplay, la méthode Affichage () de l'objet de graphique est appelée pour afficher le graphique. Si vous avez besoin d'ajouter un nouveau graphique, tel que LineChart, vous n'avez qu'à utiliser LineChart comme sous-classe d'AbstractChart et à injecter un objet LineChart dans ChartDisplay sur le client, sans modifier le code source de la bibliothèque de classe existante.
Remarque: Parce que les fichiers de configuration dans des formats tels que XML et les propriétés sont des fichiers texte brut, ils peuvent être modifiés directement via VI Editor ou Notepad sans compilation, dans le développement de logiciels, la modification des fichiers de configuration n'est généralement pas considérée comme une modification du code source système. Si un système ne consiste à modifier le fichier de configuration que lorsqu'il est étendu et que le code Java d'origine ou le code C # n'a apporté aucune modification, le système peut être considéré comme un système qui est conforme au principe d'ouverture et de fermeture.