ドメイン駆動開発_フォルダー構成編_#35_ValueObject

当サイトではアフィリエイト広告を利用しています。

NDDD

ここからはDomain層を詳しく見ていきましょう。現状フォルダーは,EntitiesとRepositoriesがあるだけです。ValueObjectsというものを作っていきましょう。

ValueObjectとは?

ValueObjectとは値のクラスです。

例えばMeasureEntityのMeasureValueはfloat型になっていますが,float型だと,MeasureValueに対する編集処理等を書く場所がありません。

MeasureValueは小数点以下2桁表示とか,単位が決まっていたとしても,float型では書く場所がないので,別の場所に書く必要があります。

計測区分があったとして・・・

計測区分があったとして, MeasureKindでint型にしたとします。

データベースの仕様上,MeasureKindが1の時は温度,2の時は湿度だったとしましょう。でもint型にしてしまったら,ビジネスロジックはどこに書けばいいでしょうか?書く場所がないので,どこか別の場所に書くことになります。別の場所に書いてしまうと,プログラマーごとに,色々なところに書きだします。ドメインに書いたり,ViewModelに書いたりします。

そうではなくて,値そのものに,ロジックは書く必要があります。MeasureKindにまつわることは,MeasureKindに書くのです。そうすると,プログラマーの迷いはなくなります。ロジックの住処になります。

オブジェクト指向的に言うと,これをカプセル化と呼んでいますが,値とロジックを一体型にしないといけないのです。自分の値に対するロジックを自分で表現するのです。

計測区分1は温度,2は湿度という区分があった場合,データベースには1か2という値が入っているだけです。それでは1が温度という情報はC#の中でしっかり管理しておかないと,意味の解らないプログラムになります。例えばエクセルの仕様書で1は温度としていても,C#の中のどこかで定義していないと,読みづらいプログラムになり,計測区分を判断するロジックがアプリケーソン中に散らばってしまいます。それを防ぐために,計測区分にまつわることは,計測区分というクラスのなかで,すべて書いてしまうのが,見通しのいいプログラムという事になります。その中で,温度の単位や,小数点以下の表示桁数なども表現していきます。

こうすることで,ビジネスロジックが散らばることを防ぎます。ValueObjectは,値が1つの物と,複数の物がありますが,基本的には,データベースの列をValueObjectにするのが,自動的にオブジェクト指向的プログラミングになるので,簡単でシンプルで,友好的です。今後は,MeasureEntityにある項目をすべてValueObjectにしていきましょう。