ねこもちです。
前回の続きで、処理を短くする系です。
※処理そのものは短くなりませんね、良く考えると。パッと見の記述が短くなっているだけです。
ですが、これが本当に大事なことだと思います。
■「ifのネストが多く、ifとelse節の対比が難しい」
下記のような関数があったとします。
void foo()
{
var 結果A = 処理A();
if( 結果A == 成功 )
{
var 結果B = 処理B();
if( 結果B != 成功 )
{
var 結果C = 処理C();
if( 結果C == 成功 )
{
処理D();
}
else
{
失敗Cのリカバリ処理;
return 失敗C;
}
}
}
else
{
return 失敗A;
}
処理F();
return 成功;
}
ifが3段もネストしていて、途中で抜けたり、抜けなかったり、
else節があったりなかったり、
このメソッドでは、何が起きるのかを知るのは非常に難しいのです。
まず、結果Aのifのネストを解消します。
void foo()
{
var 結果A = 処理A();
if( 結果A != 成功 )
{
return 失敗A;
}
var 結果B = 処理B();
if( 結果B != 成功 )
{
var 結果C = 処理C();
if( 結果C == 成功 )
{
処理D();
}
else
{
失敗Cのリカバリ処理;
return 失敗C;
}
}
処理F();
return 成功;
}
次に、結果Bのifのネストを解消します。
結果Bが成功だったら、処理F()のあと成功返しているので、そのようにします。
void foo()
{
var 結果A = 処理A();
if( 結果A != 成功 )
{
return 失敗A;
}
var 結果B = 処理B();
if( 結果B == 成功 )
{
処理F();
return 成功;
}
var 結果C = 処理C();
if( 結果C == 成功 )
{
処理D();
}
else
{
失敗Cのリカバリ処理;
return 失敗C;
}
処理F();
return 成功;
}
同様に結果Cのifもthen節でreturnするようにします。
void foo()
{
var 結果A = 処理A();
if( 結果A != 成功 )
{
return 失敗A;
}
var 結果B = 処理B();
if( 結果B == 成功 )
{
処理F();
return 成功;
}
var 結果C = 処理C();
if( 結果C != 成功 )
{
失敗Cのリカバリ処理;
return 失敗C;
}
処理D();
処理F();
return 成功;
}
こうすることで、処理と失敗時の処理が近づき、非常に読みやすくなりました。
こういう書き方のとき、このif群を「ガード節」というようです。
0 コメント:
コメントを投稿