CakePHP 3 のコントローラで IF ネスト地獄から脱出する方法
はじめに
プログラミングをしていて、IF の中に IF があり、またその中に IF が…なんてことはありませんか?
今日は、そんな IF ネスト地獄から脱出する方法を、CakePHP 3 のコードを例にしてご紹介します。
1. IF ネスト地獄って?
IF ネスト地獄とは、下記のように IF がいくつも入れ子になっているようなコードです。入れ子になっていると、コードの保守性が悪くなります。
/src/Controller/SampleController.php
class SampleController extends AppController
{
public function index()
{
if ($this->request->is('post')) {
何かの処理【1】
if (条件1) {
何かの処理【2】
if (条件2) {
何かの処理【3】
if (条件3) {
何かの処理【4】
}
}
}
}
}
}
これを解消する方法の一つとして、外部関数化する方法があります。
2. まずはそのまま関数化
まずはロジックを変えずに、ごそっと外部関数にしてしまいます。今回は ExampleComponent というコンポーネントに移すことを想定します。
/src/Controller/SampleController.php
class SampleController extends AppController
{
public function index()
{
$this->loadComponent('Example');
if ($this->request->is('post')) {
$this->Example->doNanika();
}
}
}
/src/Controller/Component/ExampleComponent.php
class ExampleComponent extends Component
{
public function doNanika()
{
何かの処理【1】
if (条件1) {
何かの処理【2】
if (条件2) {
何かの処理【3】
if (条件3) {
何かの処理【4】
return true;
}
}
}
return false;
}
}
3. IF の条件を変えて早めに return
上記の doNanika() では、各 IF の条件を満たす場合に処理を進める流れになっています。この各 IF を、下記のようにエラー終了用に変更することで、ネストを解消することができます。
/src/Controller/Component/ExampleComponent.php
class ExampleComponent extends Component
{
public function doNanika()
{
何かの処理【1】
if (条件1 でない) {
return false;
}
何かの処理【2】
if (条件2 でない) {
return false;
}
何かの処理【3】
if (条件3 でない) {
return false;
}
何かの処理【4】
return true;
}
}
4. おわりに
今回は CakePHP 3 のサンプルで IF ネスト地獄の解消方法をご紹介しました。
しかし、この考え方自体はフレームワークや言語に関係なく用いることができます。もし IF ネスト地獄になっている箇所があったら、コード改善にトライしてみてください。特に長い処理が書かれているときには、保守性がよくなりますよ。
また余談ですが、doNanika() で ture / false を返す必要あるの?と考えた方はよく見ていますね。
確かに今回の例では、SampleController で doNanik() の戻り値を使っていないので true / false でなくても良いのですが、イメージしやすくなればと思い、あえて ture / false を返すコードにしました。