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