【发布时间】:2016-11-09 15:09:40
【问题描述】:
干净的代码对我来说意味着:每个方法只有一个任务,没有嵌套循环。
当我得到以下代码时,我问自己,如何避免嵌套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,您可能会发现研究 lambdas 对您的目的很有用。
-
正如@Mena 提到的,Java 8 的 lambda 表达式可能是一种选择,但除此之外,我发现您的第一个版本是最可取的。您只有一种方法,所有逻辑都包含在几个嵌套循环中。
-
“干净的代码对我来说意味着:每个方法只有一个任务,没有嵌套循环。” 对我来说,干净的代码意味着可读, 无重复代码。所以我也更喜欢“嵌套循环”版本。我的原因是,在各个循环中没有其他工作。
标签: java for-loop coding-style nested-loops