初心者質問ですみません。
オブジェクト指向は、モジュール間の結合をなるべく無くして設計することだと理解しているのですが、
なるべく普遍的な機能からモジュール化していくのが設計としては正しいのでしょうか?
ゲームルールに依存するような、変更箇所が多い部分を最初から完璧に設計するのは難しい気がするのですが、
ゲームプログラムをオブジェクト指向で書く上で意識している事、勉強になる文献などを教えていただきたいです。
> なるべく普遍的な機能からモジュール化していくのが設計としては正しいのでしょうか?
普遍的というのは、多くのオブジェクトから依存されるオブジェクトという意味ではありませんか?
結合をなるべく無くすというのは、その逆に依存度を下げていく作業です。
ゲームにこだわっていてはその辺りのことをきっちり説明する資料は少なくなります。
とりあえずゲームを好きに作った後で、ゲームに関係ない書籍でその辺りを学ぶという順番でいいと思います。
最初から完璧なものは作れません。
最初の作品は試作品と割りきった方がいいでしょう。
回答ありがとうございます。
普遍的、というのは例えばタイマーなどゲームルールに依存しないような機能、という意味で書いていました。確かに結合を無くす、というのはモジュール間の依存の話になるのでモジュールの内容が普遍的に使える機能であるか、とはまた別の話かもしれないですね。
例えばUniyの既存機能など色々な場所で参照されることが前提となっているコードもあると思うのですが
そのあたりの切り分けはプロジェクトによるのでしょうか。
自分は個人開発のため想像しづらいところもあるのですが…
オブジェクト指向の事を語ろうとするとかなり長くなりますからね〜😑
Unityの勉強と言うより、C#の勉強をメインで進めていくべきかもしれませんね😊
(もちろんどのオブジェクト指向言語から入っても良いですが、UnityならどちらにしろC#を使うでしょうし👀)
UnityとC#の両方を同時に勉強していくと結構間違った知識を覚えかねませんし🥺
すごい感覚的な回答ですいませんが(人それぞれかも👀)、
(1) 作りたい目標物を想像
(2) (1)に必要になりそうな物を想像
(3) (2)に必要になりそうな物を想像
...繰り返し
(4) 継承関係や機能でまとめれる物は無いか想像
(5) 一番小さいクラスから作っていく
みたいに、設計は上から(目標から)、開発はその逆みたいに出来ると理想ではありますね😊
(まぁ...完璧にこの理想通りに開発できたら苦労はしないんですが...😑)
ただ、ここら辺は訓練次第ですし、間違ってこそ学んでいくようなところがあります👀
「同じような処理よく書いてるな〜」を関数化する訓練は初歩。
「同じような構造よく書いてるな〜」を構造化する訓練も初歩。
「同じような構造+それに対する処理をよく書いてるな〜」をクラス化していく訓練でオブジェクト指向に少しずつ近づくかもしれません。
初心者の時に作ったソフトやコードを1年後(早ければ数ヶ月後)に見返すと全て書き直したくなりますよ😊私は今でもあるぐらいです...😅
どんな事でもいいので、クラスの設計をいろいろ試して見ることが近道な気がします👀
だんだんなれてきたらデザインパターンの勉強とか、MVCなどのモデルの勉強とかですかね😊
私の場合、座標とか線分とか折れ線とか長方形とか多角形とか円とかのクラスは既にライブラリにあるでしょうけど、そこから手作りしたこともありますね😅(Unityでは無くC++言語での開発の話ですが)
「線分と折れ線ってなんか構造似てないか?」とか「長方形って多角形に置き換えれるな🤔...あ〜でもメモリ的にはクラスを分けたいし継承も出来ない〜😭」とか悩み考えながら修行していった感じです😊
勉強法の後悔としては、「コードを減らす努力」をかなりしてしまっていたこと👀それよりも、「分かりやすい構造」「使う側が使いやすいクラス」にする方が圧倒的に大事だった🥺...というのは注意点ですかね👀
回答ありがとうございます。
コードを減らすよりも、分かりやすい構造、使いやすいクラスを意識する、というお話大変参考になります!
設計のお話なのですが、ミニゲームをいくつか作っていく中で
ルール変更が頻繁に起こるため、
ルールの中からなるべく普遍的に使えるもの(色んなルールでも使い方が変わらないもの)を抜き出してモジュール化した方がよいのかなぁ…?という疑問が起こったため質問致しました。
確かにまず基本のC#に立ち返って勉強すべきかもしれないですね。
設計手順も参考にさせて頂きます。
ミニゲーム1つにそれぞれルールを管理しているクラスがあり、共通点がたくさんあるなら親クラス(多分抽象クラス)などで定義するのはありかもしれませんね👀
モックなんかも注入出来るようにしておけばテストもしやすいです👀
ルールというからには処理だけではないでしょうからインターフェイスではなさそうですね🤔
あとルールならゲーム全体で使う可能性が高いでしょうからシングルトンクラスで実装もありかもしれませんね👀
全て推測ですがすいません😅
ありがとうございます!こちらこそ抽象的な話になってしまいすみません…
たしかに、ルール自体をインターフェイスにしておけば変更が容易になりそうですね。
一度試してみようと思います。