2011-11-09 7 views
2

私は、ユーザーがページ上で見るものを制御するクラスを持っています。いくつかの州があります。最初のビューセットはユーザーオブジェクトによって制御され、そのオブジェクトは以下の項目を制御します。 - でログイン - ログインしていません - 気に入らページ -状態パターンですが、2つの異なる場所から制御されます

が好きないページは、上記のページに縛らキャンペーンが 有効であるかどうかを識別し、別のオブジェクト(キャンペーン)がある - アクティブ をキャンペーン - キャンペーン以上

状態を制御する2つのクラス(ユーザー用とキャンペーン用)が必要なのかと思います。次に、各クラスによって設定された両方の状態に基づいて、ifおよびelseに基づいて正しいビューを推論します。ページが好きで、キャンペーンアクティブ場合

  1. - ショーユーザーキャンペーン利用可能なページ
  2. ページが好きで、キャンペーンアクティブでない場合 - ショーprelikeキャンペーン利用可能なページ
  3. ページが好きで、キャンペーンを超える場合 - ショーユーザーキャンペーンページ
  4. オーバー
  5. ページが好きでキャンペーンがページ上でユーザー優先キャンペーンをオーバー表示する場合

    「コードの匂い」のようですか?

他にどのようにこれを改善できますか?

+0

キャンペーンの状態はユーザーにリンクされていますか? – CharlesB

+0

「コントロール状態」クラスを持たず、それにキャンペーンオブジェクトを渡すのはなぜですか? –

+0

キャンペーン状態はユーザーにリンクされていませんが、ユーザーは両方の状態に応じて表示されます。私は説明の明確化のために多くの情報を追加しました。 – Dhana

答えて

0

両方の状態フラグを自分のクラスにラップするかどうかは、私にとって重要ではないように見えます - 意図を明確に伝える(たとえばフラグを正しく指定するなど)。 あなたのケースでは、(@ejaenvで与えられたような)簡単なルールベースの解決策を試してみましょう。おそらく、小さなDSLの形でそれを行うことで美化されています。

しかし、あなたは他のものからさらに多くの保守性を得ることができます。そのような2つのステータス(例:キャンペーンとキャンペーン)のカップリングが正当な理由がありますか?たとえば、すべての単一のケースに専用のかなりカスタマイズされたページを用意したいと思うことがあります。 一方、両方の状態がかなり独立した概念を表すので、そのような結合は実際には必要ではありません。おそらく、単一のページテンプレートは、各フラグの状態に応じて適切な要素を含むことができます。そうすれば、正しいビューを選択するという問題を回避できます。

ところで、あなたの提案は本当に状態パターンを説明するものではありません。そのパターンは、オブジェクトの動作に関するもので、その状態に応じてコールごとに異なります。ポリモーフィズムを使用しています。 条件を追加する予定がある場合、状態パターンはほとんど役に立ちません。このパターンに関連する必要な定型文の量は、すべて(この場合はマイナーな)利益を覆い隠してしまいます。それ以外にも、状態パターンはクライアントから状態を隠すことです(観測された動作を間接的に推測することしかできません)。そのパターンを適用し、それを基にした判断を下すために状態を読むことは、間違いなくコードの匂いになります。

関連する問題