ルールシステムのデザインパターン?


12

簡単な楽しいプロジェクトとして、ソリティアゲームを作成してみました。しかし、ルールシステムを作成するときに、主にゲームロジックが完全なスパゲッティコードであるため、コードが完全に構造化されておらず拡張性がないと感じたため、汚いと感じました。

私は以前にこの問題に遭遇しましたが、私のプログラムのこの部分を書くときはいつも気まずい思いをしていましたので、ゲームのルールを定義することに関して、試行されテストされたベストプラクティスはありますか?


回答:


2

多くの思いやりが特定の問題から生じるため、私はユニークな解決策があるとは思わない。

モデルビューコントローラーパターンを使用できます。これにより、問題が「コントローラーに動作を実装する方法」、つまり常にルールに従う動作に問題が移動します。

非常に単純な規則について話さない限り、それらを整理する方法は表現力の問題を提起します。あなたは常に単純であり(構造化されている)、表現力がある(楽しいルールを書く)という相反する要求に直面しています。

MVCを使用すると、モデルが状態、つまりルールが適用されるコンテキストを形式化するため、ジョブが簡素化されます。

そうは言っても、より単純な切り替え可能な動作に関して複雑な動作を構成するために、戦略パターンおよび/または状態パターンを使用してコントローラーを実装すると便利な場合があります。チェーン・オブ・resposibilityパターンは、その「状態」は、部分的に「状態」のモデルの意味と重なるため、ステートマシンは慎重に使用する必要がありながら、ルールを表現するためにあなたを助けることができます。

コントローラー内でコマンドパターンを使用すると、コントローラーの応答性が低下し(コマンドがモデルの処理方法を知っている)、コントローラーに元に戻す/やり直し機能を簡単に追加できるようになります。

とにかく、デザインパターンをガイドラインとして使用してみてください。ホイール、特にスクエアホイールの再発明を避けるのに役立ちますが、すべての問題の解決策が(丸い)ホイールの束で構成されているわけではありません。


2

私は最高か、さらには良いかどうかはわかりませんが、通常はObserverパターンを使用します。それは私にとって十分に機能しました。


1
例を作ってもらえますか?
グスタボマシエル

各ルールにオブザーバーを作成し、ゲームの状態にアタッチできます。各ターンのゲーム状態の後、すべてのオブザーバーを呼び出して、これらのルールのいずれかが適用されているかどうかを確認します。
Ali1S232

0

これまで何度も仕事をしていない限り、常にスパゲッティコードになります。実際、この時点で、あなたはまだ始まったばかりです。あなたが持っているのは、予備的な仕様の大まかなドラフトです。ここで他のアドバイスのいくつかをチェックし、いくつかの深刻な書き換えを行ってください。そして、さらにいくつかの書き換え、そして....個人的に、私は自分のコードを本当に素晴らしい形にするのか、それとも書き換えにうんざりするのかわからない、最終的には正しくなるようだ

両端から問題に取り組む。全体的なデザインが理にかなったものになるようにし簡単な雑用を処理する小さな部品を選び、それらを正しくするようにしてください。次に、両端から中央に向かって作業を試みます。そして、真ん中から両端に向かって作業します。次に、上から下へ、次に下から上へ。その後、プロセス全体を繰り返します。

基本的に、あなたが持っているのはクラスのコレクションです。クラスAを検討してください。クラスAが適切に構築されている場合、クラスAを使用するクラスは、良いか悪いかに関係なく、自動的に動作します。うまくクラスAが使用するクラスならば、それらの使用のクラスがより行います、しかし、良いか悪いか、彼らはあります。そのため、クラスをできる限り最善の方法で編成し、それぞれが可能な限り最高のクラスであることを確認してください。

できる限り正しく取得することが重要です。悪いコードは、あなたがそれを捨てる日まであなたを悩ませます。ソフトウェアを使用すると、多少の余分な磨きが常に効果があります。(コードを使用してしまう人がいない限り...)

要約すると、他の回答で与えられた実際のアドバイスを確認し、好きなものが得られるまでコードを書き直してください。


あなたの答えは基本的に「他の答えを読んできれいなコードを実行するか、後悔するでしょう」
...-kaoD

@kaoD:はい。しかし、最初のコーディングの試みはおそらくジャンクになるでしょう。(そうでない場合は、十分な努力をしていないことになります。)それをまとめるには、少しの研究と多くの思考とともに、多大な労力が必要です。これは、関連するプログラムを作成するときの正常な動作です。この方法で費やされたすべての努力は、長い目で見れば時間、努力、悲しみを節約します(プログラムがまだ長い目で見れば)。また、OOPを使用すると、OOPを活用できます。(コードを見ずにできることです。)
RalphChapin

4
あなたが実際に質問に答えていないことに気付いていますか?
-kaoD

実際、Ralphの投稿が技術的に回答であったかどうかに関係なく、Ralphの回答は、そもそも質問をする動機の動機に向かっていたと思います。私は、最初の試行でコードを最適に設計することはめったにないという認識に至っていないコーダーにとって大きな価値があると思います。また、彼は、ラルフの経験から生まれたと思われるそれに対処するアプローチを提供しました。
スティーブH

@SteveH彼の答えは、ほとんどすべてのソフトウェアエンジニアリングプロセスに当てはまると思います。どこにでもコピーして貼り付けることができ、収まります。
kaoD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.