

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