C#ではpartial class
を使うと、ひとつのクラスを複数のcsファイルに分割して保存することが出来ます。
機能といしては知ってはいたのですが、使う場面を考えて見たいと思います。
基本的に1クラス1ファイル(.cs)にすると、ファイルを選択するとクラスを選択することになり管理が楽になります。
そのような分割が理想的ですが、クラスとして分割出来ないケースの場合partial class
の出番となります。
コードのサンプルは過去の記事にしていましたので、そちらを参照ください。
実際使われている事例として、dotnet.exeでWinFormsのプロジェクトを作成すると、ファイルがいくつか生成されますが、partial class
を使われたファイルが2つあります。
Form1.cs
Form1.Designer.cs
中身を見てみると、Form1.Designer.csではフォームの初期化やDispose()メソッドなど、フォーム生成で必須で共通部分がまとめられている感じです。
Form1.csはコンストラクタのみで、プログラマは基本的にForm1.csのコードを加筆していくような使い方になります。
WinFormsでプログラミングをしていると、Form1上にボタンなどのコントロールを配置する関係上、コントロールを増やせば増やすすほど、Form1.csが大きくなる傾向があります。
コントロールのクラスを継承したクラスを作り、アプリケーションの専用の機能を拡張することが出来ますが、コントロール間でデータを連動するコードを記述することは出来ません。
機能を提供する側はクラスで分割しやすいですが、機能を使う側は、様々なオブジェクト間でデータを連動させる必要が有り、一つのクラスに集約することになります。
partial class
を使うとファイルを分割することが出来ますが、どのような基準で分割するかを考えてみると、Form1の場合配置するコントロールごとに分割すると良さそうな感じがします。
例を上げると以下のような感じになります。
Form1.AddressBar.cs
Form1.FolderTree.cs
Form1.FileListView.cs
各ファイルには各コントロールの定義と初期化メソッド(void Initialize_コントロール名()
)をコーディングします。
初期化メソッドはForm1.csのコンストラクタから呼び出すことになります。
初期化メソッド内ではコントロールの登録とイベントで実行するメソッドの定義します。
あとは、イベントで実行するメソッドを記述します。
一つのファイル内で一つのコントロール関連する事柄をまとめるようにします。
これらのルールは厳密に適用すると、コントロール感のデータ連動が困難になるので、その部分は柔軟に対応することになります。
できれば、コントロールをまたいで行う処理は、Form1.csに記述したいところですが、コードのわかりやすさ優先で良いと思います。
クラスの設計は分割と抽象化が基本ですが、WinFormsのようにViewと密結合になりやすいケースでは partial class によるファイル分割も立派な設計手段の一つです。メンテナンス性と見通しのよさを両立するために、用途に応じて柔軟に使い分けましょう。
コメント