乾淨的代碼對我來說意味着:每個方法只有一個任務,沒有嵌套循環。如何在方法中編寫嵌套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循環它也更緊湊?
您認爲如何?哪一個更好?或者我怎樣才能更好地編寫代碼?
在此先感謝您的答案!
如果你使用Java 8,你可能會發現研究lambda對你的目的有用。 – Mena
正如@Mena提到的,也許Java 8的lambda表達式是一種選擇,但除此之外,我發現你的第一個版本是最可取的。你只有一個方法,所有的邏輯都包含在幾個嵌套的循環中。 –
*「乾淨的代碼對我來說意味着:每個方法只有一個任務,沒有嵌套循環。」*對我來說*清潔代碼*表示*可讀,無重複代碼*。所以我也更喜歡「嵌套循環」版本。我的理由是,單個循環中沒有其他工作。 –