Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java foreach语句中的块是否必须只有一行长?_Java_Coding Style - Fatal编程技术网

Java foreach语句中的块是否必须只有一行长?

Java foreach语句中的块是否必须只有一行长?,java,coding-style,Java,Coding Style,我正在读一本名为罗伯特·C·马丁(Robert C.Martin)的书,在他的书中,他给出了许多有用的技巧,告诉我们如何编写好的Java代码 其中一个建议是: if语句、else语句、for语句等中的块 on应该是一行。也许这行应该是一个函数 呼叫这不仅使封闭函数保持较小,而且 由于在 块可以有一个很好的描述性名称 对我来说,这是一个非常奇怪的提示,因为从以下代码: public Map<String, List<Issue>> mapComponentToIssueLi

我正在读一本名为罗伯特·C·马丁(Robert C.Martin)的书,在他的书中,他给出了许多有用的技巧,告诉我们如何编写好的Java代码

其中一个建议是:

if语句、else语句、for语句等中的块 on应该是一行。也许这行应该是一个函数 呼叫这不仅使封闭函数保持较小,而且 由于在 块可以有一个很好的描述性名称

对我来说,这是一个非常奇怪的提示,因为从以下代码:

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;

}
公共地图组件到列表(列表问题){
Map Map=newhashmap();
针对(问题:问题){
String componentName=issue.getComponents().iterator().next().getString(“名称”);
if(映射容器(组件名称)){
map.get(componentName).add(issue);
}否则{
列表=新的ArrayList();
列表。添加(发布);
map.put(组件名称、列表);
}
}
返回图;
}
利用这个原理,我得到了:

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");
}
公共地图组件到列表(列表问题){
Map componentNameIssueListMap=新HashMap();
针对(问题:问题){
使用组件名称和发布列表填充Map(组件名称发布列表,发布);
}
返回组件名称IssueListMap;
}
私有void populatemApWithComponenNamesandSuSelects(映射组件名称IssuseListMap,Issue Issue){
String componentName=getFirstComponentName(问题);
if(组件名称IssueListMap.containsKey(组件名称)){
componentNameIssueListMap.get(componentName).add(issue);
}否则{
putIssueListWithNewKeyToMap(组件名称IssueListMap,issue,组件名称);
}
}
私有void putIssueListWithNewKeyToMap(映射组件名IssueListMap、Issue Issue、字符串组件名){
列表=新的ArrayList();
列表。添加(发布);
componentNameIssueListMap.put(componentName,列表);
}
私有字符串getFirstComponentName(问题){
返回问题.getComponents().iterator().next().getString(“名称”);
}
所以基本上代码的大小增加了一倍。它有用吗?-也许吧


在我的示例中,什么代码被称为clean?我做错了什么?你们对此怎么看?

坦率地说,我认为这个建议很愚蠢,因为它太极端了

就我个人而言,如果我要对你的函数做任何修改,我会这样修改:

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

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

我认为简化条件本身更有意义。而不是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;
}

哦,那个建议近乎荒谬。请扔掉那本书。或者烧掉它。(后者更安全;没有人能读到它)。哦,不,它有关联,因为总有一天我可能不得不解开一堆由作者写的乱七八糟的东西。烧掉它:-D+1因为烧掉了,我也读了那本该死的书,我还在做噩梦。我当时年轻又笨。另外:酒精。:)这是一个伪装的亡灵名词,我,我,干净的密码。我看不懂作者的心思,但我怀疑这是他的意思。除此之外,他所说的是“在
else
语句中的块”。我想这在降低复杂性方面是有意义的,但这应该适用于任何代码块,而不仅仅是if语句。如果代码块不是直接的,那么在方法中提取它会使代码更容易阅读和理解。
public void method(){
...
  if( conditionsAreTrue() ) {
   dosomething();
  }
...
}

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