Вы должны заглянуть в doA()
, doB()
и doC()
.Если они вряд ли потерпят неудачу, выведите исключение, если они потерпят неудачу.
try {
doA();
doB();
doC();
} catch (FailureException e) {
// handle failure
}
Примеров необоснованных сбоев предостаточно, IOException
, IllegalParameterException
и т. Д.Вероятность сбоя
if (!doA()) {
// handle A's failure
return;
}
if (!doB()) {
// handle B's failure
return;
}
if (!doC()) {
// handle C's failure
return;
}
Примеры разумных сбоев в Java чуть менее подчеркнуты.Некоторые примеры включают read()
, возвращающий -1, когда больше нечего читать.Если ваш doA()
на самом деле назван ближе к attemptA()
, то, возможно, будет возвращен boolean
, указывающий на успешность попытки.Подумайте о add(...)
и addAll(...)
в интерфейсе Collections
, они возвращают true
, если полученный Collection
был изменен.
Традиционный goto
не является хорошим выбором в большинстве языков,как и при просмотре кода, практически невозможно узнать, откуда этот код «появился».Отсутствие знаний о состоянии до входа в goto
делает невозможным гарантировать согласованную среду до входа в блок goto
.Кстати, именно поэтому традиционный goto
недоступен в Java, и только ограниченное продолжение goto
есть.
Чтобы перейти от плохо вложенной структуры к менее вложенной, используйте несколько методов рефакторинга.:
if(doA()){
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
} else {
// I know A failed
}
return;
эквивалентно
if (doA()) {
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
return;
} else {
// I know A failed
return;
}
, что эквивалентно
if (!doA()) {
// I know A failed
return;
} else {
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
return;
}
Если код в «Я знаю, что Сбой» включает в себя возврат, товам не нужно беспокоиться о том, что код при условии doA()
соответствует действительности приведенному ниже коду;так что вы можете продвинуть нижний блок, вот так:
if (!doA()) {
// I know A failed
return;
}
if (doB()) {
if (doC()) {
// only here do I know it's good
} else {
// I know C failed
}
} else {
// I know B failed
}
return;