MI3/GL Cours de Génie Logiciel Programmation Orientée Objet (Avancée) Daniel Le Berre dans une classe CRIL-CNRS FRE 2499, Université d Artois, Lens, FRANCE {leberre@cril.univ-artois.fr 2 décembre 2004 MI3GL 2004/2005 1 MI3GL 2004/2005 2 : définition dans une classe 1 DOD = Department of Defense http://www.linux-france.org/article/these/cathedrale-bazar/ cathedrale-bazar_monoblock.html http://opensource.org/halloween/ http://www.linux-france.org/article/these/magic-cauldron/ magic-cauldron-fr_monoblock.html MI3GL 2004/2005 3 Changer la structure du code sans changer son comportement Utilisation de tests unitaires pour le vérifier Utilisation de mauvaises odeurs dans le code pour détecter les parties à changer Popularisé par Martin Fowler [4] Beaucoup d outils de développement (dont Eclipse) facilitent le refactoring. Plus d infos sur http://www.refactoring.com MI3GL 2004/2005 4 Extract Method 1/2 Extract Method 2/2 Un ensemble d instructions peuvent être groupées. Remplacer ces instructions par une méthode dont le nom explique son rôle. void printowing () { printbanner (); //print details System. out. println ( name: + name ); System. out. println ( amount + getoutstanding ()); void printowing () { printbanner (); printdetails (getoutstanding ()); void printdetails (double outstanding ) { System. out. println ( name: + name ); System. out. println ( amount + outstanding ); MI3GL 2004/2005 5 MI3GL 2004/2005 6 Rename Method Rename Method Le nom d une méthode ne révèle pas son rôle. Le nom d une méthode ne révèle pas son rôle. Changer le nom de la méthode. Changer le nom de la méthode. MI3GL 2004/2005 7 MI3GL 2004/2005 8
Introduce Assertion 1/2 Introduce Assertion 2/2 Unepartieducodefaitdessuppositionsàproposdel état du programme. Rendre ces suppositions explicites en utilisant une assertion. double getexpenselimit () { // should have either expense limit or // a primary project return ( expenselimit!= NULL EXPENSE )? expenselimit : primaryproject. getmemberexpenselimit (); double getexpenselimit () { assert ( expenselimit!= NULL EXPENSE primaryproject!= null ); return ( expenselimit!= NULL EXPENSE )? expenselimit : primaryproject. getmemberexpenselimit (); MI3GL 2004/2005 9 MI3GL 2004/2005 10 Replace Temp with query 1/2 Replace Temp with query 2/2 Le code utilise une variable temporaire pour connaître le résultat d une expression. Remplacer l expression par une méthode. Remplacer toutes les références à la variable temporaire par la méthode. La nouvelle méthode peut être utilisée dans d autres méthodes. double baseprice = quantity itemprice ; if ( baseprice > 1000) return baseprice 0.95; else return baseprice 0.98; if ( baseprice() > 1000) return baseprice () 0.95; else return baseprice () 0.98;... double baseprice () { return quantity itemprice ; MI3GL 2004/2005 11 MI3GL 2004/2005 12 Introduce Parameter Object Introduce Parameter Object Un groupe de paramètres vont naturellement ensemble. Un groupe de paramètres vont naturellement ensemble. Les remplacer par un objet. Les remplacer par un objet. MI3GL 2004/2005 13 MI3GL 2004/2005 14 Preserve whole Object Plusieurs valeurs sont demandées àunobjetetpassées comme paramètres d une méthode. Passer directement l objet en paramètre. int low = daystemprange().getlow(); int high = daystemprange().gethigh(); withinplan = plan. withinrange(low, high ); withinplan = plan.withinrange(daystemprange()); Replace Method with Method Object 1/2 Il existe une longue méthode qui utilise des variables locales telles que l utilisation de Extract Method est impossible. Déplacer la méthode dans son propre objet de telle sorte que les variables locales deviennent ses attributs. Il est alors possible de décomposer la méthode en plusieurs méthodes sur le même objet. class Order... double price () { double primarybaseprice ; double secondarybaseprice ; double tertiarybaseprice ; // long computation ;... MI3GL 2004/2005 15 MI3GL 2004/2005 16
Replace Method with Method Object 2/2 Replace Parameter with Method Un objet appelle une méthode, et passe le résultat en paramètre d une autre méthode. L autre méthode peut aussi appeler cette méthode. Enlever le paramètre et laisser le seconde méthode appeler la première. int baseprice = quantity itemprice ; discountlevel = getdiscountlevel (); double finalprice = discountedprice ( baseprice, discountlevel ); int baseprice = quantity itemprice ; double finalprice = discountedprice ( baseprice ); MI3GL 2004/2005 17 MI3GL 2004/2005 18 Pull Up Field Pull Up Field Deux sous classes ont le même attribut. Deux sous classes ont le même attribut. Déplacer l attribut dans la superclasse. Déplacer l attribut dans la superclasse. MI3GL 2004/2005 19 MI3GL 2004/2005 20 Form template method 1/3 Form template method 2/3 Il existe deux méthodes dans des sous classes qui effectuent des tâches similaires dans le même ordre, mais ces tâches sont différentes. Remplacer ces tâches par des méthodes ayant la même signature, telles que les méthodes originales deviennent identiques. Ensuite, vous pouvez les faire remonter. MI3GL 2004/2005 21 MI3GL 2004/2005 22 Form template method 3/3 MI3GL 2004/2005 23 Substitute Algorithm 1/2 Vous voulez remplacer un algorithme par un autre. Remplacez le corps de la méthode par le nouvel algorithme. String foundperson( String [] people){ for ( int i = 0; i < people. length ; i++) { if ( people [ i ]. equals ( Don )){ return Don ; if ( people [ i ]. equals ( John )){ return John ; if ( people [ i ]. equals ( Kent )){ return Kent ; return ; MI3GL 2004/2005 24
Substitute Algorithm 2/2 Extract class String foundperson( String [] people){ List candidates = Arrays. aslist ( new String [] { Don, John, Kent ); for ( int i=0; i<people. length ; i++) if ( candidates. contains(people [ i ])) return people [ i ]; return ; Uneclassefaitletravailquidevraitêtre fait par deux. Declarer une nouvelle classe et déplacer les membres appropriés vers la nouvelle classe. MI3GL 2004/2005 25 MI3GL 2004/2005 26 Extract class Extract subclass Uneclassefaitletravailquidevraitêtre fait par deux. Declarer une nouvelle classe et déplacer les membres appropriés vers la nouvelle classe. Une classe a des services utilisés uniquement par certaines instances. Créer une sous classe pour ces services. MI3GL 2004/2005 27 MI3GL 2004/2005 28 Extract subclass Une classe a des services utilisés uniquement par certaines instances. Créer une sous classe pour ces services. Collapse Hierarchy Une classe et une sous classe ne sont pas très différentes. Les fusionner MI3GL 2004/2005 29 MI3GL 2004/2005 30 Collapse Hierarchy Une classe et une sous classe ne sont pas très différentes. Inline class Les fusionner Uneclassenefaitpasgrandchose. Déplacer toutes ses responsabilités dans une autre classe et l enlever. MI3GL 2004/2005 31 MI3GL 2004/2005 32
Inline class Remove parameter Uneclassenefaitpasgrandchose. Déplacer toutes ses responsabilités dans une autre classe et l enlever. Un paramètre n est plus utilisé dans une méthode. Enlever ce paramètre. MI3GL 2004/2005 33 MI3GL 2004/2005 34 Remove parameter Un paramètre n est plus utilisé dans une méthode. Enlever ce paramètre. MI3GL 2004/2005 35 Kent Beck. extreme Programming explained, Embrace Change. Addison Wesley, 2000. B. Boehm. Software Engineering Project Management, chapter A spiral model of software development and enhancement. 1987. Bernd Bruegge and Allen H. Dutoit. Object Oriented Software Engineering: Conquering Complex and Changing Systems. Prentice Hall, 2000. ISBN: 0-13-017452-1. : Improving the Design of Existing Code. Object Technology Series. Addison Wesley, 2000. Indispensable! MI3GL 2004/2005 36 Patterns of Enterprise Application Architecture. The Addison-Wesley Signature Series. Addison Wesley, 2003. UML distilled: A brief Guide to the Standard Object Modelling Language. Object Technology series. Addison Wesley, 3rd edition, 2004. Indispensable! Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns, Elements of Reusable Object-Oriented Software. Addison Wesley, 1995. Aposséder absolument! Marie-Claude Gaudel, Bruno Marre, Françoise Schienger, and Gilles Bernot. MI3GL 2004/2005 37 Précis de Génie Logiciel. Enseignement de l Informatique. Masson, 1996. ISBN : 2-225-85189-1. Andrew Hunt and David Thomas. The Pragmatic Programmer. Addison Wesley, 2000. Un livre interessant (mais en anglais) pour tous les programmeurs. Robert C. Martin. Agile Software Development: Principles, Patterns and Practices. Prentice Hall, 2003. Utile. Robert C. Martin. UML for Java Programmers. Prentice Hall, 2003. MI3GL 2004/2005 38 Bertrand Meyer. Conception et programmation orientées objet. Eyrolles, 1997. Indispensable pour tout programmeur dans un langage objet, même si les exemples donnés sont plutôt en Eiffel. P. G. Neumann. Computer-Related Risks. Reading. Addison-Wesley, MA, 1995. W. W. Royse. Managing the development of large software systems. In IEEE Computer Society, editor, Tutorial: Software Engineering Project Management, pages 118 127, Washington, DC, 1970. Jack Shirazi. Java Performance Tuning, 2nd edition. O Reilly, 2003. MI3GL 2004/2005 39