2011-01-04 2 views
1

私は様々なデザインパターンを習得するために、私は "State"デザインパターンにぶつかりました。内部および/または部分クラスは州のデザインパターンの原則を逸脱していますか?

まず、このパターンをどこで使用しようとしているかを説明します。私は状態を適用したいFormを持っています。私のプログラムには、構成、処理、ProcessingCompleteの3つの状態があります。 Formの状態が変わると、Formのさまざまなコンポーネントが有効/無効、可視/不可視などになります。

状態パターンを理解して、これらの変更(コンポーネントを表示/非表示、有効/無効など)フォームのインスタンスを含む別のクラス内で発生する必要があります。さまざまなStateクラスがFormのクラスとは別の場合、StateクラスはFormのコンポーネントにアクセスできません。私は、この2つのオプションのいずれかで私を残していることを感じる:

  1. は、私は、そのオプションを感じるフォームの国家クラスのインナークラス

を行い、公共

  • としてフォームのコンポーネントを公開する(1)私はオプション(2)が何らかの形で国家パターンの精神に違反していると感じます。私が持っていたもう一つの考えはオプション(2)を使っていましたが、部分クラスの実装を使っていましたが、私はまだStateパターンの精神に違反していると感じています。

    いずれかの選択についての私の気持ちは不当ですか、私が考えていない別の選択肢がありますか?

  • 答えて

    1

    3番目のオプションがありません。

    州が管理する部分をクラスの契約の一部として含めます。

    ラベルのテキストを変更することを目標とする場合は、ベースステートクラスでラベルを送信する必要があります。適切なフィールドを設定するフォームのInitializeState(State myState)またはBuildStates()メソッドを次に持つことができます。

    オプション1が間違っています。オプション2は、あなたが与えられたものだけを動かすことができるようにあなたの状態を設計するとき、本当に不必要になります。それは本当にどのようにオブジェクトがとにかく動作すべきかです。

    +0

    私は本当にこのアイデアが好きです。クラスをかなり不変に保つことに慣れているので、私は私には起こりませんでした。これはおそらくかなり複雑なコンストラクタ(この場合は複雑なパラメータ)を実装する必要があることを意味します。 – Anthony

    +0

    さらに考えてみましょう:「オプション2は、与えられたものだけを行動できるようにあなたの国を設計するときには本当に不必要になります」。オプション2では、StateクラスにFormのインスタンスを指定する必要があります。利点は、Stateクラスがネストされているため、StateがFormのインスタンスのプライベートメンバーにアクセスできることです。 – Anthony

    +0

    @Shynthriir:他のクラスのプライベートメンバーにアクセスするクラスは、実際にはメリットはありません。密接に結合したコードです。入れ子にされていても、彼らは自分が見えるものにアクセスする必要があります。 –

    1

    私は部分的な実装を避けるでしょう。通常、ちょっとした付加価値を与えず、コードを読みにくくします。部分的なクラスが良い考えであると私が考えることができる唯一の場所は、コードの一部が(WinFormsデザイナーのように)自動生成される場合です。

    MVPや何らかのバインディングを使用するのはどうですか?コントロールのVisibleプロパティとEnabledプロパティをModelクラスにバインドすると、フォームのインスタンスを保持する代わりに、そのモデルのインスタンスを保持できます。

    +0

    第1に、私が部分的に実装しているのは、純粋にコードの論理部分を別々のファイルに分けるのに役立ちます。それがお茶の場合は、ファイルが大きくなるのを防ぎます。 - 第二に、私はまだMVPのさまざまな側面に頭を抱えています。 – Anthony

    +1

    @Shynthriirこれは、問題に対処する代わりに症状を処理しています。あなたのクラスが大きすぎて別々のファイルに分割したい場合は、それを別々のクラスに分割する必要があります。大きなクラスはテストできません。 –

    +0

    真。クラスは1つの責任しか持たず、論理的に分離できません。 – JBSnorro

    1

    私はオプション2に行きたいと思います。「状態」は「フォーム」のみに使用されているため、意味的には本質的なものです。

    +0

    私は同意します...なぜあなたは継承を使用できません。それがOOPのために設計されたものです。 –

    関連する問題