2009-07-27 6 views
2

私はいくつかのコードをリファクタリングしたいです。フォームから状態パターンへのリファクタリング?

基本的に私はリファクタリングするコードは(のSystem.Windows.Formsを使用して;)フォームです

それが今セットアップした方法、あなたはそれは、ウィンドウごとに異なるレイアウトを示し、選択したラジオボタンに応じて:別のラベル、ボタンなど常に大きな違いはありませんが、異なる。これは、場所のいたるところにある多くの条件文のジャンクです。代わりにStateパターンでそれをリファクタリングしたかったのです。 3つの主な状態があります。

これを行う最善の方法はわかりません。現在、IStateインターフェイスには、一意の状態に固有の動作を行うDoAction()メソッドと、現在のStateに基づいてフォームを再描画するDrawForm()メソッドがあります。ただし、DrawForm()を実行するには、 StateクラスはFormのメンバ変数にアクセスできる必要があります。それがループのために私を投げたものです。私は彼らを暴露したくはありませんでした。

これを行うより良い方法はありますか?

+2

私がState Patternについて知っているところでは、DIDはそれらの具体的な状態クラスに "コンテキスト"(あなたの場合のフォーム)へのアクセス権を必要とします。これらのメンバ変数にアクセスすることは避けられないと思います。 – xandy

+0

ありがとう、私はいくつかの愛をあなたのコメントを与えなければならなかったので、upvote、笑に1つの答えがないので。 –

答えて

3

フォームにネストされた状態クラスを作成できます。彼らはその後、それらを公開することなくフォームのフィールドにアクセスすることができます。

+0

ああ、素晴らしい点。ありがとう。 –

+0

これは、私がそれを設定していたやり方について気分を良くするために必要なものです。どういうわけか私はネストされたクラスを完全に忘れてしまった。 –

0

これが役立つかどうかわかりませんが、フォームを描画するための戦略パターンのようなものはありませんか?

だからフォームがでている状態あなたが選ぶ

interface IDrawStrategy 
{ 
    void Draw(FormType form); 
} 

そして、の線に沿って何かは、フォームの描画戦略を割り当てることができます。はい、描画メソッドにForms変数へのアクセスを許可して配置する必要がありますが、少なくとも、状態に基づいて異なる外観を簡単に追加できるようにします。

+0

私は、フォームが入ることができる各状態についてDrawForm()メソッドを持っています。あなたが言っているものにかなり似ています。 –

0

フォームの「状態」を抽出したい場合は、「プレゼンテーションモデル」としてよく知られているパターンを記述しています。 this article by Martin Fowlerを読むことで、フォームと州の相互作用を一般的にどのようにしたいのかに関する良い情報とヒントを見つけることができます。あなたの場合、あなたのフォームは「ビュー」で、あなたの状態はプレゼンテーションモデルです。いつものように、Fowlerはこの質問に答えるという素晴らしい仕事をしています。

+0

私はそれを見て、ありがとう。 –

1

あなたの主な関心事がカプセル化されたフォームを保持していて、ステートマシンを外に保つ必要がある場合は、同様の質問が返ってきました。答えはhereです - 基本的には、 'クラスは、フォームメソッドへのアクセス権を持っており、これをステートマシンに渡すことで、アクションクラスを使用してフォームメソッドを間接的に呼び出すことができます。

関連する問題