如何在方法中编写嵌套的 for 循环(干净的代码)
How to write nested for loops in methodes (clean code)
干净的代码对我来说意味着:每个方法只有一个任务,没有嵌套循环。
当我得到下面的代码时,我问自己,如何避免嵌套的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 循环是 运行 直到结束并且在找到并设置值时不会中断 (return)。
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 循环也更紧凑?
你怎么看?哪一个更好?或者我怎样才能把代码写得更好?
提前感谢您的回答!
而不是returning 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。我更喜欢嵌套循环方法。它看起来很干净,循环中除了简单地在层次结构中查找内容之外没有其他事情发生,这非常好。
在这种情况下使用额外的功能是很糟糕的。想象一下,现在必须调试此代码,而不是专注于执行此操作的一种方法,您将不得不查看您创建的所有额外方法。
此外,此方法似乎没有采用任何参数,这表明它实际上只需要执行一次此检查,其余时间它应该只是 return 相同的值。这只是一个猜测,但如果是这样的话,那么你就更没有必要让它变得更干净了。
干净的代码对我来说意味着:每个方法只有一个任务,没有嵌套循环。
当我得到下面的代码时,我问自己,如何避免嵌套的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 循环是 运行 直到结束并且在找到并设置值时不会中断 (return)。
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 循环也更紧凑?
你怎么看?哪一个更好?或者我怎样才能把代码写得更好?
提前感谢您的回答!
而不是returning 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。我更喜欢嵌套循环方法。它看起来很干净,循环中除了简单地在层次结构中查找内容之外没有其他事情发生,这非常好。
在这种情况下使用额外的功能是很糟糕的。想象一下,现在必须调试此代码,而不是专注于执行此操作的一种方法,您将不得不查看您创建的所有额外方法。
此外,此方法似乎没有采用任何参数,这表明它实际上只需要执行一次此检查,其余时间它应该只是 return 相同的值。这只是一个猜测,但如果是这样的话,那么你就更没有必要让它变得更干净了。