如何在methodes中编写嵌套for循环(干净代码)

时间:2016-11-09 15:09:41

标签: java for-loop coding-style nested-loops

清洁代码对我来说意味着:每个方法只有一个任务,没有嵌套循环。

当我得到以下代码时,我问自己,我怎样才能避免嵌套for循环并将它们封装在方法中。

private String getUser(){
    for (FieldConfigScheme context : getConfigurationSchemes()) {
        for (Option option : getOptions(context)) {
            for (Group group : getGroups()) {
                if (option.getValue().equalsIgnoreCase(group.getName())) {
                    return group.getUser();
                }
            }
        }
    }
    return "default";
}

我的第一个解决方案如下。这里的问题是,for循环一直运行到结束,并且在找到并设置值时不会中断(返回)。

private String user = "default";

private String getUser(){
    for (FieldConfigScheme context : getConfigurationSchemes()) {
        processOptions(context);
    }
    return this.user;
}

private void processOptions(FieldConfigScheme context){
    for (Option option : getOptions(context)) {
        processGroups(option);
    }
}

private void processGroups(Option option){
    for (Group group : getGroups()) {
        setUser(option, group);
    }
}

private void setUser(Option option, Group group){
    if (option.getValue().equalsIgnoreCase(group.getName())) {
        this.user = group.getUser();
    }
}

所以我写了这段代码,它应该和第一段代码一样:

private String user = "default";
private boolean isUserSet = false;

private String getUser(){
    for (FieldConfigScheme context : getConfigurationSchemes()) {
       if(!isUserSet) processOptions(context);
       else return this.user;
    }
    return this.user;
}

private void processOptions(FieldConfigScheme context){
    for (Option option : getOptions(context)) {
        if(!isUserSet) processGroups(option);
        else return;
    }
}

private void processGroups(Option option){
    for (Group group : getGroups()) {
        if(!isUserSet) setUser(option, group);
        else return;
    }
}

private void setUser(Option option, Group group){
    if (option.getValue().equalsIgnoreCase(group.getName())) {
        this.user = group.getUser();
        isUserSet = true;
    }
}

但后来我问自己,这真的是更好的代码吗?这是更干净的代码吗?是的,每种方法只做一件事。是的,在我看来,代码更好。但是从最初的12行紧凑代码我现在在代码中有30行代码和一个成员变量。那么第一个最初的代码是否更好,因为即使使用嵌套for循环它也更紧凑?

你怎么看?哪一个更好?或者我怎样才能更好地编写代码?

提前感谢您的回答!

1 个答案:

答案 0 :(得分:0)

而不是返回R.id,为什么不void

boolean

T.B.H。我更喜欢嵌套循环方法。它看起来很干净,循环中没有什么比简单地在层次结构中找到一些东西了,这非常好。

在这种情况下使用额外功能很糟糕。想象一下现在必须调试这个代码,而不是专注于这样做的一个方法,你将不得不看看你所做的所有额外的。

此方法似乎没有采用任何参数,这表明它实际上只需要执行一次此检查,其余时间它应该返回相同的值。这只是一个猜测,但如果是这样,那么它会使你的努力变得更加清洁,更加不必要。