CakePHP 3 のコントローラで IF ネスト地獄から脱出する方法

はじめに

プログラミングをしていて、IF の中に IF があり、またその中に IF が…なんてことはありませんか?

今日は、そんな IF ネスト地獄から脱出する方法を、CakePHP 3 のコードを例にしてご紹介します。

目次
  1. IF ネスト地獄って?
  2. まずはそのまま関数化
  3. IF の条件を変えて早めに return
  4. 終わりに

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 を返すコードにしました。