foreach语句中的块必须只有一行吗?

时间:2012-12-12 07:22:37

标签: java coding-style

我正在读一本名为Clean Code -A Handbook of Agile Software Craftsmanship的书,由 Robert C. Martin 撰写,在他的书中,他提供了很多有用的技巧,如何编写优秀的Java代码。

其中一个提示是:

  

if语句,else语句,语句等中的块   应该是一行长。可能该行应该是一个函数   呼叫。这不仅保持封闭功能小,而且保持封闭功能   还添加了纪录片值,因为函数调用了   块可以有一个很好的描述性名称

对我来说这是非常奇怪的提示,因为从这段代码开始:

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");
}

所以基本上代码的大小增加了一倍。它有用吗? - 也许。

我的示例中的哪些代码是所谓的 clean ?我究竟做错了什么?你们怎么看待这个?

2 个答案:

答案 0 :(得分: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()来电不会在两个地方重复。
  3. 现在,如果你想要考虑一些因素,以下将是一个很好的候选人:

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

    如果以上出现在多个地方,我肯定会这样做。否则,可能不会(至少不是最初)。

答案 1 :(得分:1)

我认为简化条件本身更有意义。比if块的内容,即

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;
}