Joshua Kerievsky: Refactoring to Patterns Addison Wesley Signature Series, Software development 15

Joshua Kerievsky: Refactoring to Patterns
Addison Wesley Signature Series,
Software development 15 th annual productivity award
1
Creation
1.1 Replace (one class) Constructors with intention-revealing Creation Methods that return
object instances (p. 66)
Constructor on a class make it hard to decide which constructor to call during development.
1.2 Move creation Knowledge into a single Factory class (p. 68)
Data and code used to instantiate a class is sprawled across numerous classes.
1.3 Encapsulate classes with Factory, make their constructors non public and let clients create
instances of them using a Factory (p. 80)
Clients directly instantiate classes that reside in one package and implement a common
interface.
1.4 Introduce Polymorphic Creation with Factory Method (p.88)
Make a single superclass version of the method that calls a Factory Method to handle the
instantiation
Classes in a hierarchy implement a method similarly, except for an object creation step.
1.5 Encapsulate Composite with Builder
Simplify the build by letting a Builder handle the details (p.96)
Building a Composite is repetitive, complicated, or error-prone.
Builder (Gamma et al.: Design Patterns)
1.6 Inline Singletone
Move the Singleton’s features to a class that stores and provides Access to the object.
Delete the Singleton (p.114)
Code needs Access to an object but doesn’t need a global point of Access to it.
(Singletonitis, Singleton abusers)
2
Simplification
2.1 Compose Method
Transform the logic into a small number of intention-revealing steps at the same level of
detail (p. 123)
You can’t rapidly understand a method’s logic.
2.2 Replace Conditional Logic with Strategy
Create Strategy for each variant and make the method delegate the calculation to
a Strategy instance (p.129)
2.3 Move the embellishment code to a Decorator
Place each embellishment in its own class and let that class wrap the type of object it
needs to embellish (pp. 144, 145, 147)
Decorator (Gamma et al.: Design Patterns)
2.4 Replace State-Altering Conditionals with State (p. 166)
Replace the conditionals that handle specific states and transition between them
2.5 Replace your implicit form of a tree structure
(using primitive representation, such as a String) with a Composite (p. 178, p.189?)
2.6 Replace Conditional Dispatcher with Command
Create a Command for each action. Store the Commands in a collection to fetch and
execute them (p. 191)
Conditional logic is used to dispatch requests and execute actions.
3
Generalization
3.1 Form Template Method
Generalize the methods by extracting their steps into methods with identical structures,
then pull up the generalized methods to form a Template Method (p. 205)
Two methods in subclasses perform similar steps in the same order, yet the steps are different.
(Same steps in different order?)
3.2 Extract Composite
Extract the superclass that implements the Composite (p. 214)
Subclasses in a hierarchy implement the same Composite.
3.3 Replace One/Many Distinction with Composite to produce one piece of code
capable of handling single or multiple objects (p. 224)
A class processes single and multiple objects using separate pieces of code.
3.4 Replace Hard-Coded Notification with Observer (p. 236)
3.5 Unify Interfaces with Adapter (p. 247)
Clients interact with two classes, one of which has a preferred interface.
Adapter (Gamma et al.: Design Patterns)
3.6 Extract Adapter (p.258)
3.7 Replace Implicit Language with Interpreter (p. 269)
4
Protection
4.1 Replace Type Code with Class
Constrain the assignments and equality comparisons (p. 286)
4.2 Limit Instantiation with Singleton (p. 296)
Code creates multiple instances of an object, and that uses too much memory or slows system
performance.
4.3 Replace the null logic with a Null Object, an object that provides the appropriate null
behavior (pp. 301, 303)
5
Accumulation
5.1 Move Accumulation (single bulky method that accumulates information to a local
variable) to Collecting Parameter (Kent Beck: Smalltalk Best Practice Patterns) that gets
passed to extracted methods (p. 313)
5.2 Move Accumulation to Visitor that can visit each class to accumulate the information
(pp. 320, 321, 322)
Visitor (Gamma et al.: Design Patterns)
6
Utilities
6.1 Chain the Constructors that contain duplicate code together to obtain the least amount of
duplicated code (p. 340)
6.2 Unify Interfaces
Find all public methods on the subclass that are missing on the superclass/interface. Add
copies of these missing methods to the superclass, altering each one to perform null
behavior (p.343)
6.3 Extract Parameter (p. 346)