C# で記述された Windows フォーム アプリケーションがあり、フォームの 1 つに膨大な量のコードが含まれています。クラスを多用してフォーム コードを最小限に抑えましたが、フォームには多数のタブ ページと数百のコントロールやデータグリッドなどがあるため、フォーム自体のコードは依然として膨大です。
すべてのコードを同じスコープ内に保ちながら、このコードをより管理しやすく小さなアイテム (おそらく各タブ ページのソリューション内の 1 つのアイテム) に分割する方法はありますか?
コードをあまり移動せずに読みやすさとメンテナンスを改善したい場合は、次を使用できます。
#region Tab 1
#region Variables
#endregion
#region Properties
#endregion
#region Methods
#endregion
#endregion
これにより、特定のタブに変更を加える際に、関心のないコードの部分を最小限に抑えることができます。完璧ではありませんが、役立つ場合があります。
コードとそのフレームワークの再構築を検討している場合は、SOLIDの原則に注意する必要があります。そのための良い記事はSOLID Software Development, One Step at a Timeです。
部分クラスを使用してコードをいくつかの cs ファイルに分割することもできますが、その利点はあまり見られません。唯一の解決策は、完全なリファクタリングを行い、UI とは関係のないコードを別のクラスに削除することです。
基本的にリファクタリングが必要です。これは、従来のWindows フォームアプリケーションでよくある問題であるため、規律を守って整理する方法を決定する必要があります。すぐに直るわけではありません。
MVC / MVP、さらにはMVVMを調べて、他の人がコードを分割する方法を学びます。そこから、自分に合った階層型アーキテクチャを導入できます。
しかし、あなたは一人ではありません。Visual Studio またはReSharperのリファクタリング ツールは、多くのコピー ペースト サイクルを自動化し、エラーを排除し、変数名などを自動的に同期させます。
私は個人的に地域に問題があります。エディターがスローされることがあり、ファイルを閉じて再度開く必要があります(SharpDevelopでBooを使用していますが、これに固有の場合があります)。そのため、タブのある大きなフォームでは、部分的なクラスを使用する傾向があります。
Visual Studio / SharpDevelopファイルエクスプローラーで実行できる巧妙なトリックは、部分クラスのファイルをクラスのメインファイルにドラッグすることです。これにより、すべてがMainForm(.designer
および.resx
ファイルの横)の下にネストされ、整理された状態に保たれます。
コントロールを拡張するクラスに入れることができる、ユーザー コントロールのプレゼンテーション層に属するコード。
各タブからコードを抽出し、各タブのコードを含むユーザー コントロールを作成します。(TabPage から継承して、init のフォームに追加することもできます)
次に、ユーザー コントロールを各タブに追加して、コードを大幅に削減することができます。
グリッドなどは、他のコントロールがアクセスするために必要な最小限の数のメソッドとプロパティを公開するユーザー コントロールに変換することもできます。
フォーム コントロールを何度も定義している場合は、別のタブでフォーム コントロールの新しいインスタンスを作成するだけです。
これにアクセスするためのゲッターとセッターを作成します。
しかし実際には、フォーム コントロールのコードがたくさんあっても問題はありません。Windows Formsを使用して、Visual Studio がこれらすべてを生成するはずだと思いましたか?