Не анти-шаблон как таковой, а шаблон кода, который говорит о необходимости рефакторинга.
И это довольно просто, вам просто нужно знать практическое правило, которое записывает не больше, чем блок try в том же методе. Если вы хорошо знаете, как писать связанный код вместе, обычно просто копируете и вставляете каждый блок try с его блоками catch и вставляете его в новый метод, а затем заменяете исходный блок вызовом этого метода.
Это правило основано на предложении Роберта К. Мартина из его книги «Чистый код»:
если в функции существует ключевое слово 'try', оно должно быть самым первым словом в функции и что после блоков catch / finally ничего не должно быть.
Быстрый пример на «псевдо-Java». Предположим, у нас есть что-то вроде этого:
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;
}
}
}
Затем мы могли бы реорганизовать каждый try catch, и в этом случае каждый блок try-catch пытается сделать то же самое, но в разных местах (как удобно: D), нам нужно только скопировать вставить один из блоков try-catch и создать метод для него ,
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Теперь мы используем это с той же целью, что и раньше.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Надеюсь, это поможет :)