一.什么是重構(gòu)?
A series of small steps, each of which changes the program’s internal structure without changing its external behavior。
重構(gòu)是一系列的小部驟,每一步只修改程序的內(nèi)部結(jié)構(gòu),但是不改變它的外部行為.
二.為什么要重構(gòu)
- To improve the software design
- 為了提高軟件設計
-Combat's "it rot"
抵抗代碼的腐化
-Makes the program easier to change
使程序更容易修改
- To make the software easier to understand
- 使軟件更容易理解
-Write for people, not the compiler
程序是寫給人看的,不是給編譯器看的.
-Understand unfamiliar code
理解不熟悉的代碼
- To help find bugs
- 幫助找到bug
-Refactor while debugging to clarify the code
在為了理清代碼而DEBUG時,進行重構(gòu).
三.我們應該在什么時候重構(gòu)?
- To add new functionality
- 添加新的功能時
-Refactor existing code until you understand it
重構(gòu)現(xiàn)有的代碼直到你理解它們
-Refactor the design to make it easy to add
重構(gòu)設計使它容易添加新的功能
- To find bugs
- 在發(fā)現(xiàn)bug時
-Refactor to understand the code
重構(gòu)直到你理解代碼
-Rmmediate effect of code review
-Allows for higher level suggestions
Don’t set aside time for refactoring,include it in your normal activities
在日常活動中進行重構(gòu),而不是另外找時間去重構(gòu).
四.最后的思想
-
The one benefit of objects is that they make it easier to change.
-
有一個好處就是使得對象更容易修改.
-
Refactoring allows you to improve the design after the code is written
-
重構(gòu)允許你在代碼已經(jīng)寫完后改進自己的設計.
-
Up front design is still important,but not so critical
-
事先的設計仍然是很重要的,但是并不那么關(guān)鍵了.
五.例子中用到的的重構(gòu)條目:
Find temp with a single assignment
Extract Right Hand Side of assignment
Replace all references of temp with new method
Remove declaration and assignment of temp
Compile and test
Create method named after intention of code
Copy extracted code
Look for local variables and parameters
Turn into parameter
Turn into return value
Declare within method
Compile
Replace code fragment with call to new method
Compile and test
Declare method in target class
Copy and fit code
Set up a reference from the source object to the target
Turn the original method into a delegating method
-amountOf(Rental each) {return each.charge()}
-Check for overriding methods
Compile and test
Find all users of the method
-Adjust them to call method on target
Remove original method
Compile and test
Create a new state class for the type code
Add subclasses of the state object, one for each type code
Create an abstract query in the superclass to return the type code. Override in subclasses to return correct type code
Compile
Create field in old class for the state object
Change the type code query to delegate to the state object
Change the type code setting methods to assign an instance of the subclass
Compile and test
Move switch to superclass of inheritance structure
Copy one leg of case statement into subclass
Compile and test
Repeat for all other legs
Replace case statement with abstract method
Take two methods with similar overall structure but varying pieces
Use subclasses of current class, or create a strategy and move the methods to the strategy
At each point of variation extract methods from each source with the the same signature but different body
Declare signature of extracted method in superclass and place varying bodies in subclasses
When all points of variation have been removed,move one source method to superclass and remove the other
六.例子中提到的模式:
策略模式
模版方法模式
狀態(tài)模式