3つのタブコントロールを備えたフォームがあり、各タブコントロールには12個ほどのテキストフィールドがあります。現在、Form1.cs内のテキストフィールドを変更するためのすべてのメソッドがあります。これは機能していますが、非常に長いクラスです。フォームコントロールを呼び出すメソッドをそのフォームクラス内に保持するのが適切なメソッドなのか、それとも他のクラスに分割する必要があるのか、興味があります。このスレッドを読んだので混乱するかもしれませんが、選択した答えは、他のクラスのフォームコントロールにアクセスしようとすべきではないと言っているようです。 C#のクラスからフォームメソッドとコントロールにアクセスするにはどうすればよいですか?
4 に答える
このシナリオでカプセル化するための最良の方法は、各タブのテキストフィールドを含むユーザーコントロールを作成することです。次に、各タブにはユーザーコントロールがあり、それらのフィールドに固有のすべてのロジックは独自のコントロールにカプセル化されます。
UIデータにアクセスするコードを内に残すことができるForm
が、そのデータの計算を操作/実行するコードを別のクラスに残す場合。このようにして、(たとえば)UnitTestingに使用できる単一のクラスまたはクラスのセットを作成できます。
これは簡単に実行できます。フォームへの参照を他のクラスに渡すだけですが、それらは緊密に結合されるため、壊れやすくなります。
より良いオプションは、インターフェースを定義し、フォームにそれを実装させることですが、それは厄介になる可能性があります。
他のオプションは、タブのコントロールをユーザーコントロールまたは別のフォームに移動してから、メインフォームのタブでホストすることです。次に、各タブのデータと操作を分離できます。ここでも、1つまたは2つのインターフェースを定義して実装すると、分離するのに役立ちます。
このように考えると、UIをタブに分割します。その背後には、UIの観点からいくつかの基本的なロジックがあるため、タブのコントロールが実行する機能を分離するという観点から、いくつかのロジックが必要です。私はそれに対する例外を見てきましたが、それは通常、タブの分離にロジックがまったくなかったためです。
アプリケーションを整理するには、さまざまな方法があります。通常、GUI(フォーム)を他のアプリケーションロジックから分離することです。フォームにはロジックのみを表示してください。データのデータクラス(モデルとも呼ばれます)を作成します。、、などCustomer
のクラスが必要になる場合があります。これらのクラスには「ビジネスロジック」が含まれています。たとえば、Orderクラスは、注文フォームではなく、税金の計算方法を知っています。Order
Address
データバインディングを使用してビジネスオブジェクトをフォームにバインドすることにより、多くの労力を節約できます。データバインディングの使用については、私のSOの回答を参照してください。
MVCパターンを使用して、ロジックを3つの部分に分割することで、さらに先に進むことができます。ここでは詳しく説明しません。これだけ、MVCはModelViewControllerの略です。モデルはビジネスクラス、ビューはフォーム、コントローラーはモデルとフォームを管理し、モデルのロードと保存などを行うクラスです。