2011-07-17 7 views
1

小さなアプリケーションで作業しているときにコード設計の問題が発生しました。 (私は初心者です)コントローラーに多すぎるロジックとモデルを呼び出すモデル

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

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

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

テーブルモデルのコールゲーム状態モデルを望みませんでした。なぜなら、ゲーム状態モデルを呼び出すことが後で難しくなる可能性があるため、頭がおかしくなり、トラッキングを追跡するからです。だから私はテーブルモデルを返すようにしました:成功=>真のハッシュテーブルコントローラ、ゲーム状態モデルを呼び出すかどうかを決定します。

しかし、私はコントローラにロジックを入れていることを認識しています。これは、Rails 3 Wayによれば、ノー・ノーです。

もっと経験が豊富な人が私に何ができるのか教えてもらえますか?

また、「ユーザーが一部を切断するとゲームが失われる」という問題もあります。現在のところ、ユーザはテーブルコントローラをプルして、自分のアプリにまだ接続されていることを知らせることができます。そして、その部分がゲームを失うことを扱うことは、厄介でカップリングしているように見えます。

さらに、私はJavaScriptのコードを、リソースの種類ごとに1つのsetIntervalプルを行い、モジュール化したものを維持しようとしています。しかし、結果として、私は6〜7種類のAJAXリクエストを毎回作成しています。そしてそれは非効率的だと思われる。

答えて

3

よろしくお願いします。

最初に、どのモデルが他のどのモデルについて知っているかを判断する必要があります。 >表 - - モデルはそれの右側にすべてを知って、そして左にモデルについて何も知らないことを意味>ユーザー

私たちのケースでは、我々はおそらく

GameStateような何かを言うことができます。このようにして、多くのロジックが自然に属する場所を簡単に判断できます。ユーザーモデルはテーブルモデル自体については何も知らず、テーブルに属していることが分かっているためです。

ここで、私たちがゲームで持っているさまざまな「状態」について考えてみましょう。待っているテーブルが

  • ゲームの状態を満たし、かつサブ状態の多く
  • 試合後、スコアがカウントされ、変数が更新されます。このコースをする

    1. 試合前の状態

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

    ゲームが開始されると、GameState自身とそれに属するデータ(必要に応じてテーブルとユーザー)を操作するのはGameStateの責任です。ゲームが終了すると、GameStateは(メンバーと一緒に)自身をクリーンアップし、dbに自身をアーカイブします。だから、GameStateは全プロセスを見過ごしてしまうようなオールインオールで、テーブル/ユーザはGameStateが操作するデータだけです。

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

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

    幸運:

  • +0

    ありがとう!これはすごく見えて、本当に物事をクリアします。しかし、1つのフォローアップの質問。私は、チャットメッセージ、着席状況、および他のユーザーによって開始されたすべてのものをチェックするためにポーリング(投票対プルを理解したことはない)を使用します。 (まだjuggernautのようなものを使用していない)last_checked_inアップデートを実行することは、コンピュータのクラッシュ、ブラウザのクラッシュ、およびその他の奇妙な状態でのユーザーの存在を取り除くために必要だったようだ。私はそれを間違っているのですか? – Max

    +0

    チャットがあれば、それを調べる唯一の方法はポーリング(つまりsetIntervalを使用)です。 [ポーリング](http://en.wikipedia.org/wiki/Polling_(computer_science))は、外部ソース(データベース)をサンプリングするときです。コンピュータ/ブラウザクラッシュは対処するのが難しい問題です。 Juggernautは、アプリケーションが拡張されると確かに行く方法です。あなたのlast_checked_inはまともな方法です。 15秒ごとにユーザー入力が必要なゲームタイマーがある場合、アプリケーションはユーザーがまだ物理的に存在するかどうかを検出できます。そうではありません、あなたは間違っていません。 :) – vinceh

    関連する問題