组织条件并将它们放入方法中。
例如替换这个:
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 语句将清楚地描述正在测试的条件。不需要额外的构造。
关键是使代码更清晰和自我记录。如果您使用的是 OO 编程语言,则可以使用对象来存储状态(变量)并避免创建采用 5 到 10 个参数的方法。
这些是类似的问题:
摆脱嵌套 if 的最佳方法
是否有替代此超识别代码的方法
第二个链接显示了一种更完整和更复杂的方法,可以将可怕的每个维护者的噩梦转变为自我记录的代码。
它显示了如何转换它:
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();
}