2009-06-24 11 views
0

かなり大きくなったMainFormでデスクトップアプリケーションを開発しています。異なるレベルの複数のコンテナには多数のコントロールがあります(SplitContainers、TabPages、Panels)。C#:カプセル化を考慮したデスクトップアプリケーションのGUIを巧みにデザインする方法

データクラス&をクリアするか、別のコントローラクラスにユーザー操作を行うすべてのコントローラコードを分離して、このクラスをリファクタリングします。

[EDIT]

本出願の目的は、注文(仕事と呼ばれる)とそれらの位置を追跡することである

目的(Jobitemと呼ばれます)。各ジョブは顧客に関連し、各ジョブアイテムは商品に関連付けられます(ジョブアイテムには商品の製造プロセスに固有の情報が含まれているため、商品をラッピングしています)。 Job、Jobitem、Customer、およびArticleには、PropertyManagerクラスで管理される動的プロパティ(基本キー/値ペア)があります。コアは3つのLinqToSQLのDataContextクラスのデータモデルが含まれています:

  • ArticleManagement
  • JobManagement
  • PropertyManagement

アーキテクチャ

私のアプリケーションは、2つの主要なプロジェクトに分割され

すべてのDataContextクラスに、LinqToSQLデータソースをカプセル化して、コレクション内のLinqToSQLオブジェクトをGUIに提供するXyzManagerクラスがあります。また、対応するDataContext型の作成、削除、および変更も処理します。

は、その後、私は自然に今のように、メインフォームとなどのオプションのようなもののためにいくつかの追加のフォームを含む、GUIのプロジェクトを持って、私のGUIプロジェクトは、各XyzManagerクラスへの参照を保持して&セットのデータを取得しますすべての制御ロジックを含む、ユーザーの操作が指示するマネージャクラス。

私はこれのための独立したロジックのほとんどをメインフォームクラスの外部の静的ユーティリティクラスに入れましたが、それは私が推測する理想的ではないアプローチです。

[/ EDIT]

これが私の最初の大きなデスクトップアプリケーションであり、私はGUIをカプセル化に苦労しています。現時点では、ユーザインタラクションを処理するすべてのコントローラコードは、MainFormクラス内にあります。

私はMVCパターンについて知っていますが、現在のデザインでC#WinFormに適用する方法がわかりません。

カスタムコードだけでも、フォームの自動生成コードにカウントされず、2400行以上のコードが長くなり、上昇傾向にあります。私はこれをリファクタリングしたいと思いますが、これをよりエレガントな方法で解決する方法は失われています。

答えて

3

あなたはモデル - ビュー - プレゼンター(MVP)を見てみる必要があり、(私の意見では)の優れたプレゼンテーションがあるMVPを行うための最善の方法: http://martinfowler.com/eaaDev/SupervisingPresenter.html

+0

リンクをありがとう。 Martin Fowler氏は最後に、監督者があなたのGUIをテストしたいときには良いと思っていますが、コントローラをビューから分離するのは得意ではないので、分離が私の主な目的であるため、私が探しているものではありません。テスト容易性は問題ではない。プレゼンテーションモデルは、この目標に適しています。 –

+0

リンクが私を正しい方向に向けるので、答えとして受け入れられました。私はパッシブビュー(http://martinfowler.com/eaaDev/PassiveScreen.html)を解決策として使用しています。 –

2

通常、小さなUserControlを使用して複雑なGUIを作成しようとしています。しかし、いくつかのポイントは非常に重要です:

  • これらのUserControlのそれぞれは、特定のデータを表示または変更するpurpuseを持って
  • ユーザーコントロールはこのデータだけに依存しなければならない(特にフォームから)独立していなければなりません。コントロールが必要とするすべてのデータを提供するDataSourceにバインドできるようにコントロールを実装するようにしてください。
  • 親コンテナ(別のUserControlまたはForm)に情報を引き渡す必要がある場合、コンテナが登録できるイベントを使用します。
  • (コンテキスト)メニューを使用する場合、それらが特定の項目にバインドされているかどうかを確認します。アイテムの近くで、UserControls内ではなくメニューを作成する必要があります。したがって、同じ項目をGUI上で複数のビュー(コントロール)で複数回表示すると、すべての項目が同じコンテキストメニューを持つ必要があります。
  • ボタン/メニューの操作にコマンドパターンを適用してみます。

あなたのソリューションは今までさまざまな責任を分かち合うことができなかったように聞こえます。明確な境界と責任を持たずにコードを異なるコントロールに分けるだけでは不十分です。小規模アプリケーションの場合

+0

異なるResponilibitesをどのように分けることをお勧めしますか?私はメインポストを編集して、私のアーキテクチャについてもう少し説明しました。 –

0

あなたは使いますか1つのフォームのJobController?はいの場合は、partial keywordを使用してコードの後ろに複数のファイルに分割する必要がありますか?

+0

今、はい。しかし、このプロジェクトはすぐにもっと複雑になるので、私は柔軟なデザインが欲しいです。また、コードを複数のクラスファイルに分割しても、大きなクラスであるという事実は緩和されません。仲間の開発者は、1つの大きなファイルをスクロールせずに複数のファイルをチェックする必要があるからです。それも良いことではない。 :/ –

+0

次に、あなたは間違いなく複合ui appblockを見ることができます。しかし、私は個人的には好きではありません。なぜなら、多くのプロジェクトでは逆効果(物事を単純化するのではなく開発者を混乱させる)があるからです。そして一般的には2.4k行はそれほど多くはありません:) 私の見解からは、ある種のコマンドパターンを探す方が良いでしょう。 – arbiter

+0

ええ、私はComposite UI AppBlockが私にとって正しい解決策ではないと思います。 MVCのいくつかのバリエーションを今見て、うまくいけば、そこに何かを見つけるでしょう。私は2.4kがそれほど多すぎないことを知っていますが、私はこのクラスがプロジェクトが進行していくにつれて成長することを期待しています。後でもっと柔軟なソウルティオンを見つけよう。 ;) –

関連する問題