Wir refaktorisieren eine lange Methode; sie enthält eine lange for
Schleife mit vielen continue
Erklärungen. Ich würde gerne einfach die Auszug Methode Refactoring, aber das automatische Refactoring von Eclipse weiß nicht, wie es mit der bedingten Verzweigung umgehen soll. Ich weiß es auch nicht.
Unsere derzeitige Strategie ist die Einführung eines keepGoing
Flagge (eine Instanzvariable, da wir in der Zukunft Extraktmethode ), setzen Sie es am Anfang der Schleife auf false, und ersetzen Sie jedes continue durch das Setzen des Flags auf true, um dann alles Folgende (auf verschiedenen Verschachtelungsebenen) in eine if (keepGoing)
Klausel. Führen Sie dann die verschiedenen Extraktionen durch und ersetzen Sie dann die keepGoing
Zuweisungen mit frühzeitigen Erträgen aus den extrahierten Methoden, dann werden Sie das Kennzeichen los.
Gibt es einen besseren Weg?
Update : Als Antwort auf Kommentare - ich kann den Code nicht weitergeben, aber hier ist ein anonymisierter Auszug:
private static void foo(C1 a, C2 b, C3 c, List<C2> list, boolean flag1) throws Exception {
for (int i = 0; i < 1; i++) {
C4 d = null;
Integer e = null;
boolean flag2 = false;
boolean flag3 = findFlag3(a, c);
blahblahblah();
if (e == null) {
if (flag1) {
if (test1(c)) {
if (test2(a, c)) {
Integer f = getF1(b, c);
if (f != null)
e = getE1(a, f);
if (e == null) {
if (d == null) {
list.add(b);
continue;
}
e = findE(d);
}
} else {
Integer f = getF2(b, c);
if (f != null)
e = getE2(a, f);
if (e == null) {
if (d == null) {
list.add(b);
continue;
}
e = findE(d);
}
flag2 = true;
}
} else {
if (test3(a, c)) {
Integer f = getF2(b, c);
if (f != null)
e = getE2(a, f);
if (e == null) {
if (d == null) {
list.add(b);
continue;
}
e = findE(d);
}
flag2 = true;
} else {
if (d == null) {
list.add(b);
continue;
}
e = findE(d);
flag2 = true;
}
}
}
if (!flag1) {
if (d == null) {
list.add(b);
continue;
}
e = findE(d);
}
}
if (e == null) {
list.add(b);
continue;
}
List<C2> list2 = blahblahblah(b, list, flag1);
if (list2.size() != 0 && flag1) {
blahblahblah();
if (!otherTest()) {
if (yetAnotherTest()) {
list.add(b);
continue;
}
blahblahblah();
}
}
}
}