2016-11-09 66 views
1

乾淨的代碼對我來說意味着:每個方法只有一個任務,沒有嵌套循環。如何在方法中編寫嵌套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循環它也更緊湊?

您認爲如何?哪一個更好?或者我怎樣才能更好地編寫代碼?

在此先感謝您的答案!

+3

如果你使用Java 8,你可能會發現研究lambda對你的目的有用。 – Mena

+0

正如@Mena提到的,也許Java 8的lambda表達式是一種選擇,但除此之外,我發現你的第一個版本是最可取的。你只有一個方法,所有的邏輯都包含在幾個嵌套的循環中。 –

+0

*「乾淨的代碼對我來說意味着:每個方法只有一個任務,沒有嵌套循環。」*對我來說*清潔代碼*表示*可讀,無重複代碼*。所以我也更喜歡「嵌套循環」版本。我的理由是,單個循環中沒有其他工作。 –

回答

0

而不是返回void,爲什麼不是boolean

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

private boolean processOptions(FieldConfigScheme context){ 
    for (Option option : getOptions(context)) { 
     if (processGroups(option)) { 
      return true; 
     } 
    } 
    return false; 
} 

private boolean processGroups(Option option){ 
    for (Group group : getGroups()) { 
     if (option.getValue().equalsIgnoreCase(group.getName())) { 
      this.user = group.getUser(); 
      return true; 
     } 
    } 
    return false; 
} 

T.B.H.我更喜歡嵌套循環方法。它看起來很乾淨,循環中沒有什麼比在層次結構中簡單地找到某些東西了,這非常好。

在這種情況下使用額外的功能是不好的。想象一下,現在必須調試這些代碼,而不是專注於這樣做的一種方法,您將不得不查看所有額外的代碼。

此外,這種方法似乎沒有采取任何參數,這表明它實際上只需要做一次檢查,其餘的時間應該只返回相同的值。這只是一個猜測,但如果是這樣的話,那麼它會讓你的努力變得更加清潔,而這一切都變得不必要。