1

小さなアプリケーションで作業しているときに、コード設計の問題が発生しました。(ちなみに私は初心者です)

機能面では、それぞれ2席のテーブルのリストがあります。2人のプレーヤーが同じテーブルに座ると、ゲームが始まります。

この部分には、テーブルコントローラー、テーブルモデル、およびゲーム状態モデルがあります(ゲーム状態を作成すると、ゲームが開始されます)。

ユーザーが座ると、テーブルコントローラーによって処理されるajaxリクエストが発生します。このコントローラーは、テーブルモデルの適切なメソッドを呼び出して座ります。テーブルモデルが両方の席が埋まっていることを発見すると、ゲームが始まります。これは難しい部分です。

テーブルモデルでゲーム状態モデルを呼び出すのは面倒で、誰がゲーム状態モデルを呼び出すのかを追跡するのが後で難しくなる可能性があるため、私は望んでいませんでした。そこで、テーブルモデルが:success => trueハッシュをテーブルコントローラーに返すようにしました。テーブルコントローラーは、ゲーム状態モデルを呼び出すかどうかを決定します。

しかし、それから私はロジックをコントローラーに入れていることに気付きます。これはRails3Wayによればノーノーです。

私よりも経験豊富な人に、私に何ができるか教えてもらえますか?

また、「ユーザーがパーツを切断するとゲームを没収する」という問題もあります。現在、ユーザーは、アプリがまだ接続されていることを知らせるためにテーブルコントローラーをプルします。そして、その部分にゲームの没収を処理させることは、厄介で結合しているように見えます。

さらに、モジュール化を維持するために、JavaScriptコードにリソースのタイプごとに1つのsetIntervalプルを実行させています。しかし、その結果、間隔ごとに6〜7個の異なるAJAXリクエストを作成しています。そして、それは非効率的なようです。

4

1 に答える 1

3

わかりました。見てみましょう。

まず、どのモデルが他のどのモデルについて知っているかを決定する必要があります。私たちの場合、おそらく次のように言うことができます

GameState->テーブル->ユーザー

つまり、モデルは右側のすべてを知っており、左側のモデルについては何も知りません。このように、ユーザーモデルはテーブルモデル自体について何も知らず、テーブルに属していることを知っているだけなので、多くのロジックが自然にどこに属しているかをより簡単に判断できます。

それでは、ゲーム内のさまざまな「状態」について考えてみましょう。

  1. テーブルがいっぱいになるのを待っているゲーム前の状態
  2. ゲームの状態、そしてもちろんこれは多くのサブ状態になります
  3. ゲーム後、スコアがカウントされ、変数が更新されます

#1に関しては、これがテーブルに属していると最初に推測します。自分自身と自分自身の状態についてのみ知る必要があります。しかし、唯一の役割は、2つのシートがあり、それを埋めることができるということです。ゲームをいつ開始できるかなどを知る必要はありません。これは何を意味するのでしょうか?プレゲームはゲームの「状態」でもあるため、実際にはゲームをGameStateに委任する必要があります。GameStateは、必要に応じて「ゲートキーパー」になり、テーブルは単なるポーンです。そうは言っても、GameStateモデルにTableモデルを呼び出して、ゲームを開始できることを確認することをお勧めします。ユーザーがクリックしてテーブルに参加すると、GameStateコントローラーに移動します(ロジックがモデルに属していることを確認して、コントローラーがモデルのメソッドを呼び出していることを確認してください)。GameStateコントローラーは、このユーザーをテーブルに追加して、ゲームを開始できるかどうかを確認しようとします(テーブルは、すべてのシートがいっぱいになった場合にのみ戻ります)。もしそうなら、それは正しい情報をクライアントに送り返し、「OK!スタート!」と言います。

ゲームが開始されると、それ自体とそれに属するデータ(必要に応じてテーブルとユーザー)を操作するのはGameState次第です。ゲームが終了すると、GameStateは(そのメンバーとともに)自分自身をクリーンアップし、自分自身をデータベースにアーカイブします。つまり、全体として、GameStateはプロセス全体を見落としているように見え、テーブル/ユーザーはGameStateが操作する単なるデータです。

ユーザーの切断に関しては、多くのコンテキストなしで何をするのが正しいかを言うのは難しいかもしれません。しかし、私がこのようなものを作るとしたら、あなたがポーリングする必要はないようです。私が考えることができるのは、ユーザーがページから移動する(ブラウザーを閉じる、新しいURLを入力する、またはリンクをクリックする)かunload()、ユーザーが離れたことを通知する要求をサーバーに送信するために使用できることです。別の方法は、ユーザーが「切断」をクリックした場合です。これもサーバーに送信される別のリクエストです。

6〜7個のAJAXリクエストを送信する必要があるという点では、間隔ごとに少し過剰に思えます。本当に必要な場合は、すべてのリソースを1つのオブジェクトにパッケージ化し、間隔ごとに1つのオブジェクトを送信し、サーバーに操作させてから、オブジェクトが戻ってきたときに処理する必要があります。しかし、これらすべてのポーリングが必要なわけではないようにも思われます。GameStatesが合法的に移行していることを確認するために必要なのは、検証と、必要に応じて暗号化することだけです。

幸運を :)

于 2011-07-17T21:02:04.640 に答える