2012-12-12 72 views
4

我正在閱讀一本名爲Clean Code -A Handbook of Agile Software Craftsmanship的書,作者爲羅伯特C.馬丁並且在他的書中,他給出了很多有用的技巧,如何編寫好的Java代碼。在foreach語句中的塊是否必須只有一行?

而這些祕訣之一是:

塊if語句,else語句,for語句,並因此 應該是一個長行內。可能該行應該是一個函數 調用。這不僅保持封閉的功能雖小,但它 也增加了紀錄片的價值,因爲被稱爲 塊內的函數可以有一個很好的描述性名稱

對我來說,這是很奇怪的暗示,因爲這樣的代碼:

public Map<String, List<Issue>> mapComponentToIssueList(List<Issue> issues) { 
    Map<String, List<Issue>> map = new HashMap<String, List<Issue>>(); 

    for (Issue issue : issues) { 
     String componentName = issue.getComponents().iterator().next().getString("name"); 
     if (map.containsKey(componentName)) { 
      map.get(componentName).add(issue); 
     } else { 
      List<Issue> list = new ArrayList<Issue>(); 
      list.add(issue); 
      map.put(componentName, list); 
     } 
    } 
    return map; 

} 

利用這個原理,我得到這個:

public Map<String, List<Issue>> mapComponentToIssueList(List<Issue> issues) { 
    Map<String, List<Issue>> componentNameIssueListMap = new HashMap<String, List<Issue>>(); 
    for (Issue issue : issues) { 
     populateMapWithComponenNamesAndIssueLists(componentNameIssueListMap, issue); 
    } 
    return componentNameIssueListMap; 
} 

private void populateMapWithComponenNamesAndIssueLists(Map<String, List<Issue>> componentNameIssueListMap, Issue issue) { 
    String componentName = getFirstComponentName(issue); 
    if (componentNameIssueListMap.containsKey(componentName)) { 
     componentNameIssueListMap.get(componentName).add(issue); 
    } else { 
     putIssueListWithNewKeyToMap(componentNameIssueListMap, issue, componentName); 
    } 
} 

private void putIssueListWithNewKeyToMap(Map<String, List<Issue>> componentNameIssueListMap, Issue issue, String componentName) { 
    List<Issue> list = new ArrayList<Issue>(); 
    list.add(issue); 
    componentNameIssueListMap.put(componentName, list); 
} 

private String getFirstComponentName(Issue issue) { 
    return issue.getComponents().iterator().next().getString("name"); 
} 

所以基本上代碼已經翻了一番size.Was它有用嗎? - 也許。

我的例子中的什麼代碼叫做clean?我究竟做錯了什麼?你們怎麼看待這個問題?

+7

IMHO,該建議是在荒謬接壤。 – NPE

+4

請把那本書丟掉。或者燒掉它。 (後者更安全,其他人永遠無法閱讀)。 –

+0

這隻有審美相關性。 – Mob

回答

1

坦率地說,我認爲小費很愚蠢,因爲它太極端了。

個人而言,如果我是做什麼的功能,我會改變它像這樣:

public Map<String, List<Issue>> mapComponentToIssueList(List<Issue> issues) { 
    Map<String, List<Issue>> map = new HashMap<String, List<Issue>>(); 

    for (Issue issue : issues) { 
     String componentName = issue.getComponents().iterator().next().getString("name"); 
     List<Issue> list = map.get(componentName); 
     if (list == null) { 
      list = new ArrayList<Issue>(); 
      map.put(componentName, list); 
     } 
     list.add(issue); 
    } 
    return map; 
} 

的好處是:

  1. 你只做地圖查詢一次,而不是兩次。
  2. list.add()呼叫在兩個地方不重複。

現在,如果你想什麼因素出來,以下將是一個不錯的人選:

 List<Issue> list = map.get(componentName); 
     if (list == null) { 
      list = new ArrayList<Issue>(); 
      map.put(componentName, list); 
     } 

我肯定會做,如果上面出現不止一處。否則,可能不會(至少不是最初)。

1

我認爲簡化條件本身更有意義。比的,如果塊的內容,即

public void method(){ 
... 
    if(mycondition1 && mycondition2 && mycondition3 && mycondition4 && mycondition5 && mycondition6 && mycondition7 && mycondition8) { 
    dosomething(); 
    } 
... 
} 

變得

public void method(){ 
... 
    if(conditionsAreTrue()) { 
    dosomething(); 
    } 
... 
} 

boolean conditionsAreTrue(){ 
return mycondition1 && mycondition2 && mycondition3 && mycondition4 && mycondition5 && mycondition6 && mycondition7 && mycondition8; 
} 
+0

我不能讀這本書作者的思想,但我懷疑這是他的意思。除其他外,他正在談論「在......其他語句」中的「塊......」。 – NPE

+0

我想這在減少複雜性方面是有道理的,但對於任何代碼塊來說都是如此,而不僅僅是聲明。如果一段代碼不是直截了當的,那麼在一個方法中提取它會使代碼更易於閱讀和理解。 – emt14

相關問題