Stiamo rifattorizzando un metodo lungo; contiene un lungo ciclo for
con molte dichiarazioni continue
. Vorrei semplicemente usare il refactoring del metodo di estrazione del metodo , ma quello automatizzato di Eclipse non sa come gestire il ramo condizionale. Nemmeno io.Extract Method with continue
La nostra strategia attuale è quella di introdurre un keepGoing
bandiera (una variabile di istanza dal momento che stiamo andando a voler metodo estratto), impostarla su false nella parte superiore del ciclo, e sostituire ogni continuare con l'impostazione della bandierina true, quindi avvolge tutte le seguenti cose (a diversi livelli di nidificazione) all'interno di una clausola if (keepGoing)
. Quindi eseguire le varie estrazioni, quindi sostituire gli assegnamenti keepGoing
con i ritorni anticipati dai metodi estratti, quindi eliminare la bandiera.
C'è un modo migliore?
Aggiornamento: In risposta ai commenti - non posso condividere il codice, ma ecco un estratto anonimo:
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();
}
}
}
}
è possibile inserire il codice? –
puoi fornire un esempio abbreviato? – akf
Wow ... Posso sicuramente capire perché vuoi refactoring. –