重構 - 改善既有程式的設計 - Duplicated Code
April 15, 2020這篇文章討論《重構 - 改善既有程式的設計》裡的3.1 - Duplicated Code
圖片以及程式碼來源自重構 - 改善既有程式的設計
重複的程式碼
就是重複的程式碼 這是比Alternative Classes with Different Interfaces更通用的情況
解法 - 重複的程式碼在同一個類別的情況
Extract Method
解法 - 重複的程式碼是發生在相同level的兩個不同subclass
Pull Up Field
就是把欄位提到superClass
Pull Up Method
就是把方法提到superClass
Pull Up Constructor
就是把會重複使用的建構子放到superClass
class Manager extends Employee {
public Manager(String name, String id, int grade) {
this.name = name;
this.id = id;
this.grade = grade;
}
}
變成
class Manager extends Employee {
public Manager(String name, String id, int grade) {
super(name, id);
this.grade = grade;
}
}
Form Template Method
兩個subClass有相似的演算法結構 就用Template method
解法 - 重複的程式碼是發生在不同的類別
Extract SuperClass
那就可以考慮把相同的部分提煉出一個共同的SuperClass 達到Code reuse
Extract Class
如果無法繼承 就考慮復合
解法 - 一般情況
Consolidate Conditional Expression
把相同結果的if-condition合併
double disabilityAmount() {
if (seniority < 2) {
return 0;
}
if (monthsDisabled > 12) {
return 0;
}
if (isPartTime) {
return 0;
}
}
變成
double disabilityAmount() {
if (isNotEligibleForDisability()) {
return 0;
}
}
boolean isNotEligibleForDisability() {
return seniority < 2 || seniority >12 || isPartTime;
}
Consolidate Duplicate Conditional Fragments
合併重複的條件片段
if (isSpecialDeal()) {
total = price * 0.95;
send();
}
else {
total = price * 0.98;
send();
}
變這樣
if (isSpecialDeal()) {
total = price * 0.95;
}
else {
total = price * 0.98;
}
send();