Nie jest to anty-wzorzec per se, ale wzorzec kodu, który mówi, że trzeba zrefaktoryzować.
I to całkiem proste, wystarczy znać ogólną zasadę, która polega na pisaniu tylko bloku try w tej samej metodzie. Jeśli dobrze wiesz, aby pisać razem pokrewny kod, zwykle wystarczy skopiować i wkleić każdy blok try z jego blokami catch i wkleić go w nowej metodzie, a następnie zastąpić oryginalny blok wywołaniem tej metody.
Ta ogólna zasada oparta jest na sugestii Roberta C. Martina z jego książki „Clean Code”:
jeśli słowo kluczowe „try” istnieje w funkcji, powinno to być pierwsze słowo w funkcji i nie powinno być nic po blokach catch / wreszcie.
Szybki przykład „pseudo-java”. Załóżmy, że mamy coś takiego:
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;
}
}
}
Następnie moglibyśmy refaktoryzować każdą próbę catch iw tym przypadku każdy blok try-catch próbuje tego samego, ale w różnych lokalizacjach (jak wygodne: D), musimy tylko skopiować wklej jeden z bloków try-catch i zastosować metodę .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Teraz używamy tego w tym samym celu, co wcześniej.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Mam nadzieję że to pomogło :)