はじめに
今回は、「【App. Design】複雑なアプリを作る前の準備。アーキテクチャを考える」で説明した中の階層型のアーキテクチャを実装してみます。
以前「【C# WPF】ウィンドウを使った画面の間でデータを受け渡す方法」でアプリを作ったので、これに変更を加えていきます。
アプリの動作は同じまま変更せず、構造の部分だけを階層型アーキテクチャに変更します。
階層型アーキテクチャは上図の左側のようなイメージになりますが、これを今回はVisual Studioを使って上図の右側のような内容に実装します。
Visual Studioはアプリ全体を「ソリューション」として管理し、その中身を「プロジェクト」に分けて管理できるので、各階層を「プロジェクト」に対応させるわけです。
話をシンプルにするため今回は1番下の階層を省略し、プロジェクトは2つだけにします。
プロジェクト名は自由に決めていいので、今回はコアとなる部分を「Domain」という名前にします。
その他の部分には、元からある「WpfApp1」というプロジェクトを当てはめます。
Visual Studioでプロジェクト名を変更するのにはコツがいるので、今回は名前はそのままにします。
そして、青い矢印のように「WpfApp1」から「Domain」への依存関係を設定。
「WpfApp1」から「Domain」へアプリケーションの根本となるロジックだけを移して完成です。
なお、余談ですが他の開発環境でも、呼び方が異なりますが似たような仕組みがあります。
例えば、Visual Studioでは「ソリューション」と「プロジェクト」呼ばれているものが、Eclipseでは「ワークスペース」と「プロジェクト」と呼ばれており、IntelliJ IDEAでは「プロジェクト」と「モジュール」と呼ばれています。
それでは具体的に作業を進めましょう。
プロジェクトの追加
プロジェクト「Domain」を追加しましょう。
ソリューション エクスプローラで「ソリューション」を選択して、右クリック・メニューから「追加」→「新しいプロジェクト」と進みます。
「新しいプロジェクトを追加」というパネルが開くので、右枠の中で C#の「クラス ライブラリ」を選んで「次へ」をクリック。
「新しいプロジェクトを構成します」というパネルが開くので、「プロジェクト名」を「Domain」として、「場所」はそのままにして「次へ」をクリックします。
「追加情報」というパネルが開くので、「フレームワーク」を選びます。今回は「.NET 8.0」を選んで「作成」をクリックします。
この段階でソリューション エクスプローラを見ると次のようになります。
「Domain」というプロジェクトが追加されていますね。
「Domain」の中にある「Class1.cs」というファイルは不要なので、選択して「Delete」キーを押し、削除しておきます。
プロジェクト間の「参照」を設定
次に「参照」を設定します。
ソリューション エクスプローラでプロジェクト「WpfApp1」の下にある「依存関係」を選択して、右クリック・メニューから「プロジェクト参照の追加」を選びます。
「参照マネージャー」という画面が開くので、「Domain」の左にあるチェックボックスを両方オンにして「OK」をクリック。
この時、各プロジェクトのフレームワークのバージョンが異なるとエラーがでます。
その時は、ソリューション エクスプローラで各プロジェクトを右クリックして「プロパティ」を選び、「ターゲット フレームワーク」という項目を統一すると直ります。
参照の設定が正しくできているか確認します。
ソリューション エクスプローラで「WpfApp1」の下にある「依存関係」の左側の三角マーククリックして配下の内容を表示。「プロジェクト」という表示ができいて、その下に「Domain」という表示ができていればOKです。
この段階でソリューション エクスプローラを見るたのが次の画像です。
この状態で、「WpfApp1」から「Domain」への参照が可能になります。「WpfApp1」が「Domain」に依存している状態ですね。
そして、Visual Studioでは参照を一方向にしか設定できないように制限されているので、「Domain」が「WpfApp1」に依存しない状態が保証されます。具体的には、「Domain」のコードから「WpfApp1」のコードを参照するようなコードを書くとエラーになりビルドできません。
つまり、「Domain」は他のプロジェクトに依存していない状態、「WpfApp1」は他のプロジェクトから依存されていない状態が強制的に担保されるわけです。これがプロジェクトを分ける最大のメリットです。
なお、参照の設定や確認は、上で説明した「ソリューション エクスプローラ」の「依存関係」から行う方法が一番確実です。他にも似たような操作メニューがあり、そこから操作した場合は、うまく設定できない場合があるので注意してください。
例えば、次のようなところから似たような操作ができますが避けた方が無難です。
- 「ソリューション エクスプローラ」の「ソリューション」の右クリックメニューの「プロジェクトの依存関係」
- トップメニューから「プロジェクト」の「プロジェクトの依存関係」
クラスを移す
「Domain」プロジェクトにアプリケーションの根本となるロジックを移します。今回は「Model.cs」と「Service.cs」になります。
ソリューション エクスプローラ上で「Model.cs」を「Domain」にShiftキーを押しながらドラック&ドロップすると移すことができます。なお、確認のメッセージが出た場合は「OK」を押して進んでください。
同じように「Service.cs」も移します。
「Model.cs」と「Notification.cs」のコードを修正します。
「namespace WpfApp1」を「namespace Domain」に変更し、「using Domain;」を追記します。
以上で今回の作業は終了です。
ソリューション エクスプローラを見ると次のようになります。
ここでアプリを実行してみると、問題なく動作するはずです。
まとめ
以上で各階層にVisual Studioのプロジェクト対応させる方法で、階層型のアーキテクチャを実装できました。
プロジェクトを分けて階層型のアーキテクチャにする最大のメリットは、他に依存しない部分を担保できること。(今回では「Domain」プロジェクトが該当)
他に依存しない部分は、テストが容易で、ドキュメント性が高く、メンテナンスが楽になります。そして独立性が強いので他からの影響を受けにくく、安全性も高めです。
なので、重要なコードはできるだけ「Domain」に置く。これが品質の良いプログラムへの鍵の一つになるのです。
コメント