ひとつのクラスにあれこれ機能を追加していくと、「神クラス」と呼ばれるひとつの巨大なクラスが作られたりします。1つのスクリプトで1,000行あったりするやつです。アセットストアでキャラクター3Dモデルを買うと、くっついていたりします。
god

あなたは「神」を悪だというのか

個人が即興で作り上げて、その場で役割を終えるのなら、「神クラス」でも大きな問題にはならないかもしれません。

しかし、その後メンテナンスを続けたりする場合には大きな負担になったり。

また、「なぜか動かないんだけど、みてみて」と誰かに問い合わせる場合も、1,000行もあるコードの全体を丁寧にチェックしてくれるのは、かなーり親切な人に限られるでしょう。

などなど、あまりよいものとはみなされない感じです。


・・・ただし、「良い設計」というのは終わりのない求道的な取り組みでもあるようです。

なので、「完璧な設計ができるまでは恥ずかしくて世に出せない」という考えもまた誤りでしょう。お勉強しつつも基本的には実践の中で試行錯誤して、一歩ずつ改善していくものなのかなと。


前置きはこのへんで。


自分が気を付けていること

「神クラス」化を避けるために、最近自分が気を付けていることはこんな感じです。3つほど。


「〇〇Manager」や「××Controller」を作る前に、いったん立ち止まる

GameManager」や「PlayerController」というクラスを作ろうとしたときに、「Manager」「Controller」という言葉に反応して、いったん立ち止まるようにしています。経験上、これらの単語が付けられたクラスは大きくなりがちなので。

たとえば「PlayerController」は、「PlayerMove」と「PlayerAttack」と「PlayerHealth」に分けられないか、とか。(Unity公式の Survival Shooter チュートリアルではこんな感じに分けていますね)

GameManager」は、「ScoreManager」と「AudioManager」とほにゃららに分けてみようかな、とか。(立ち止まって考えた後に××Managerと名付けるのはアリ)

(ぐぐってみると、「"Util" クラスは作るな」的な記事を見かけたりしました。それと似たような考え方かも)


既存のクラスに処理を追記しようとしたときも、立ち止まる

クラスを作るときだけではなく、既存のクラスに追記しようとしたときにも立ち止まるようにしています。「これ、ほんとに既存クラスに追記しなきゃダメなの?」と。

たとえば既存の「PlayerMove」クラスには左右に歩く処理が書かれていて、そこにジャンプ処理を追記しようとしたとき、PlayerMove とは別に PlayerJump クラスを作ってみようかな、とか。

そんで、PlayerJump を作るのと合わせて、既存の PlayerMove クラスは PlayerWalk クラスに名前を変えておこうかな、とか。(Visual Studio などの IDE の力を借りれば、名前の変更はそれほど大変ではありません)


1クラス100行以内に収めたいと、願う

1クラスあたり100行以内には収めたいという「目安」を設けています。絶対に禁止というものではなく、あくまで目安ですけど。

けっこう100行以内には収まったりします。かんたんなゲームしか作っていないから、ってのも大きいかもしれませんけどね。


分割してシンプルになったクラスのスクリプトは、別のプロジェクトでも使いまわせたりします。「お、いい感じにシンプルになったな」と思ったら、Gist にでも突っ込んでおくといいかも。


今回は以上です。