Организуйте условия и поместите их в метод.
например, замените это:
if( a& & n || c && ( ! d || e ) && f > 1 && ! e < xyz ) {
// good! planets are aligned.
buyLotteryTicket();
} else if( ..... oh my ... ) {
}
В это:
if( arePlanetsAligned() ) {
buyLotteryTicket();
} else if( otherMethodHere() ) {
somethingElse();
}
Таким образом, на самом деле не имеет значения, какой стиль вы используете (1, 2 или 3), потому что оператор if будет четко описывать тестируемое условие. Нет необходимости в дополнительных конструкциях.
Смысл в том, чтобы сделать код более понятным и самодокументируемым. Если вы используете язык программирования ОО, вы можете использовать объект для хранения состояния (переменных) и избегать создания методов, которые принимают 5-10 параметров.
Это похожие вопросы:
Лучший способ избавиться от вложенных ifs
Есть ли альтернатива этому гиперидентифицированному коду
Вторая ссылка показывает более полный и сложный способ превратить ужасный кошмар каждого сопровождающего в самодокументируемый код.
Показывает, как это преобразовать:
public String myFunc(SomeClass input)
{
Object output = null;
if(input != null)
{
SomeClass2 obj2 = input.getSomeClass2();
if(obj2 != null)
{
SomeClass3 obj3 = obj2.getSomeClass3();
if(obj3 != null && !BAD_OBJECT.equals(obj3.getSomeProperty()))
{
SomeClass4 = obj3.getSomeClass4();
if(obj4 != null)
{
int myVal = obj4.getSomeValue();
if(BAD_VALUE != myVal)
{
String message = this.getMessage(myVal);
if(MIN_VALUE <= message.length() &&
message.length() <= MAX_VALUE)
{
//now actually do stuff!
message = result_of_stuff_actually_done;
}
}
}
}
}
}
return output;
}
в это:
if ( isValidInput() &&
isRuleTwoReady() &&
isRuleTreeDifferentOf( BAD_OBJECT ) &&
isRuleFourDifferentOf( BAD_VALUE ) &&
isMessageLengthInRenge( MIN_VALUE , MAX_VALUE ) ) {
message = resultOfStuffActuallyDone();
}