2017-10-20 65 views
2

在我的代碼 中有一個if/else語句,我想重構它。我已經搜索了許多類似的問題。比如this。 最好的答案是說責任鏈模式是一個不錯的選擇。但下面是我的代碼的一部分。如果我使用CoR模式,我將創建超過70個Java類並創建一個ArrayList來保存這些類的實例。它將消耗更多的內存。我也瞭解了國家的模式,也需要創建這麼多的課程。大量的if if else重構

只是想知道有沒有更優雅的方式來解決它?

if (urlContent.contains(YLWFX)) { 
    urlContent = urlContent.replace(YLWFX + ":", ""); 
    if (urlContent.startsWith(TRANSMIT)) { 
    mProcess.onTransmit(activity, url); 
    } else if (urlContent.startsWith(TAKEORDER)) { 
    mProcess.onTakeOrder(activity, url); 
    } else if (urlContent.startsWith(GOODS)) { 
    if (urlContent.contains(GOODSMANAGER_MMZL)) { 
     mProcess.onEnterpriseShopManage(activity, url); 
    } else { 
     mProcess.onGoods(activity, url); 
    } 
    } else if (urlContent.startsWith(SUPPLIER)) { 
    mProcess.onSupplier(activity, url); 
    } else if (urlContent.startsWith(POSTS)) { 
    mProcess.onPosts(activity, url); 

    } else if (urlContent.startsWith(TEAM)) { 

    if (urlContent.contains(TEAM_LIST)) { 
     mProcess.onTeamList(activity); 
    } else if (urlContent.contains(TEAMINDEX)) { 
     mProcess.onTeamIndex(activity, url); 
    } else if (urlContent.contains(TEAMINFO)) { 
     mProcess.onTeamInfo(activity, url); 
    } else if (urlContent.contains(TEAMMEMBER_INFO)) { 
     mProcess.onTeamMemberInfo(activity, url); 
    } else { 
     mProcess.onTeam(activity, url); 
    } 
    } 
} 
+0

您可以使用單個模式匹配操作確定前導「關鍵字」。這可以用作檢索BiConsumer的關鍵,用活動和URL調用。 – laune

回答

2

的情況選擇,如果你不想下井COR路徑,我'd建議使用switch語句。這將有助於使您的代碼更具可讀性,同時不會改變邏輯。所以它看起來是這樣的:(這只是僞明顯)

if(contains){ 
    //you will need to look at how to add this to a switch properly, 
    //just giving you an idea of how I'd look at it. 
    switch(urlContent.startswith) { 
     case TRANSMIT: 
      mProcess.onTransmit(activity, url); 
     case TAKEORDER: 
      mProcess.onTakeOrder(activity, url); 
     case GOODS: 
      if (urlContent.contains(GOODSMANAGER_MMZL)) { 
       mProcess.onEnterpriseShopManage(activity, url); 
      } else { 
       mProcess.onGoods(activity, url); 
      } 
     case SUPPLIER: 
      mProcess.onSupplier(activity, url); 
     case POSTS: 
      mProcess.onPosts(activity, url); 
     case TEAM: 
      if (urlContent.contains(TEAM_LIST)) { 
       mProcess.onTeamList(activity); 
      } else if (urlContent.contains(TEAMINDEX)) { 
       mProcess.onTeamIndex(activity, url); 
      } else if (urlContent.contains(TEAMINFO)) { 
       mProcess.onTeamInfo(activity, url); 
      } else if (urlContent.contains(TEAMMEMBER_INFO)) { 
       mProcess.onTeamMemberInfo(activity, url); 
      } else { 
       mProcess.onTeam(activity, url); 
      } 
    } 
} 

你甚至可以做另外一個交換機上的第二批別人的,如果仍然存在,但我會離開,作爲一個鍛鍊; Tibial;)這裏的一些讀也:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

希望這有助於讓你開始。讓我知道事情的後續!

+0

並且最好在TEAM的情況下添加新方法 – chokdee

+0

可能。稍微想一想,最好保留TEAM情況,就好像在一個單獨的方法中試圖打開一個.contains的語句是奇怪的一樣。在我看來,只要他能夠提取他的urlContent的第一個詞(這不應該太複雜),我認爲上面應該工作。我想這也取決於他正在比較的urlContent的格式。 –

+0

可能是我對設計模式的想法太多了。它似乎是最佳實踐 –

1

你應該儘量考慮型動物像開關結構

switch (/*Variable*/) 
{ 
    case /*Argument*/: 
    /*Action*/; 
    break;   
    default: 
    /*Action*/;    
} 

或三元操作

int result = testCondition ? value1 : value2 
+0

我不認爲這種方法會有幫助,因爲他沒有檢查單個變量,而是檢查變量的變量子字符串。 – Bernat

0

首先,關於很多if-else的問題並不是它們有多少,而是它們有多深。請參閱here關於如何測量它,以及爲什麼具有高深度嵌套if-else鏈的程序不可取。其次,if-else是命令式語言中最重要的語句,例如java。因此,把它們放在一個單獨的方法中,或者像CoR那樣將它們分散到類層次結構中,這只是程序範例的自然使用方式。

那麼,有人可以這樣說:「但這種代碼可能有點問題,有很多if-else」。在這種情況下,我猜這個問題本身並不是if-else的大量使用,但是,也許這個方法有很多橫切責任。有設計模式稱爲「抓取設計模式」,其中一人更普遍的名單說:

「高內聚是試圖保持對象 適當集中,便於管理和可理解的評價模式。」

在關鍵的book of Craig Larman中可以找到更多關於抓取設計圖案的信息。因此,如果一個方法內的代碼有很多不同的事情要做(格式化,重寫,路由,驗證等),那麼他們就沒有其他方式將它編碼爲嵌套或不嵌套的胖序列 - 說明。在這種情況下,解決方案就是將這個方法分解成其他方法的有限集合,在同一個類中,或者如CoR模式中提出的,沿着其他幾個類。