Maison >Java >javaDidacticiel >Principes SOLIDES
SOLID est un ensemble de principes fondamentaux conçus pour améliorer la gérabilité et l'évolutivité du code dans la programmation orientée objet (POO). Il se compose de cinq principes clés :
Ces principes ont été introduits par Robert C. Martin (également connu sous le nom d'Oncle Bob) au début des années 2000 et ont depuis été largement adoptés dans la communauté du développement logiciel. En suivant les principes SOLID, les développeurs peuvent créer un code plus facile à comprendre, à modifier et à étendre, conduisant à des systèmes logiciels plus robustes et plus maintenables.
Le principe de responsabilité unique est le premier et le plus fondamental des principes POO et SOLID. Comme son nom l'indique, ce principe signifie « Une classe ne devrait avoir qu'une seule responsabilité spécifique à assumer ».
Supposons que nous ayons une classe appelée Invoice , qui contient 2 méthodes generateInvoice() et saveToFiles() .
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } public void saveToFiles() { // code to save invoice as a file. } }
Ce n'est pas une bonne pratique car la classe Invoice a deux responsabilités. Une meilleure approche serait de séparer ces fonctionnalités en classes dédiées.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } } public class FileManager { public void saveToFiles(Invoice invoice) { // code to save invoice as a file. } }
Ici, nous pouvons voir que nous avons 2 classes pour le cas d'utilisation :
Le principe ouvert-fermé est un autre principe fondamental de SOLID. Ce principe a été introduit par Bertrand Meyer en 1997. L'idée derrière ce principe est « Les artefacts logiciels (classes, modules et fonctions) doivent s'ouvrir pour les extensions, mais fermés pour les modifications. »
Par exemple ;
Disons que nous avons une classe appelée Shape , nous pouvons utiliser cette classe pour calculer l'aire de la forme.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } public void saveToFiles() { // code to save invoice as a file. } }
Dans le code ci-dessus, l'ajout d'une nouvelle forme nécessite de modifier la classe Shape existante, ce qui n'est pas considéré comme une bonne pratique.
Vous trouverez ci-dessous un exemple de code qui montre comment appliquer le principe ouvert-fermé à ce scénario.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } } public class FileManager { public void saveToFiles(Invoice invoice) { // code to save invoice as a file. } }
Avec l'application d'OCP, nous pouvons ajouter autant de formes que nous le souhaitons sans modifier l'implémentation actuelle.
REMARQUE : L'utilisation d'interfaces n'est pas le seul moyen d'atteindre l'OCP.
Le principe de substitution de Liskov est un autre principe important en POO. Il a été introduit par Barbara Liskov en 1987 lors d'une conférence sur l'abstraction de données.
Le principe stipule : « Les objets d'une superclasse doivent être remplaçables par des objets de ses sous-classes sans altérer l'exactitude du programme ».
Par exemple, si Circle et Rectangle sont des sous-types de Shape, alors nous devrions pouvoir remplacer l'objet Shape par un objet Circle ou Rectangle sans aucun problème.
public class Shape { private String shapeType; private double radius; private double length; private double width; public Shape(String shapeType, double radius, double length, double width) { this.shapeType = shapeType; this.radius = radius; this.length = length; this.width = width; } public double area() { if (shapeType.equals("circle")) { return Math.PI * (radius * radius); } else if (shapeType.equals("rectangle")) { return length * width; } else { throw new IllegalArgumentException("Unknown shape type"); } } } // Usage public class Main { public static void main(String[] args) { Shape circle = new Shape("circle", 5, 0, 0); Shape rectangle = new Shape("rectangle", 0, 4, 6); System.out.println(circle.area()); System.out.println(rectangle.area()); } }
Comme démontré dans cet exemple, adhérer au principe de substitution de Liskov signifie que nous devrions pouvoir remplacer de manière transparente une instance de superclasse par une instance de sous-classe.
Le principe de ségrégation d'interface est l'un des cinq principes SOLID introduits par Robert C. Martin. Il précise : « Les clients ne devraient pas être obligés de dépendre d’interfaces qu’ils n’utilisent pas ».
En d'autres termes, il est préférable d'utiliser de nombreuses interfaces spécifiques à des tâches plutôt que d'utiliser une seule interface à usage général.
L'exemple ci-dessous montre l'utilisation d'une interface à usage général.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } public void saveToFiles() { // code to save invoice as a file. } }
L'utilisation d'une interface généraliste comme MultifonctionPrinter nous oblige à implémenter des méthodes inutiles, ce qui est considéré comme une mauvaise pratique. Explorons comment nous pouvons appliquer le principe de ségrégation d'interface à ce scénario.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } } public class FileManager { public void saveToFiles(Invoice invoice) { // code to save invoice as a file. } }
public class Shape { private String shapeType; private double radius; private double length; private double width; public Shape(String shapeType, double radius, double length, double width) { this.shapeType = shapeType; this.radius = radius; this.length = length; this.width = width; } public double area() { if (shapeType.equals("circle")) { return Math.PI * (radius * radius); } else if (shapeType.equals("rectangle")) { return length * width; } else { throw new IllegalArgumentException("Unknown shape type"); } } } // Usage public class Main { public static void main(String[] args) { Shape circle = new Shape("circle", 5, 0, 0); Shape rectangle = new Shape("rectangle", 0, 4, 6); System.out.println(circle.area()); System.out.println(rectangle.area()); } }
En appliquant le FAI, nous l'avons divisé en interfaces plus petites et spécifiques à des rôles — comme une imprimante, un scanner et un fax. Cela permet à chaque classe (par exemple BasicPrinter, AdvancedPrinter ou FaxMachine) d'implémenter uniquement les fonctionnalités pertinentes, favorisant la modularité et réduisant les dépendances inutiles.
Le principe d'inversion de dépendance est le principe final de SOLID. Qui a également été introduit par Robert C. Martin. Cela favorise un code faiblement couplé.
DIP indique quelques points :
En termes simples, au lieu d'une classe dépendant directement d'autres classes spécifiques (implémentations concrètes), elle devrait dépendre d'interfaces ou classes abstraites. Cela rend le code plus flexible et plus facile à maintenir, car vous pouvez échanger les implémentations sans modifier la classe dépendante.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } public void saveToFiles() { // code to save invoice as a file. } }
Comme le montre l'exemple ci-dessus, la classe Computer dépend directement de la classe Keyboard.
public class Invoice { private Long InvoiceNo; public void generateInvoice() { // code to generate Invoice. } } public class FileManager { public void saveToFiles(Invoice invoice) { // code to save invoice as a file. } }
Maintenant, l'ordinateur dépend de l'interface InputDevice, et non d'un clavier spécifique. Cela facilite le passage à un autre périphérique d'entrée, comme un clavier sans fil, sans modifier la classe Computer.
En conclusion, les principes SOLID : responsabilité unique, ouvert-fermé, substitution de Liskov, ségrégation d'interface et inversion de dépendance fournissent des lignes directrices essentielles pour écrire du code propre, maintenable et évolutif dans la programmation orientée objet.
En adhérant à ces principes, les développeurs peuvent créer des systèmes plus faciles à comprendre, à modifier et à étendre, conduisant finalement à des logiciels de meilleure qualité et à des processus de développement plus efficaces.
Merci d’avoir lu cet article ! J'espère que vous avez maintenant une solide compréhension des principes SOLID et de la manière dont vous pouvez les appliquer pour améliorer vos projets.
Suivez-moi sur :
—Sadisha Nimsara
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!