refacforing

重構 - 改善既有程式的設計 - Duplicated Code

這篇文章討論《重構 - 改善既有程式的設計》裡的3.1 - Duplicated Code

圖片以及程式碼來源自重構 - 改善既有程式的設計

重複的程式碼

就是重複的程式碼 這是比Alternative Classes with Different Interfaces更通用的情況

解法 - 重複的程式碼在同一個類別的情況

Extract Method

解法 - 重複的程式碼是發生在相同level的兩個不同subclass

Pull Up Field

Alt text

就是把欄位提到superClass

Pull Up Method

Alt text

就是把方法提到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();