Conception Object - OCP : Open Close Principle
Transcription
Conception Object - OCP : Open Close Principle
. Conception Object OCP : Open Close Principle . Alain Plantec UBO 13 novembre 2012 Alain Plantec (UBO) Conception Object 13 novembre 2012 1/1 Principes de base de la conception Le principe d’ouverture-fermeture Problème de l’évolution du code Logiciel vivant → revue continuelle de la mise en œuvre. Une modification à la fois. Une modification implique : revue complète et tests ; réinstallation chez les utilisateurs, remise en cause du code des utilisateurs (ajout de paramètre, de variable d’instance...) → Opérations couteuses et risquées. Alain Plantec (UBO) Conception Object 13 novembre 2012 2/1 Principes de base de la conception Le principe d’ouverture-fermeture Ouverture-Fermeture Le principe d’Ouverture-Fermeture (ou OCP pour Open-Closed principle) a été bien décrit par Bertrand Meyer. . Ennoncé . Un module doit parvenir à être ouvert en extension et fermé en modification. . Ouvert en extension : on peut enrichir la structure de données ou ajouter des services. Fermé en modification : dès qu’un module est utilisé par d’autre, les services existants doivent être stables. Alain Plantec (UBO) Conception Object 13 novembre 2012 3/1 1 2 3 4 5 6 7 8 9 Principes de base de la conception Le principe d’ouverture-fermeture Exemple class Printer { String device ; Printer (String target) { this.target = target } void printDoc (Document d) { if (device.equals(”printer”)) { printOnPrinter (d) ; } else { printOnScreen (d) ; } } void printOnPrinter (Document d) { ... } void printOnScreen (Document d) { ... } } Alain Plantec (UBO) Conception Object 13 novembre 2012 4/1 1 2 3 4 5 6 7 Principes de base de la conception Le principe d’ouverture-fermeture Autre exemple class Agenda { ArrayList<Elem> elements ; ... ArrayList<Elem> recByDate(String d) { ... } ArrayList<Elem> recByName(String d) { ... } ... } Problème (Java) : on veut ajouter une recherche avec des expression régulières sur le nom ou une autre sur la description ... Alain Plantec (UBO) Conception Object 13 novembre 2012 5/1 1 2 3 4 5 6 7 8 Principes de base de la conception Le principe d’ouverture-fermeture Autre exemple class Item { } class ItemA extends Item { void doitForA () ; } class ItemB extends Item { void doitForB () ; } 9 class ItemList { ArrayList<Item> items ; doit () { for (int i = 0 ; i < items.size() ; i++) { Item curr = items.get(i) ; if (curr instanceof ItemA) { Alain Plantec (UBO) Conception ((ItemA)curr).doitForA() ; Object 13 novembre 2012 6/1 Principes de base de la conception Le principe d’ouverture-fermeture Comment respecter l’OCP ? Techniques de base de l’objet : Rendre privés tous les attributs. Seuls sont visibles (public), les méthodes qui implémentent les services. Pas de globales. Rendre local la gestion des variables (énumérés...), des flags Méthodes abstraites pour coder ce qui est susceptible de changer. Ne pas interroger le type, pas de RTTI (proscrire instanceof ou isKindOf : ) Alain Plantec (UBO) Conception Object 13 novembre 2012 7/1 Principes de base de la conception Le principe d’ouverture-fermeture Comment respecter l’OCP ? Changer la conception : Utiliser des classes abstraites. Privilégier l’association à l’héritage. Appliquer des patrons de conception : Visiteur, Stratégie ... Le terrain de chasse : dans le code, les alternatives, les flags, les variables globales Alain Plantec (UBO) Conception Object 13 novembre 2012 8/1