Save 37% off PRO during our Black Friday Sale! »

Perspectives on Automated Correction of Bad Smells

Perspectives on Automated Correction of Bad Smells

Keeping a software system conformant with a desired architecture and consistent with good design principles is a recurring task during the software evolution process. Deviations from good design principles can manifest in the form of bad smells: problems in the system’s structure that can negatively affect software quality factors. Many authors have worked in identifying bad smells and in removing them with refactorings: tools have been built to suggest refactorings; successful approaches to detect bad smells have been developed, etc. We present a comprehensive and historical review on this subject, in order to model the current state of the art and to identify the open challenges, current trends and research opportunities. We also propose a technique based on automated planning, aimed at taking one step forward in the automatic improvement of a system’s structure. This proposal will allow computing complex refactoring sequences which can be directed to the achievement of a certain objective, such as the correction of bad smells. Presented at IWPSE-EVOL 2009 (http://soft.vub.ac.be/iwpse-evol/2009_start).

7e6a5857a7eb4501c63ab00481ac3305?s=128

Javier Pérez

August 24, 2009
Tweet

Transcript

  1. Perspectives on Automated Correction of Bad Smells Javier Pérez, Yania

    Crespo {jperez, yania}@infor.uva.es Universidad de Valladolid IWPSE-EVOL 2009 Aug 24-25 2009, Amsterdam Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 1 / 34
  2. Introduction Introduction Javier Pérez (UVa) Perspectives on Bad Smell Correction

    24-25 Aug 2009 2 / 34
  3. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  4. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  5. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  6. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  7. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  8. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  9. Introduction Refactorings Refactorings Refactorings are structural transformations that can be

    applied to (originally) the source code of a software system to perform design changes (to improve it) without modifying its observable behaviour. William Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Department of Computer Science, University of Illinois at Urbana-Champaign, 1992. behaviour preserving invariants preconditions low-level refactorings big refactorings Martin Fowler, et al. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley, 1999. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 3 / 34
  10. Introduction Examples of Refactorings Encapsulate Field Move Method, Field Rename

    Class, Field, Method Extract Method Replace Conditional with Polymorphism Pull Up Method, Extract Superclass . . . Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 4 / 34
  11. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  12. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  13. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  14. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  15. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  16. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  17. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  18. Introduction Bad Smells Bad Smells Problems encountered in the software’s

    structure (code or design), that can be detected statically, that do not produce compile or run-time errors, but negatively affect software quality factors. In fact, this negative effect on quality factors could lead to real compile and run-time errors in the future. Kent Beck and Martin Fowler. Bad Smells in Code, chapter 3. In Refactoring: Improving the Design of Existing Code. 1999. Referred as “defects”, “flaws”, “disharmonies”, “antipatterns”, . . . by other authors. Bad smells are corrected with refactorings Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 5 / 34
  19. Introduction Examples of Bad Smells Duplicated Code Temporary Field Data

    Class, Feature Envy Large Class, Large Method Refused Bequest . . . Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 6 / 34
  20. Introduction Example of Data Class DataClass name value getName() setName(n)

    getValue() setValue(v) Data Classes “These are classes that have fields, getting and setting methods for the fields, and nothing else.” Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 7 / 34
  21. Introduction Bad Smell Correction Correction of bad smells has become

    a popular way to deal with the decay of the software’s structure that occurs during the evolution of a system. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 8 / 34
  22. Historical Analysis Historical Analysis Javier Pérez (UVa) Perspectives on Bad

    Smell Correction 24-25 Aug 2009 9 / 34
  23. Historical Analysis Brief History of Bad Smell Management Detection Correction

    Heuristics for Good OO Design (1996 Riel) "Object-Oriented Design Heurstics" Bad Smells Catalogs (1999 Fowler) "Refactoring; Improving the ..." Correction Catalogs (2004 Kerievsky) "Refactoring to Patterns" Precise Smell Specifications (2006 Lanza, Marinescu) "OO Metrics ...'' Precise Correction Specifications (2008 Trifu) "Towards Automated Restructuring ..." Automated Smell Detection (2008 Moha) "DECOR: Détection et Correction ..." Automated Correction ??? Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 10 / 34
  24. Historical Analysis On Detection On Detection Javier Pérez (UVa) Perspectives

    on Bad Smell Correction 24-25 Aug 2009 11 / 34
  25. Historical Analysis On Detection Bad Smell Detection: Fowler 1999 (Data

    Class) Data Classes “These are classes that have fields, getting and setting methods for the fields, and nothing else.” Textual description Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 12 / 34
  26. Historical Analysis On Detection Bad Smell Detection: Marinescu 2006 (God

    Class) Composition of metrics-based filters. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 13 / 34
  27. Historical Analysis On Detection Bad Smell Detection: Moha 2008 (Spaghetti

    Code) 1 RULE CARD:SpaghettiCode { 2 RULE:Inter0 { INTER Inter1 Inter2 }; 3 RULE:Inter1 { INTER LongMethod NoParameter }; 4 RULE:LongMethod { METRIC LOC METHOD VERY HIGH 10.0 }; 5 RULE:NoParameter { METRIC NMNOPARAM VERY HIGH 5.0 }; 6 RULE:Inter2 { INTER Inter3 Inter4 }; 7 RULE:Inter3 { INTER NoInheritance NoPolymorphism }; 8 RULE:NoInheritance { METRIC DIT 1 0.0 }; 9 RULE:NoPolymorphism { STRUCT NO POLYMORPHISM }; 10 RULE:Inter4 {INTER ProceduralName UseGlobalVariable }; 11 RULE:ProceduralName { LEXIC CLASS NAME (Make, Create, Exec...) }; 12 RULE:UseGlobalVariable { STRUCT USE GLOBAL VARIABLE }; 13 }; Rule Cards: DSL to specify bad smells to automate detection. Composition of structural, metrics-based, and lexical filters. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 14 / 34
  28. Historical Analysis On Detection Bad Smell Detection: Moha 2008 (Spaghetti

    Code) 1 RULE CARD:SpaghettiCode { 2 RULE:Inter0 { INTER Inter1 Inter2 }; 3 RULE:Inter1 { INTER LongMethod NoParameter }; 4 RULE:LongMethod { METRIC LOC METHOD VERY HIGH 10.0 }; 5 RULE:NoParameter { METRIC NMNOPARAM VERY HIGH 5.0 }; 6 RULE:Inter2 { INTER Inter3 Inter4 }; 7 RULE:Inter3 { INTER NoInheritance NoPolymorphism }; 8 RULE:NoInheritance { METRIC DIT 1 0.0 }; 9 RULE:NoPolymorphism { STRUCT NO POLYMORPHISM }; 10 RULE:Inter4 {INTER ProceduralName UseGlobalVariable }; 11 RULE:ProceduralName { LEXIC CLASS NAME (Make, Create, Exec...) }; 12 RULE:UseGlobalVariable { STRUCT USE GLOBAL VARIABLE }; 13 }; Rule Cards: DSL to specify bad smells to automate detection. Composition of structural, metrics-based, and lexical filters. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 14 / 34
  29. Historical Analysis On Detection Bad Smell Detection: Moha 2008 (Spaghetti

    Code) 1 RULE CARD:SpaghettiCode { 2 RULE:Inter0 { INTER Inter1 Inter2 }; 3 RULE:Inter1 { INTER LongMethod NoParameter }; 4 RULE:LongMethod { METRIC LOC METHOD VERY HIGH 10.0 }; 5 RULE:NoParameter { METRIC NMNOPARAM VERY HIGH 5.0 }; 6 RULE:Inter2 { INTER Inter3 Inter4 }; 7 RULE:Inter3 { INTER NoInheritance NoPolymorphism }; 8 RULE:NoInheritance { METRIC DIT 1 0.0 }; 9 RULE:NoPolymorphism { STRUCT NO POLYMORPHISM }; 10 RULE:Inter4 {INTER ProceduralName UseGlobalVariable }; 11 RULE:ProceduralName { LEXIC CLASS NAME (Make, Create, Exec...) }; 12 RULE:UseGlobalVariable { STRUCT USE GLOBAL VARIABLE }; 13 }; Rule Cards: DSL to specify bad smells to automate detection. Composition of structural, metrics-based, and lexical filters. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 14 / 34
  30. Historical Analysis On Detection Bad Smell Detection: Moha 2008 (Spaghetti

    Code) 1 RULE CARD:SpaghettiCode { 2 RULE:Inter0 { INTER Inter1 Inter2 }; 3 RULE:Inter1 { INTER LongMethod NoParameter }; 4 RULE:LongMethod { METRIC LOC METHOD VERY HIGH 10.0 }; 5 RULE:NoParameter { METRIC NMNOPARAM VERY HIGH 5.0 }; 6 RULE:Inter2 { INTER Inter3 Inter4 }; 7 RULE:Inter3 { INTER NoInheritance NoPolymorphism }; 8 RULE:NoInheritance { METRIC DIT 1 0.0 }; 9 RULE:NoPolymorphism { STRUCT NO POLYMORPHISM }; 10 RULE:Inter4 {INTER ProceduralName UseGlobalVariable }; 11 RULE:ProceduralName { LEXIC CLASS NAME (Make, Create, Exec...) }; 12 RULE:UseGlobalVariable { STRUCT USE GLOBAL VARIABLE }; 13 }; Rule Cards: DSL to specify bad smells to automate detection. Composition of structural, metrics-based, and lexical filters. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 14 / 34
  31. Historical Analysis On Correction On Correction Javier Pérez (UVa) Perspectives

    on Bad Smell Correction 24-25 Aug 2009 15 / 34
  32. Historical Analysis On Correction Bad Smell Correction: Fowler 1999 (Data

    Class) Data Classes In early stages these classes may have public fields. If so, you should immediately apply Encapsulate Field before anyone notices. If you have collection fields, check to see whether they are properly encapsulated and apply Encapsulate Collection if they aren’t. Use Remove Setting Method on any field that should not be changed. Look for where these getting and setting methods are used by other classes. Try to use Move Method to move behavior into the data class. If you can’t move a whole method, use Extract Method to create a method that can be moved. After a while you can start using Hide Method on the getters and setters. Textual and informal description. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 16 / 34
  33. Historical Analysis On Correction Bad Smell Correction: Kerievsky 2004 (Long

    Method) Long Method If a method is long because it contains numerous versions of an algorithm and conditional logic to choose which version to use at runtime, you can shrink the size of the method by applying Replace Conditional Logic with Strategy. Defines refactorings that involve introduction or removal of design patterns. “More structured” correction specifications for particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 17 / 34
  34. Historical Analysis On Correction Bad Smell Correction: Trifu 2004 (God

    Class) 2008 (Schizophrenic Class) strategy god_class{ interface{ Class godClass; List functionalityCollections; } List fc; int THRESHOLD = 0.7 int i = 0; foreach (fc in functionalityCollections) { i = i + 1 node move_or_extract (9) { branch { description("Move methods to satellite data classes."); quality{ favors(efficiency, complexity, understandability, modifiability); disfavors(legibility, resconsumption); } Class dc; // find the class that the current functionality collection is most coupled to // and coupling must be at least as strong as specified in the threshold find_data_class(fc, dc, THRESHOLD); // call sequence to move methods in current functionality collection to identified // class. If class is nil, no moves occur and next branch is tried. if (dc == nil) abort; move_methods_to_datacls(fc, dc); } branch { description("Move methods to new classes"); quality{ favors(understandability, modifiability); disfavors(complexity, legibility, resconsumption, efficiency); } // generate a name for the new class. Optionally, this could be entered by the user. String name = godClass.className + n2a(i); extract_to_class(fc, name); } } } } Algorithmic correction. Quality factors. Very particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 18 / 34
  35. Historical Analysis On Correction Bad Smell Correction: Trifu 2004 (God

    Class) 2008 (Schizophrenic Class) move_or_extract (9) { branch { description("Move methods to satellite data classes."); quality{ favors(efficiency, complexity, understandability, modifiability); disfavors(legibility, resconsumption); } Class dc; // find the class that the current functionality collection is most coupled to // and coupling must be at least as strong as specified in the threshold find_data_class(fc, dc, THRESHOLD); // call sequence to move methods in current functionality collection to identified // class. If class is nil, no moves occur and next branch is tried. if (dc == nil) abort; move_methods_to_datacls(fc, dc); } Algorithmic correction. Quality factors. Very particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 18 / 34
  36. Historical Analysis On Correction Bad Smell Correction: Trifu 2004 (God

    Class) 2008 (Schizophrenic Class) 1: Let O be the schizophrenic class 2: Check that we have an identity based decomposition of data in O, based on the iden- tities of the encapsulated abstractions. // An action oriented topology in the case of the encapsulated abstractions would require a complete redesign of the fragment, which is outside the scope of design flaws in general (see 6.1.1) 3: Encapsulate all attributes in O with public accessors // The public visibility is only temporary, in order to make moving functionality around easier 4: Identify all the abstractions Ai , that need to be separated and establish their future interfaces 5: Create empty classes that correspond to each of Ai 6: if O has subtypes // we assume that they contain valid specializations for one or more of the abstractions contained in O then 7: Establish those abstractions from Ai that are affected by each specialization of O 8: Create appropriate subtypes for the classes that correspond to these abstractions 9: end if Algorithmic correction. Quality factors. Very particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 18 / 34
  37. Historical Analysis On Correction Bad Smell Correction: Trifu 2004 (God

    Class) 2008 (Schizophrenic Class) 10: for all attributes ai in O do 11: Find the natural place for ai in one of the newly created classes, including helpers, based on the Ai determined before and apply “move field” [Fow99] 12: if ai is an array or collection then 13: Decide between keeping the structured type and having an association multiplic- ity of 1 to the host class, or increasing the association’s multiplicity and replacing the collection or array with only one of its elements. In the latter case, the class interface and the implementation of the facade need to be adapted accordingly 14: end if 15: end for Algorithmic correction. Quality factors. Very particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 18 / 34
  38. Historical Analysis On Correction Bad Smell Correction: Trifu 2004 (God

    Class) 2008 (Schizophrenic Class) 16: for all methods mi in O do 17: if mi can be unambiguously assigned to one of the new classes then 18: Apply “move method” [Fow99] to move mi ’s body to the respective class 19: if mi is specialized in one of O’s subclasses then 20: Apply “move method” [Fow99] to move the overriding method into the appro- priate specialization 21: end if 22: else 23: Apply “extract method” and “move method” [Fow99] to break up the original method, based on the attribute clusters that determine the encapsulated abstrac- tions, and reunite functionality with its associated data 24: if mi was previously specialized in one of O’s subclasses then 25: Apply “extract method” and “move method” [Fow99] to break up the original overriding method, based on the attribute clusters that determine specializa- tions of the encapsulated abstractions, and reunite functionality with its asso- ciated data 26: end if 27: end if Algorithmic correction. Quality factors. Very particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 18 / 34
  39. Historical Analysis On Correction Bad Smell Correction: Trifu 2004 (God

    Class) 2008 (Schizophrenic Class) 28: if mi had public visibility then 29: Implement “facade” [GHJV96] method in O, delegating to the appropriate ab- straction(s). 30: end if 31: end for 32: Create initialization methods in the facade O, or adapt its constructors to instantiate and wire together all newly defined classes and their specializations 33: Reduce data and accessor visibility as much as possible in all of the newly created classes Algorithmic correction. Quality factors. Very particular cases. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 18 / 34
  40. Historical Analysis On Correction Model view of bad smell correction

    Correction Strategy bad smell System Entity Algorithm Code Query Structural Lexical Apply Refactoring Precondition Transformation Behaviour-Preserving Transformation Introduce Pattern Remove Pattern Numerical Quality Factor Quality-Based Condition favoured disfavoured Metric change Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 19 / 34
  41. Historical Analysis On Correction Model view of bad smell correction

    Correction Strategy bad smell System Entity Algorithm Code Query Structural Lexical Apply Refactoring Precondition Transformation Behaviour-Preserving Transformation Introduce Pattern Remove Pattern Numerical Quality Factor Quality-Based Condition favoured disfavoured Metric change Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 19 / 34
  42. Historical Analysis On Correction Model view of bad smell correction

    Correction Strategy bad smell System Entity Algorithm Code Query Structural Lexical Apply Refactoring Precondition Transformation Behaviour-Preserving Transformation Introduce Pattern Remove Pattern Numerical Quality Factor Quality-Based Condition favoured disfavoured Metric change Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 19 / 34
  43. Historical Analysis On Correction Model view of bad smell correction

    Correction Strategy bad smell System Entity Algorithm Code Query Structural Lexical Apply Refactoring Precondition Transformation Behaviour-Preserving Transformation Introduce Pattern Remove Pattern Numerical Quality Factor Quality-Based Condition favoured disfavoured Metric change Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 19 / 34
  44. Historical Analysis On Correction Model view of bad smell correction

    Correction Strategy bad smell System Entity Algorithm Code Query Structural Lexical Apply Refactoring Precondition Transformation Behaviour-Preserving Transformation Introduce Pattern Remove Pattern Numerical Quality Factor Quality-Based Condition favoured disfavoured Metric change Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 19 / 34
  45. Historical Analysis On Correction Model view of bad smell correction

    Correction Strategy bad smell System Entity Algorithm Code Query Structural Lexical Apply Refactoring Precondition Transformation Behaviour-Preserving Transformation Introduce Pattern Remove Pattern Numerical Quality Factor Quality-Based Condition favoured disfavoured Metric change Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 19 / 34
  46. Historical Analysis On Correction Brief History of Bad Smell Management

    Detection Correction Heuristics for Good OO Design (1996 Riel) "Object-Oriented Design Heurstics" Bad Smells Catalogs (1999 Fowler) "Refactoring; Improving the ..." Correction Catalogs (2004 Kerievsky) "Refactoring to Patterns" Precise Smell Specifications (2006 Lanza, Marinescu) "OO Metrics ...'' Precise Correction Specifications (2008 Trifu) "Towards Automated Restructuring ..." Automated Smell Detection (2008 Moha) "DECOR: Détection et Correction ..." Automated Correction ??? Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 20 / 34
  47. Historical Analysis On Correction Brief History of Bad Smell Management

    Detection Correction Heuristics for Good OO Design (1996 Riel) "Object-Oriented Design Heurstics" Bad Smells Catalogs (1999 Fowler) "Refactoring; Improving the ..." Correction Catalogs (2004 Kerievsky) "Refactoring to Patterns" Precise Smell Specifications (2006 Lanza, Marinescu) "OO Metrics ...'' Precise Correction Specifications (2008 Trifu) "Towards Automated Restructuring ..." Automated Smell Detection (2008 Moha) "DECOR: Détection et Correction ..." Automated Correction ??? Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 20 / 34
  48. Historical Analysis On Correction Current Issues of Automated Correction 1

    Applicability and instantiation of the desired transformation The precondition may not hold when applying the transformation 2 Dependencies and conflicts between transformations One transformation can enable or disable another. 3 Parallel transformations in team development They may be difficult to merge 4 The heuristical nature of correction specifications Imprecise specifications that have to be instantiated for a precise system. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 21 / 34
  49. Historical Analysis On Correction Current Issues of Automated Correction 1

    Applicability and instantiation of the desired transformation The precondition may not hold when applying the transformation 2 Dependencies and conflicts between transformations One transformation can enable or disable another. 3 Parallel transformations in team development They may be difficult to merge 4 The heuristical nature of correction specifications Imprecise specifications that have to be instantiated for a precise system. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 21 / 34
  50. Historical Analysis On Correction Current Issues of Automated Correction 1

    Applicability and instantiation of the desired transformation The precondition may not hold when applying the transformation 2 Dependencies and conflicts between transformations One transformation can enable or disable another. 3 Parallel transformations in team development They may be difficult to merge 4 The heuristical nature of correction specifications Imprecise specifications that have to be instantiated for a precise system. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 21 / 34
  51. Historical Analysis On Correction Current Issues of Automated Correction 1

    Applicability and instantiation of the desired transformation The precondition may not hold when applying the transformation 2 Dependencies and conflicts between transformations One transformation can enable or disable another. 3 Parallel transformations in team development They may be difficult to merge 4 The heuristical nature of correction specifications Imprecise specifications that have to be instantiated for a precise system. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 21 / 34
  52. Our Proposal Our Proposal Javier Pérez (UVa) Perspectives on Bad

    Smell Correction 24-25 Aug 2009 22 / 34
  53. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  54. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  55. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  56. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  57. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  58. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  59. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  60. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  61. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  62. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  63. Our Proposal Refactoring Strategies & Refactoring Plans Refactoring Strategy Automation-prone

    specification of the steps to perform a sequence of behaviour preserving transformations, which are addressed to achieve a particular goal. Refactoring strategies are instantiated to refactoring plans. Refactoring Plan Specification of a refactoring sequence which matches a system redesign proposal, and that can be immediately executed to modify the system, without changing the system’s behaviour, in order to obtain that desirable system redesign. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 23 / 34
  64. Our Proposal Refactoring Strategies & Refactoring Plans Goal Refactoring Strategy

    Refactoring Plan instantiates Code Query Structural Lexical Numerical System Entitiy Quality-Based Condition Quality Factor favoured disfavoured Transformation Composed Simple Remove Replace Add AST Element Node Edge Behaviour-Preserving Transformation Precondition Refactoring Introduce Pattern Remove Pattern Remove Smell Apply Transformation Control Constructs Metric change composition depedency conflict arguments Bad Smell Correction Strategy Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 24 / 34
  65. Our Proposal Refactoring Strategies & Refactoring Plans Goal Refactoring Strategy

    Refactoring Plan instantiates Code Query Structural Lexical Numerical System Entitiy Quality-Based Condition Quality Factor favoured disfavoured Transformation Composed Simple Remove Replace Add AST Element Node Edge Behaviour-Preserving Transformation Precondition Refactoring Introduce Pattern Remove Pattern Remove Smell Apply Transformation Control Constructs Metric change composition depedency conflict arguments Bad Smell Correction Strategy Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 24 / 34
  66. Our Proposal Refactoring Strategies & Refactoring Plans Goal Refactoring Strategy

    Refactoring Plan instantiates Code Query Structural Lexical Numerical System Entitiy Quality-Based Condition Quality Factor favoured disfavoured Transformation Composed Simple Remove Replace Add AST Element Node Edge Behaviour-Preserving Transformation Precondition Refactoring Introduce Pattern Remove Pattern Remove Smell Apply Transformation Control Constructs Metric change composition depedency conflict arguments Bad Smell Correction Strategy Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 24 / 34
  67. Our Proposal Refactoring Strategies & Refactoring Plans Goal Refactoring Strategy

    Refactoring Plan instantiates Code Query Structural Lexical Numerical System Entitiy Quality-Based Condition Quality Factor favoured disfavoured Transformation Composed Simple Remove Replace Add AST Element Node Edge Behaviour-Preserving Transformation Precondition Refactoring Introduce Pattern Remove Pattern Remove Smell Apply Transformation Control Constructs Metric change composition depedency conflict arguments Bad Smell Correction Strategy Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 24 / 34
  68. Our Proposal Refactoring Strategies & Refactoring Plans Goal Refactoring Strategy

    Refactoring Plan instantiates Code Query Structural Lexical Numerical System Entitiy Quality-Based Condition Quality Factor favoured disfavoured Transformation Composed Simple Remove Replace Add AST Element Node Edge Behaviour-Preserving Transformation Precondition Refactoring Introduce Pattern Remove Pattern Remove Smell Apply Transformation Control Constructs Metric change composition depedency conflict arguments Bad Smell Correction Strategy Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 24 / 34
  69. Refactoring Planning Refactoring Planning Javier Pérez (UVa) Perspectives on Bad

    Smell Correction 24-25 Aug 2009 25 / 34
  70. Refactoring Planning Automated Planning Definition Automated planning is an artificial

    intelligence technique to generate sequences of actions that will achieve a certain goal when they are performed. Example: Getting apples and a book. The state of the world: at (grocery) AND not (have (apples)) Actions: buy (apples); moveTo (bookstore) Goals: have (book) AND have (apples) Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 26 / 34
  71. Refactoring Planning Classical Planning Operators (STRIPS) World’s state: list of

    terms Operators: definition: name + arguments precondition effect list (add): terms to add to the state effect list (deletes): terms to remove from the state Problem: initial state goal: list of terms General planning approach: chain operators by matching their effects and preconditions Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 27 / 34
  72. Refactoring Planning Smell Correction with HTN Planning World’s state: AST

    represented by first order logic formulas Operators: refactorings & refactoring’s substeps Tasks: refactorings strategies smell correction strategies Goals: Execute a smell correction strategy Planning Problem: Execute a particular smell correction strategy over a particular version of a system Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 28 / 34
  73. Refactoring Planning Refactoring Planning Basic transformations are specified in terms

    of preconditions and effects. Refactoring strategies are specified as additional knowledge to the planner (tasks). The user requests the correction of a bad smell or the application of a refactoring. The instantiation of the strategy is not hard-coded in an algorithm. The planner selects the applicable operators and their execution order. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 29 / 34
  74. Refactoring Planning Refactoring Planning Basic transformations are specified in terms

    of preconditions and effects. Refactoring strategies are specified as additional knowledge to the planner (tasks). The user requests the correction of a bad smell or the application of a refactoring. The instantiation of the strategy is not hard-coded in an algorithm. The planner selects the applicable operators and their execution order. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 29 / 34
  75. Refactoring Planning Refactoring Planning Basic transformations are specified in terms

    of preconditions and effects. Refactoring strategies are specified as additional knowledge to the planner (tasks). The user requests the correction of a bad smell or the application of a refactoring. The instantiation of the strategy is not hard-coded in an algorithm. The planner selects the applicable operators and their execution order. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 29 / 34
  76. Refactoring Planning Refactoring Planning Basic transformations are specified in terms

    of preconditions and effects. Refactoring strategies are specified as additional knowledge to the planner (tasks). The user requests the correction of a bad smell or the application of a refactoring. The instantiation of the strategy is not hard-coded in an algorithm. The planner selects the applicable operators and their execution order. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 29 / 34
  77. Refactoring Planning Refactoring Planning Basic transformations are specified in terms

    of preconditions and effects. Refactoring strategies are specified as additional knowledge to the planner (tasks). The user requests the correction of a bad smell or the application of a refactoring. The instantiation of the strategy is not hard-coded in an algorithm. The planner selects the applicable operators and their execution order. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 29 / 34
  78. Conclusions Conclusions Javier Pérez (UVa) Perspectives on Bad Smell Correction

    24-25 Aug 2009 30 / 34
  79. Conclusions Conclusions Bad Smell correction has evolved throug the development

    of more adequate specifications which have led to better automatisation of the activity. The activity has clearly manifested an empirically nature. The detection and correction knowledge is specified heuristically. Bad smell correction can keep being improved by working on specification and automation of the correction activity. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 31 / 34
  80. Conclusions Conclusions Bad Smell correction has evolved throug the development

    of more adequate specifications which have led to better automatisation of the activity. The activity has clearly manifested an empirically nature. The detection and correction knowledge is specified heuristically. Bad smell correction can keep being improved by working on specification and automation of the correction activity. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 31 / 34
  81. Conclusions Conclusions Bad Smell correction has evolved throug the development

    of more adequate specifications which have led to better automatisation of the activity. The activity has clearly manifested an empirically nature. The detection and correction knowledge is specified heuristically. Bad smell correction can keep being improved by working on specification and automation of the correction activity. Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 31 / 34
  82. Conclusions Expected Contributions Refactoring Plans and Refactoring Strategies as a

    way to write bad smell correction specifications Automated instantiation of refactoring plans by using HTN planning Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 32 / 34
  83. Conclusions Current Work Implementing a prototypical infrastructure Reusing existing tools

    Implementing refactoring strategies to apply refactorings to correct bad smells Choosing systems to experiment with Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 33 / 34
  84. Conclusions Perspectives on Automated Correction of Bad Smells Javier Pérez,

    Yania Crespo {jperez, yania}@infor.uva.es Universidad de Valladolid IWPSE-EVOL 2009 Aug 24-25 2009, Amsterdam Javier Pérez (UVa) Perspectives on Bad Smell Correction 24-25 Aug 2009 34 / 34