[UNITY]2DRPG開発日誌 #63 if分岐を読みやすくする方法(ガードクローズ)

UNITY

ガードクローズとは

こちらの記事に詳しいですが、要するに「メソッドの最初にreturnを置いてコードを整理する」という意味です。

例えば、プレイヤーの攻撃を行うこういうメソッドがあったとします。

class PlayerAction
    {
        bool isCutScene;
        bool isBattle;
        bool isTalking;
        bool isStanding;

        void PlayerAttack_1()
        {
            if (isCutScene == false)
            {
                if (isBattle == true)
                {
                    if (isTalking == false)
                    {
                        if (isStanding == true)
                        {
                            Attack();
                        }
                    }
                }
            }
        }
    }

読みにくいですね。ちょっと直すと、こんな書き方ができます。

    class PlayerAction
    {
        bool isCutScene;
        bool isBattle;
        bool isTalking;
        bool isStanding;

        void PlayerAttack_2()
        {
            if (!isCutScene)
            {
                if (isBattle)
                {
                    if (!isTalking)
                    {
                        if (isStanding)
                        {
                            Attack();
                        }
                    }
                }
            }
        }
    }

あまり変わりませんね。人によっては前のほうが見やすいでしょう。

さらにちょっと直すと、こうなります。

 

    class PlayerAction
    {
        bool isCutScene;
        bool isBattle;
        bool isTalking;
        bool isStanding;

        void PlayerAttack_3()
        {
            if (!isCutScene
                && isBattle
                && !isTalking
                && isStanding)
            {
                Attack();
            }
        }
    }

だいぶスッキリしましたね。ただ、これでは拡張性がありません。

最後に、ガードクローズを使ってみましょう。

 

    class PlayerAction
    {
        bool isCutScene;
        bool isBattle;
        bool isTalking;
        bool isStanding;

        void PlayerAttack_4()
        {
            if (!isCutScene)
                return;

            if (isTalking)
                return;

            if(isBattle && isStanding)
                Attack();
        }

    }

こうしてreturnするフラグが明確であれば、コード全体が読みやすく、かつ拡張性も担保できますね。場合によっては if(isBattle && isStanding) の部分を省略することすら可能です。

UNITY
スポンサーリンク
Follow Us
KITTYPOOL
タイトルとURLをコピーしました