Kein Anti-Pattern an sich, sondern ein Code-Pattern, das Ihnen sagt, dass Sie umgestalten müssen.
Und es ist ziemlich einfach, Sie müssen nur eine Faustregel kennen, die in derselben Methode nicht mehr als einen try-Block schreibt. Wenn Sie wissen, wie man zusammengehörigen Code schreibt, müssen Sie in der Regel nur jeden try-Block mit seinen catch-Blöcken kopieren und einfügen und ihn in eine neue Methode einfügen. Ersetzen Sie dann den ursprünglichen Block durch einen Aufruf dieser Methode.
Diese Faustregel basiert auf dem Vorschlag von Robert C. Martin aus seinem Buch 'Clean Code':
Wenn das Schlüsselwort 'try' in einer Funktion existiert, sollte es das allererste Wort in der Funktion sein und es sollte nichts nach den catch / finally-Blöcken stehen.
Ein kurzes Beispiel zu "Pseudo-Java". Angenommen, wir haben so etwas:
try {
FileInputStream is = new FileInputStream(PATH_ONE);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
try {
FileInputStream is = new FileInputStream(PATH_TWO);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
try {
FileInputStream is = new FileInputStream(PATH_THREE);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
}
Dann könnten wir jeden try catch refaktorieren, und in diesem Fall versucht jeder try catch-Block dasselbe, aber an verschiedenen Stellen (wie praktisch: D) müssen wir nur einen der try catch-Blöcke kopieren, einfügen und eine Methode daraus erstellen .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Jetzt verwenden wir dies mit dem gleichen Zweck wie zuvor.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Ich hoffe das hilft :)