アトリエ ぺっぺ

トップページ > プログラムTips > 関数の抜け方

◆ 関数の抜け方
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;
}
こうすると、同じコードが何回も出てきてしまう上、処理を一つ足したときに解放忘れをしてしまう恐れもあります。
なので、こういう場合はメモリ確保・解放を一箇所で行える、後の書き方の方が保守しやすいコードと言えるでしょう。
 
コーディングに、必ずこうしなければならない、という決まりはありません。
ケースバイケースで、見やすく理解しやすいコーディングをしましょう。
 


(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp