検索
異常系の処理は難しく、そして大切です。 正常系の処理を実装することは最低ラインで、異常系を確実に処理することで頑丈なシステムになります。
異常系というと例外をイメージしますが、他にもチェック処理ではじくような処理も同じようなことがいえます。 そして下のようにはじいた時の処理が後に回されているのをよく見かけます。
private void MethodA() { if(this.ChackProcA()){ if(this.ChackProcB()){ if(this.ChackProcB()){ /* * * * 目的の処理 * * */ }else{ //メッセージ表示など } }else{ //メッセージ表示など } } }
とにかく目的の処理(正常系)を実装するために一生懸命なのが見て取れます。
後付けではじいた時の処理を記述しています。
ifに対するelseがあるのかもわからないし、
[目的の処理]が長い場合は、スクロールさせた結果、上の方にあるifのelse処理と記述が離れ見通しがよくありません。
これをifの条件を逆転させ、はじくべき処理を先に記述すると次のようになります。
private void MethodA() { if(!this.ChackProcA()){ }else{ if(!this.ChackProcB()){ //メッセージ表示など }else{ if(!this.ChackProcB()){ //メッセージ表示など }else{ /* * * * 目的の処理 * * */ } } } }
やるべき事を先に終え、最後に[目的の処理]を腰を据えて見ることができます。
ifに対するelseも直下にあるので、後でelseがひょっこり現れることもありません。
[目的の処理]の行数が多ければ多いほどこの記述は有効になります。
しかし条件の数だけネストしていることや、if文が全体に掛かっていることは変わりありません。
次のようにreturnを使用しメソッドを抜けるようにすると次のようになります。
private void MethodA() { ------------------------------------------------ if(!this.ChackProcA()){ return; } ------------------------------------------------ if(!this.ChackProcB()){ //メッセージ表示など return; } ------------------------------------------------ if(!this.ChackProcC()){ //メッセージ表示など return; } ------------------------------------------------ /* * * * 目的の処理 * * */ ------------------------------------------------ }
チェック結果毎に処理を抜けるのでネストがなくまります。 さらに横線("-----")で引いたように、 1ブロック毎に独立して見れるので意味的にもわかりやすく、頭も個別に考えるので楽です。
処理をはじくような場合に有効です。
このようなコーディングを心がけることで、同じ内容であってもスッキリと分かりやすい記述をすることができます。