Не антидіапазон сам по собі, а шаблон коду, який підказує, що вам потрібно зробити рефактор.
І це досить просто, ви просто повинні знати правило, яке записує не більше ніж блок спробу в тому ж методі. Якщо ви добре вмієте писати пов'язаний код разом, зазвичай це просто скопіювати та вставити кожен блок спробу з його блоками захоплення та вставити його всередину нового методу, а потім замінити оригінальний блок на виклик цього методу.
Це правило засноване на пропозиції Роберта К. Мартіна з його книги "Чистий код":
якщо ключове слово "спробувати" існує у функції, воно повинно бути першим словом у функції, і після блокування "лову / нарешті" нічого не повинно бути.
Швидкий приклад про "псевдо-яву". Припустимо, у нас є щось подібне:
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;
}
}
}
Тоді ми можемо переробляти кожен спробу лову, і в цьому випадку кожен блок спробу лову спробує те ж саме, але в різних місцях (як зручно: D), нам залишається лише скопіювати вставити один із блоків пробного лову і зробити метод його .
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;
}
}
Я сподіваюся, що це допомагає :)