一. if else表達式過於復雜
if ((condition1 && condition2 ) || ((condition2 || condition3) && condition4)) {
}
問題解決:分解條件表達式,分解成多個獨立的函數,為分解的新函進行良好的命名,從而更清楚表達自己意圖。
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
}
// 優化后
if (notSummer(date)) {
}
二. if else 嵌套過深
public void workOrRest {
if (isWorkDay()) {
System.out.println("sad,is work day!!!");
} else {
if (isWorkTime()) {
System.out.println("shit,is work time!!!");
} else {
rest();
System.out.println("happy happy happy!!!");
}
}
}
解決辦法:通過衛語句,有時候條件式可能出現在嵌套n次才能真正執行,其他分支只是簡單報錯返回的情況,對於這種情況,應該單獨檢查報錯返回的分支,當條件為真時立即返回,這樣的單獨檢查就是衛語句(guard clauses).衛語句可以把我們的視線從異常處理中解放出來,集中精力到正常處理的代碼中。
public void workOrRest {
if (isWorkDay()) {
System.out.println("sad,is work day!!!");
return;
}
if (isWorkTime()) {
System.out.println("shit,is work time!!!");
return;
}
rest();
System.out.println("happy happy happy!!!");
}
三. if else過多
if (houseName.equals("Targaryen")) {
...
System.out.println("Blood and fire");
} else if (houseName.equals("Baratheon")) {
...
System.out.println("Ours is the Fury");
} else if (houseName.equals("Stark")) {
...
System.out.println("Winter is coming");
} else if (houseName.equals("Lannister")) {
...
System.out.println("Hear Me Roar");
} else if (houseName.equals("Arryn")) {
...
System.out.println("as High as Honor");
} else if (houseName.equals("Tyrell")) {
...
System.out.println("Growing Strong");
} else if (houseName.equals("Tully")) {
...
System.out.println("Family, Duty, Honor");
} else if (houseName.equals("Martell")) {
...
System.out.println("Unbent, Unbowed, Unbroken");
} else if (houseName.equals("Greyjoy")) {
...
System.out.println("We Do Not Sow");
} else {
...
System.out.println("world peace");
}
問題解決:利用策略or狀態模式,消除業務判斷,各之類分別關注自己的實現,大大降低了系統各部分之間的依賴。利用Map緩存分支狀態信息。基本可以達到對修改封閉,對擴展開放。
<property name="thronesMap">
<map>
<entry key="Targaryen"><bean class="game.of.thrones.TargaryenStrategy"/></entry>
<entry key="Baratheon"><bean class="game.of.thrones.BaratheonStrategy"/></entry>
<entry key="Stark"><bean class="game.of.thrones.StarkStrategy"/></entry>
<entry key="Lannister"><bean class="game.of.thrones.LannisterStrategy"/></entry>
<entry key="Arryn"><bean class="game.of.thrones.ArrynStrategy"/></entry>
<entry key="Tyrell"><bean class="game.of.thrones.TyrellStrategy"/></entry>
<entry key="Tully"><bean class="game.of.thrones.TullyStrategy"/></entry>
<entry key="Martell"><bean class="game.of.thrones.MartellStrategy"/></entry>
<entry key="Greyjoy"><bean class="game.of.thrones.GreyjoyStrategy"/></entry>
<entry key="Default"><bean class="game.of.thrones.DefaultStrategy"/></entry>
</map>
</property>
public interface GameOfThronesStrategyService {
/**
* 具體實現處理
*/
void mainTitle();
}
thronesMap.get(houseName).mainTitle();
