if ((condition1 && condition2 ) || ((condition2 || condition3) && condition4)) { }
問題解決:分解條件表達式,分解成多個獨立的函數,爲分解的新函進行良好的命名,從而更清楚表達本身意圖。緩存
if (date.before(SUMMER_START) || date.after(SUMMER_END)) { } // 優化後 if (notSummer(date)) { }
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).衛語句能夠把咱們的視線從異常處理中解放出來,集中精力到正常處理的代碼中。app
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 (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();