ガードクローズとは
こちらの記事に詳しいですが、要するに「メソッドの最初に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) の部分を省略することすら可能です。