Exercices à propos de l'OCP
Question 1
Résumez dans vos mots ce qu'est l'Open Closed Principle.
☑️ Solution
Ouvert pour l'extension, c'est-à-dire que le code doit être flexible pour répondre aux nouveaux besoins. Fermé pour les modifications, ce qui veut dire qu'il n'y a pas de modification à apporter au code présent pour répondre aux nouveaux besoins.
Question 2
Quand l'OCP n'est pas respecté, nommez un autre principe SOLID qui peut ne pas être respecté?
☑️ Solution
Exemple: Le SRP peut être violé lorsque l'OCP n'est pas respecté. En effet, le SRP stipule entre autres que la classe ne doit répondre qu'à un seul client et ne doit avoir qu'une seule responsabilité, ce qui peut ne pas être le cas lorsque l'OCP n'est pas respecté. Ce qui se produit souvent, c'est qu'il faut ajouter du code et de plus en plus il y a un risque de diverger de la responsabilité initiale.
D'autres principes peuvent également ne pas être respectés (voir série d'exercices sur LSP).
Question 3
Pourquoi, dans certains cas, peut-il être acceptable de ne pas respecter totalement ou partiellement l'OCP?
☑️ Solution
Comme vu dans les exercices sur l'abstraction, une mauvaise abstraction est coûteuse. Dans le cas où nous ne sommes pas certains de l'abstraction qu'il faut faire, il est préférable de (temporairement) ne pas respecter l'OCP plutôt que de faire une mauvaise abstraction. De plus, si le coût de changement est le même à l'exécuter maintenant vs plus tard (exemple si cela demandera de changer une seule place facile à identifier, pas trop de problème vs plusieurs emplacements différents et non liés un peu partout dans le code), que le risque est minime et s'il n'y a pas de duplication, alors il peut être préférable de ne pas respecter l'OCP et d'attendre de voir comment les choses évoluent.
Question 4
Donnez un exemple de "smell" qui peut indiquer que l'OCP n'est peut-être pas respecté?
☑️ Solution
Présence de if ou switch case. Si pour répondre à une nouvelle fonctionnalité, un if doit être ajouté, l'OCP n'est probablement pas respecté. Également un new sur une entité.
Question 5
Indiquez pourquoi le code suivant respecte l'OCP et pourquoi il ne le respecte pas.
public class Vehicle {
public void startVehicle() {
...
}
}
public class Car extends Vehicle {
@Override
public void startVehicle() {
super.startVehicle();
}
}
public class Truck extends Vehicle {
@Override
public void startVehicle() {
super.startVehicle();
}
}
public class GasStation {
public void refillVehicle(Vehicle vehicle) {
if(vehicle instanceof Car) {
...
} else {
...
}
}
}
☑️ Solution
Respect de l'OCP: Le design est flexible et l'ajout d'un nouveau type de véhicule pourra être fait simplement sans ajouter de modifications au code existant.
Non respect de l'OCP: dans la classe GasStation, l'ajout d'un nouveau type peut amener des modifications à la méthode
refillVehicle.
Question 6
Trouvez dans tout ce que l'on a vu à date dans le cours, les exercices et votre projet des cas de violation de l'OCP.