

| ◆ 関数の抜け方 | 
| 5つの処理をする関数があるとします。 その処理の途中で失敗した場合、関数を抜けてエラーを返しますね。 
bool Fnction5Step()
{
    if(!処理1){
        return false;
    }
    if(!処理2){
        return false;
    }
    if(!処理3){
        return false;
    }
    if(!処理4){
        return false;
    }
    if(!処理5){
        return false;
    }
    return true;
}
さて、この関数、もう一つ書き方があります。それは、こんな方法です。 
bool Fnction5Step()
{
    bool ret(false);
    if(処理1){
        if(処理2){
            if(処理3){
                if(処理4){
                    if(処理5){
                        ret = true;
                    }
                }
            }
        }
    }
    return ret;
}
どうでしょう、みにくいですね。コードは見やすく書くのが基本ですので、あまりこの書き方はお勧めできません。 しかし、この書き方が有効な場合もあります。 それは、こんな場合です。 
bool Fnction5Step()
{
    bool ret(false);
    // 関数内で動的にメモリ確保し、使用する
    int* a = new int;
    if(処理1){
        if(処理2){
            if(処理3){
                if(処理4){
                    if(処理5){
                        ret = true;
                    }
                }
            }
        }
    }
    // 関数内でしか使わないので、使い終わったら解放
    delete a;
    a = NULL;
    return ret;
}
違いが分かるでしょうか?関数内で動的にメモリ確保した場合、関数内で解放しなければなりませんね。 これを前の書き方で書くと、関数を抜ける場面で毎回確保のコードを書かなければなりません。 
bool Fnction5Step()
{
    int* a = new int;
    if(!処理1){
        return false;
        delete a;
        a = NULL;
    }
    if(!処理2){
        return false;
        delete a;
        a = NULL;
    }
    if(!処理3){
        return false;
        delete a;
        a = NULL;
    }
    if(!処理4){
        return false;
        delete a;
        a = NULL;
    }
    if(!処理5){
        return false;
        delete a;
        a = NULL;
    }
    delete a;
    a = NULL;
    return true;
}
こうすると、同じコードが何回も出てきてしまう上、処理を一つ足したときに解放忘れをしてしまう恐れもあります。なので、こういう場合はメモリ確保・解放を一箇所で行える、後の書き方の方が保守しやすいコードと言えるでしょう。 コーディングに、必ずこうしなければならない、という決まりはありません。 ケースバイケースで、見やすく理解しやすいコーディングをしましょう。 |