前書き
はじめてテラテイルを利用する者です。質問の仕方に不備があったらすみません。
質問への導入
現状を大雑把に書くと、Unityでゲームを作っていて、途中からクラス設計というものを知り書き直してみたものの、しっくり来ない/直感に反する、という感じです。リズムゲームを制作中なので、それを基に話します(一部改変)。
全てのクラスはMonoBehaviorを継承しているとします。
質問に登場するクラスは、わかりにくいかもしれませんが図を添えています。良ければ参考にしてください。
上下関係をつけてみた
昔、Javaの講義でクラスを階層構造のようにしていたのを思い出し、Unityで良くある〇〇Managerクラス等は上層。ゲームを構成するNote(ノーツにアタッチ)クラス等は下層として、現在制作中のコードを書き直しました。
Noteクラスの工夫
ノーツは大量に生成される故になるべくフィールドを持ちたく無いので、ノーツ間で共通の値はNoteInfoクラスにまとめる事にしました。これでNoteはNoteInfoの参照を持っていればOKです。(ゲーム実行後に確定する値もあります)
NoteInfoの中身
ノーツを動かす処理(Noteクラス)では、「合計3つのクラス」が保持する値が必要です。NoteInfoクラスではその3クラスへの参照を格納しており、Noteクラスはこの3つの参照を適宜取得して必要な値を得る仕組みです。
違和感
NoteInfoクラスが参照する3つのクラスは、Noteだけでなく他の色々なクラスでも必要です。つまりその3クラスは全体に関わる情報ということです。しかし、冷静に考えてみると違和感があります。それは、全体に関わるクラスが下層に来ていることです。
上下関係と捉えるのが間違い?
パフォーマンスとコードの質はトレードオフと何処かで聞いた覚えがあります。
という事は「Noteにはフィールドをたくさん持たせたく無い」というパフォーマンス重視の状況が、コードの質(今回で言えばクラスの上下関係)を狂わせているのではないかと考えました。
質問
この違和感はどう克服すれば良いのでしょうか。クラス設計はケースバイケースとも聞くので「上下関係という認識を捨てる」のも選択肢なのでしょうか。はたまた私が知らない「もっといい方法がある」のでしょうか。アドバイスを頂きたいです。
※なるべく誤解の無いように詳しく書いたところ、かなりの長文になってしまいました。ここまでお読みいただきありがとうございます。ここに書かれていない事情もあるのですが、それを書き始めるととんでもなく長くなるので、適宜お伝えします。
追記・修正について
ご依頼ありがとうございます。
【上下関係について】
上下関係というのはhas-a関係や規模の大小などで決めています。基本はhas-aで決めていこうと心に誓っていたものの、複数のクラスが共通して1つのものを持ってる場合等、よくわからなくなった時は、規模で決めています。
とはいえ、実体があるものとないものが混在しているため、何をもって規模が大きいかは感覚で決めています。そのため、具体的な意味は上記のような曖昧な基準となります。
例えば車と法律の規模を比べてと言われたら、そもそも比べるのが間違いかもしれませんが、「法律>車」という事がイメージされます。
上下関係はこれくらい曖昧です。なので「上下関係と捉えるのが間違い?」という項目で、そもそも上下関係なんて付けるから、感覚に反する構造になるのでは?という事を語るつもりだったのですが、忘れていました。言葉足らずとなってしまいすみません。
【違和感について】
これは「困っているけど質問が言語化できない」という段階から何とか言語化した質問になります。「違和感」というのは何故困っているのかを言語化した時に最も現状に当てはまる表現だったので使いました。しかし、質問本体を「違和感」一語で済ませるとわかりにくかったかもしれません。すみません。
私はその違和感の正体は「全体に関わるクラスが下層に来ている」ことであると書きました。つまり、違和感の克服とは「全体に関わるクラスが下層に来ている」という状態を克服することです。
では何故「全体に関わるクラスが下層に来ている」かというと、Noteクラスがパフォーマンス重視であるため・そもそも上下関係を付ける事が間違っているため…と見当を付けています。
なので質問本体を書き換えるなら、
「全体に関わるクラスが下層に来ている原因は上記の通りですが、上下関係という認識を捨てるべきなのでしょうか?それとも私の知らない方法があって、それを使えば解決できるのでしょうか?みなさんの経験から考えて、どのように対処すべきか教えてください。」
となると思います。
想定する回答には「上下関係という認識は捨て、具体と抽象で考える方が適切に思えます(上下関係の是非)」や「〇〇を継承するとデータだけ別の括りで管理できます(知らない方法)」のようなものを期待しています。
回答2件
あなたの回答
tips
プレビュー