2016年1月14日木曜日

ねこもちです。 前回の続きで、処理を短くする系です。 ※処理そのものは短くなりませんね、良く考えると。パッと見の記述が短くなっているだけです。   ですが、これが本当に大事なことだと思います。 ■「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 コメント:

コメントを投稿