Clean-Code bedeutet für mich: nur eine Aufgabe für jede Methode und keine verschachtelte Schleifen.Wie verschachtelte For-Schleifen in Methoden schreiben (sauberer Code)
Als ich den folgenden Code bekam, fragte ich mich, wie kann ich verschachtelte for-Schleifen vermeiden und sie in Methoden einkapseln.
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";
}
Meine erste Lösung war die folgende. Das Problem hier ist, die for-Schleifen laufen bis zum Ende und brechen nicht (zurück), wenn der Wert gefunden und gesetzt ist.
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();
}
}
so schrieb ich diesen Code, die gleich wie die erste sein sollte:
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;
}
}
fragte ich mich, aber dann ist das wirklich besser Code? Ist das ein sauberer Code? Ja, jede Methode macht nur eine Sache. Und ja, der Code ist meiner Meinung nach besser zu lesen. Aber aus ursprünglich 12 Zeilen kompakter Code habe ich nun 30 Codezeilen und eine Membervariable mehr im Code. Ist der erste Code also besser, weil er sogar mit verschachtelten For-Loops kompakter ist?
Was denkst du? Welches ist besser? Oder wie kann ich den Code besser schreiben?
Vielen Dank im Voraus für Ihre Antworten!
Wenn Sie Java 8 verwenden, finden Sie möglicherweise lambdas, die für Ihren Zweck nützlich sind. – Mena
Wie @Mena erwähnt, vielleicht sind Java 8 Lambda-Ausdrücke eine Option, aber abgesehen davon finde ich Ihre allererste Version die am meisten vorzuziehen. Sie haben nur eine Methode und die gesamte Logik ist in nur wenigen verschachtelten Schleifen enthalten. –
* "Sauberer Code bedeutet für mich: nur eine Aufgabe für jede Methode und keine verschachtelten Schleifen." * Für mich * Clean Code * bedeutet * lesbaren, duplikationsfreien Code *. Daher bevorzuge ich auch die "Nested Loop" Version. Der Grund für mich ist, dass es keine andere Arbeit innerhalb der einzelnen Schleifen gibt. –