Funciones avanzadas disponibles en la aplicación
Le Principe Open/Closed (OCP) est un concept fondamental de la programmation orientée objet et de la conception logicielle, faisant partie des principes SOLID. Il vise à rendre les systèmes logiciels plus flexibles, maintenables, et extensibles tout en minimisant les risques d’introduire des erreurs lors des évolutions.
Définition du OCP :
Un module logiciel (classe, fonction, module) doit être ouvert à l'extension mais fermé à la modification.
Autrement dit, il faut pouvoir ajouter de nouvelles fonctionnalités sans modifier le code existant.
Pour mieux comprendre, approfondissons les deux notions clés contenues dans ce principe :
Le logiciel doit permettre l’ajout de nouveaux comportements ou fonctionnalités. Ceci est souvent réalisé à l’aide de l’héritage, de la composition, ou d’autres mécanismes permettant d’implémenter de nouvelles fonctionnalités en ajoutant du code.
Une fois qu’une classe ou un module fonctionne correctement, son code source ne doit plus être modifié. Modifier du code testé et stable augmente le risque d’erreur et de régression.
Plusieurs techniques permettent de respecter le Principe OCP.
Au lieu de coder directement avec une implémentation concrète, on programme sur des interfaces ou classes abstraites.
Le polymorphisme permet d’appeler des méthodes sur des objets de types différents de façon transparente, ce qui facilite l’extension.
Utiliser l’injection de dépendances pour que les modules ne dépendent pas directement des implémentations concrètes, mais d’abstractions, facilitant l’ajout de nouvelles fonctionnalités.
Imaginons un logiciel de gestion de formes géométriques qui calcule les surfaces.
class Calculator {
calculateArea(shape) {
if (shape.type === "circle") {
return Math.PI * shape.radius * shape.radius;
} else if (shape.type === "rectangle") {
return shape.width * shape.height;
}
// Dès qu’on veut ajouter un nouveau type, il faut modifier cette méthode
}
}
Ici, chaque nouvel ajout de forme nécessite de modifier la méthode calculateArea, ce qui viole le principe OCP.
class Shape {
getArea() {
throw new Error("Méthode getArea() doit être implémentée");
}
}
class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}
getArea() {
return Math.PI * this.radius * this.radius;
}
}
class Rectangle extends Shape {
constructor(width, height) {
super();
this.width = width;
this.height = height;
}
getArea() {
return this.width * this.height;
}
}
class Calculator {
calculateArea(shape) {
return shape.getArea();
}
}
Dans cette version, la méthode calculateArea ne change jamais. On peut ajouter de nouvelles formes en créant simplement une nouvelle classe qui hérite de Shape et implémente getArea.
[Diagramme]
Ce diagramme montre l’architecture où Calculator dépend de la classe abstraite Shape et appelle la méthode getArea polymorphiquement.
| Principe | Relation avec OCP |
|---|---|
| SRP | Le respect du OCP incite à structurer le code en classes spécialisées avec une seule responsabilité. |
| LSP | Le polymorphisme implicite dans le OCP suppose le respect du Liskov Substitution Principle pour substituer les sous-classes sans effets inattendus. |
| ISP | Favoriser les interfaces fines améliore la facilité d’extension sans modification. |
| DIP | Le code doit dépendre des abstractions, comme préconisé par le OCP. |
Cette fiche vous donne une base solide pour comprendre et appliquer le Open/Closed Principle dans vos projets de développement logiciel.
