0

したがって、この質問は、ここからの一種のフォローアップです(複数のイベント引数を処理する方法)。その質問は私にこれについて考えるように導きましたが、それ自身のスレッドを正当化するのに十分異なっています。

私は(楽しみと学習の目的で)ゲームを作成していますが、デザインに優れた基準を使用しているかどうかを知りたいです。関心の分離でOTTに移行したか、全体が間違っていたのではないかと思いますが、そうではないことを願っています。「ベストプラクティス」とその実用化を学びたいので、書き直しても問題ありません。

編集

ゲームについてもう少し説明しましょう。これは、多くの携帯電話で見られるゲームであるJawbreakerに基づいています(クイックデモはここにあります)。目的は、グループに含まれるボールを選択して、それらをプレーから除外し、できるだけ多くのポイントを獲得することです。

私はそれを少し拡張しようとしていて、ボードの種類、ボールの動き、ボールの種類が異なります。ボールは指示された場所に移動するか、途中で何かをする可能性があります。

これが私が作成したオブジェクトの構造です。上の行はDLLとそのオブジェクトを示し、2番目の行はそれらのオブジェクトが参照するものを示しています。

代替テキスト
(出典:ggpht.com

これがUMLを実行するための私の試みです。

代替テキストhttp://yuml.me/3279d2ac

UMLの全ページにリンクするには、ここをクリックしてください。少し大きくなり、読みやすくなります。

オブジェクトDLLは、ゲームで使用される基本的なオブジェクト、ボール、およびボードを保持します。それらには、状況にどのように作用/反応するかについてのロジックは含まれていません(ボールはCompareToメソッドとEqualsメソッドを実装しています)。IBallの実装はX個ある可能性があります(IBoardについても同じですが、私が想像するほど多くはありません)。

InstanceManager DLLは、オブジェクトを作成する方法として使用されます。これが100%必要であったかどうかは、ObjectsDLLに含まれている可能性があります。ファクトリは、IBallオブジェクトを作成するためのさまざまなオーバーロードされたメソッドを持つ静的クラスです。BallFactoryは、BallType列挙型、Drawing.Colorオブジェクトなどを受け取ることができます。BoardFactoryは非常によく似ています。Jawbreakerは、非常に定期的に使用されるランダムオブジェクトや一部のGameConfigurationデータ(このトピックにはあまり関係ありません)の保持などを処理するシングルトンオブジェクトです。

エンジンDLLは、ほとんどの作業が行われる場所です。LogicFactoriesは、BallTypeオブジェクトとBoardTypeオブジェクトを使用して、関連する論理オブジェクトを作成します。ロジックオブジェクトは、IBallおよびIBoardオブジェクトの動作を制御するために使用されます。BallLogicは、イベントが発生したときに何ができるかをボールに伝えます。たとえば、ボールが選択されると、ボードYのボールXが選択されたことを示すメソッドがボールロジックで呼び出されます。その後、ボールは、そのタイプのボールが実行すべき/実行できることは何でも実行できます。BoardLogicは非常によく似ており、ボードの動作を処理します。

エンジンオブジェクトは別のシングルトンであり、GUIがゲーム全体とどのように相互作用するかを示します。GUIは、他のオブジェクトを直接インスタンス化しません。

したがって、IBallクラスとIBoardクラスはそれらに関するデータのみを保持するため、Logicクラスはすべての機能を処理します。

私が知りたいのは:

1)これは賢明なアプローチですか?

2)(一般的に)ロジックはオブジェクト/データから分離する必要がありますか?

3)関心の分離に行き過ぎていませんか?

4)設計/構造に関するその他のコメント

編集

私がいくつかのシングルトンを使用した理由の一部は、オブジェクトを常に保持せずに1つの場所でデータにアクセスすることを簡単にするためです。また、単一のゲームであり、ハイエンドまたは複数のマシンにまたがってスケーリングされないためです。 。それらは素晴らしいものではなく、私が定期的に使用するものでもないことは理解していますが、コメントに感謝します。

ご意見・ご感想をお寄せいただきありがとうございます。

4

2 に答える 2

2

あなたの内訳は正しい方向に進んでいるようです。ただし、ロジックからプレゼンテーションのデータを分離しようとしているかどうかはわかりません。MVC、オブザーバー、戦略のパターンを見てみましょう。

これを念頭に置いてください: アプリケーションを疎結合に設計する場合には、トレードオフがあります。より少ない労力でアプリケーションを拡張できますが、パフォーマンスとメモリ使用量が低下します。また、言いたくないのですが、不要なインターフェイスを作成しないでください。オブジェクトの機能を今すぐ拡張するか、後でインターフェースを作成することがわかっている場合は、実装する前に考えてください。

于 2009-12-17T17:15:56.767 に答える
1

自分が何をしようとしているのかをよく理解していなければ、自分のデザインを批評することは困難です。ボールとボードが関係していることは知っていますが、それ以外はわかりません。

できるだけシングルトンを避けるようにしてください。はい、GoF の本にリストされていることは知っていますし、それが一般的なパターンであることも知っていますが、私の経験では、最終的にアンチパターンになってしまいます。

IBall と IBoard には、それらがどのように相互作用するかについてのロジックがないと述べています。それは彼らが何の方法も持っていないことを意味しますか?彼らのメソッドは、プライベート データの getter と setter にすぎませんか? IBall と IBoard が単なる構造体 (または同等のもの) である場合、それらはインターフェイスである必要はありません。IBall と IBoard に送信できるメッセージの種類について、説明を具体化していただけますか?

2) (一般的に) ロジックはオブジェクト/データから分離する必要がありますか?

時々。単純な古いデータがある場合は、ロジックを単純なデータから分離しても問題ありません。もちろん、もう OOP を行っているわけではありません。手続き型のコードを書いているのです。あなたは、Ball に動作をハードコーディングしたくないという欲求に苦しんでいると思います。おそらく、ボールがどのように相互作用するかを決定する責任を他のエンティティが負う必要がありますが、ボールが決定に参加する余地はまだあります. ここで、(他のパターンの中でも) 戦略パターンが登場します。現実の世界で物事がどのように機能するかを考えてみてください。物理的なボールと物理的なボードはどのように相互作用を調整するのでしょうか? 彼らがお互いに話すとしたら、彼らは何と言うでしょうか? コードでそれを実装できるかどうかを確認してください。

最後にデザインについて一言。「デザインをきちんとしたい」と思うのはいいことだと思います。一方で、それが建築宇宙飛行士への道でもあります。コードベースで現在抱えている問題を検討してください。

  • リファクタリングは難しい?
  • 新しいタイプのものを追加するのは難しいですか?
  • 「ハードワイヤード」が多すぎますか?

デザインは真空の中に存在するのではなく、世界の現状から情報を得ています。人々が思いつくクレイジーな携帯電話のコンセプト アートをいくつか見てみると、悪いデザインの良い例がわかるでしょう。携帯電話は現在の技術では限界があり、現実世界の制約を無視したデザインは夢にすぎません。ソフトウェアでも同じです。コードが何を必要としているかに注意を払えば、うまくいくでしょう。

より多くのソフトウェアを作成 (および完成) するほど、より多くの経験が得られ、美的感覚が向上します。「間違ったことをする」ことを恐れて、ソフトウェアの完成を妨げないでください。辛抱強く、それを機能させ、プロセスから学んだことを確認してください。

于 2009-12-17T19:56:37.310 に答える