プレゼンテーションとドメインの分離
概要
プレゼンテーションとドメインの分離(英: Presentation Domain Separation)は「ユーザーインタフェースコードをその他のコードを分離する」という設計原則です。
レイヤの分離
ドメイン層とプレゼンテーション層を分離することは特に重要です。
- プレゼンテーション層
ユーザーとの対話(コマンドやイベントハンドラの実装、ユーザーインタフェースの提供、結果の表示・出力等)を行い、ドメインロジックを含めないようにします。 - ドメイン層
ユーザーインタフェースの状態や表示などを意識せず、設計情報のような概念に対する操作、いわゆるドメインロジックを実現します。ドメインに関連した概念や状態を表現するモデルと、複数のモデルに対する操作を実現するサービスがあります。
これにより、ソフトウェアのロジックはUIと完全に切り離され、単体テストがしやすくなります。 アプリケーションの振る舞いはドメイン層にあるので再利用性が高まり、エクステンションの機能を将来的にCIで実行したり、コマンドラインアプリケーション化することも可能になります。
プロジェクトの分離
プレゼンテーション層とドメイン層の分離の原則をアーキテクチャ上維持し続けることがとても大切になりますが、不用意な責務違反を防止 するために、プレゼンテーション層とドメイン層とそれぞれ別のプロジェクトに分離することを強く推奨します。
- プレゼンテーション -
MyExtension.csproj
NextDesign.DesktopやUIのライブラリを参照します。
ターゲットフレームワークは .NET 6.0 を推奨します。 - ドメイン -
MyExtension.Core.csproj
NextDesign.Coreや非UIのライブラリのみを参照します。
ターゲットフレームワークは .NET Standard 2.0 を推奨しますが、参照するライブラリに .NET Standard 2.1 がある場合は .NET Standard 2.1 になります。
このように分離しておけば、ドメイン層からプレゼンテーション層への参照が存在しないことを保証できます。 プロジェクトを分離しておかないと、間違って参照してしまって気が付いたら依存関係が生まれていたということが起こり得ますので、この2つはプロジェクトを分けることをおすすめします。
レイヤだけでなく機能ごとでもプロジェクトを分ければ、機能間の依存関係を排除することができます。
アクセシビリティによる制御
プロジェクトを分離しても、外部からさまざまなクラスを参照すると、内部設計の変更にも影響を受けてしまいます。そこで、外部からの入口となるクラスやメソッドだけを公開し、それ以外のクラスやメソッドを非公開にします。
外部に公開するものは必要最小限にし、ロジック変更や機能を拡張しても利用側に影響を与えないようにします。
詳細は アクセシビリティによる実装の隠蔽 を参照してください。