Temps estimé: 20 minutes
Exercices à propos de l'OCP
Question 1
Résumez dans vos mots ce qu'est le Open Closed Principle.
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é?
Exemple: Le SRP peut être violé lorsque l'OCP n'est pas respecté. En effet, car 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 est non 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 il peut être acceptable de ne pas respecter totalement ou partiellement l'OCP?
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é?
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
Indiquer 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 {
...
}
}
}
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 respecte 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.