ゲームプログラミングをimmutableで行うには、イベントドリブンでグローバルなStateを持つのが楽そうだけど、どうだろう?

2

仕事ではサーバーサイドPHPしかやっていないため、新しい学びを得るためにゲームプログラミングをやってみました。
BlackJackならモデル数が少なくなると思いテーマに選択。

ゲームプログラミングの設計で良い情報は見つけれていません。調べるのに時間がかかりそうなので、とりあえずリファクタリングして書きながら考えたことを雑に綴りました。

mitsuru @mitsuru793

PHPでBlack Jackを作りました。(途中) ローカルのスタンドアローンか、データをサーバーで管理するHTTP通信かでベターな方法が変わると思います。今回は前者で、CUIでviewを用意しました。 pic.twitter.com/rsOMZH6KVp

2020-04-02 00:22:50
拡大

ユーザーが操作を入力するたびに、ログとしてカード情報が毎回全部出力されます。
標準出力を消して上書きするタイプのアップデート型のレンダリングにはまだ出来ていないです。

mitsuru @mitsuru793

ゲームプログラミングはmain関数とかが無限ループになると思う。ユースケースクラスの役割を導入した時、戻り値を再代入するimmutableの実装ってどうやるのだろう? HTTP通信と違ってステートレスではなく、ステートフルだから戻り値の再代入だと難しい気がした。

2020-04-02 00:06:06
mitsuru @mitsuru793

全体をimmutableにしようとすると、react/reduxみたいにイベントドリブンにして、グローバル空間にstateを持たせるしかいい方法ない気がする。というよりゲームを書いていて自然とその形の発想になった。 戻り値でimmutableにするの無理がありそうなので、今はmutableで実装している。

2020-04-02 00:08:35
mitsuru @mitsuru793

ゲームプログラミングの設計を検索してても分かりやすそうなのはすぐに見つからなかった。 PHPで型付けされたstateを管理するのきついと思う。typescriptだったら型付け楽なのにな。 property typeが7.4で入ったから、ゲッターやめてpublic propertyを宣言してもそんなに問題なさそう。

2020-04-02 00:10:52
mitsuru @mitsuru793

RubyやJavaScriptだととりあえずpublicプロパティ生やして、後から自動で呼ばれるゲッターとか作れるのが良い。 PHPだとそれができないので、__callによるマジックメソッドを使ったprivateメソッド宣言を利用するライブラリを作るしかない。

2020-04-02 00:12:54
mitsuru @mitsuru793

Property Typeと完全コンストラクタのVO(immutable)を組み合わせるなら、VOのコンストラクタでバリデーションできる。 public propertyの再代入するのはimmutableな値だけにできる。 それを言語で制限できないけど、VOを徹底さえすれば問題なさそう。

2020-04-02 00:15:31
mitsuru @mitsuru793

ビジネスロジックのプログラミングを快適にして、なるべくそこにリソースを注ぎたい。 ゲッターがあれば安心感はあるけど、この形でめっちゃ困ることがあるのかな。 これは本当に大きなプロジェクトで試してみないと、分からない事だと思った。

2020-04-02 00:17:42
mitsuru @mitsuru793

ゲームプログラミングは結局どれが良いだろう 1. immutableの実装をやめる 2. immutableかつ、イベントドリブンでグローバルなstateを持つ 3. WebプログラミングのDDDみたいに愚直に戻り値とか書く(大変)

2020-04-02 00:19:49