条件を整理し、メソッドに入れます。
たとえば、これを置き換えます。
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個のパラメーターを受け取るメソッドの作成を回避できます。
これらは同様の質問です:
ネストされたifを取り除くための最良の方法
このハイパーアイデンティティ化されたコードに代わるものはありますか
2番目のリンクは、恐ろしい全員のメンテナの悪夢を自己文書化コードに変換するためのより完全で複雑な方法を示しています。
これを変換する方法を示しています。
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();
}