目次
マルチモジュール開発とは、プログラムを部品として分離して、その部品をいろいろなアプリケーションから再利用できる設計で開発する手法のことです。
VisualStudioでは1つのソリューションに複数のプロジェクトを保持することができます。プロジェクトの数だけアセンブリ(部品)という成果物を生成しソリューションがそれらの依存関係を構築します。
適切に分離できれば、さまざまなアプリケーションで同じ部品を使いまわすことが出来ます。例えば、デクストップ版を開発した後に、モバイル版が必要になった場合、ファーストパーティー(.Netライブラリ)だけで作成されたアセンブリは再利用できるので、短い期間で開発することができます。
逆に不適切な依存関係だった場合は再利用できず「使いまわしたいコードにデクストップ用のフレームワークが参照されているのでモバイル版の開発で使えない」といったことに陥ります。
モジュールの設計
書籍「AdaptiveCode」では、プロジェクトの依存関係を2つのパターンで命名し、
不適切な依存関係をEntourage(取り巻き)タンチパターン
適切な依存関係をStarwayパターン
と呼称しています。これらのパターンについて説明します。
Entourageアンチパターン
Entourageアンチパターンとは依存したいインターフェイスと依存したくない実装クラスが同じ1つのアセンブリに含まれている状態を指します。下記の図はその例で、Entityプロジェクトを参照すると2つのサードパーティーライブラリが取り巻きのように付いてきます。
Starwayパターン
Starwayパターンとは、インターフェイスとそれらの実装を異なるアセンブリに配置している状態を指します。下記の図は、2つのサードパーティーの依存関係をファーストパーティーの依存関係で隠蔽する単純なインターフェイスを作成して、サードパーティーのライブラリを置き換える仕組みを作成しています。
上記のプロジェクト構成図であれば、ライブラリ変更によるコード変更が最小限に抑えられます。例えば、モバイル版の開発をする場合、XamarinやUnityといったMono技術での開発が検討されますが、EntityFrameworkをMonoで使う場合はいくつかの問題があるため、データベースのライブラリはSqliteNetPclに置き換える必要があります。
Starwayパターンで設計されていれば、下記の図に示すように、Database.SqliteNetPclプロジェクトを作成して、そのプロジェクトにSqliteNetPclライブラリに依存するプロジェクト構成にするだけで、既にあるソースコードを変更することなく、別のライブラリを使ったデータベース処理を追加することができます。
既存コードを変更しないので、EntityFrameworkがMono技術をサポートするようになっので、SqliteNetPclからEntityFrameworkに変更するといったシナリオも簡単に対応できます。
さいごに
マルチモジュール開発のざっくりとした説明ですが、利用しているサードパーティーライブラリの数だけプロジェクトを用意するイメージで良いです。サードパーティーのクラスが必要なコードはそのサードパーティーを参照しているプロジェクトにしか記述できなくする事でコードの規律を整えます。
C#はマルチプラットフォーム開発に適した言語ですが、サードパーティーのライブラリがすべてのプラットフォームに対応しているとは限らないため、後から他のライブラリに置き換えられる設計で開発することを推奨します。マルチプラットフォーム開発を視野に入れていなくても、テストコードを作成するにはインターフェースとクラスを分離する必要があるので、だったら最初からStarwayパターンで作っておきましょう。