はじめに
システム開発をするとき、業務知識を表現するクラスを作成することがあります。
業務知識をシステムの中で表現して、それらを中心とするソフトウェア設計方法を「ドメイン駆動設計(DDD)」といいます。
これらのクラスはUIや外部システムと比べて変更される頻度が少なく、また別プロジェクトでも流用することができます。
業務知識をシステム内で表現するので、変更に強く、複雑な業務のシステムでも理解しやすくなります。
業務知識を表現するクラス
例えば、POSなどの売買に関係あるシステムだと「商品」や「値段」などのクラスを作成します。
商品クラスや値段クラスは業務知識を表現するために、以下のような値を保持しています。
商品クラス | 値段クラス |
---|---|
値段クラス | 値段(整数) |
値段クラスはねだである整数を保持するクラスです。
商品クラスは値段クラスを保持するクラスです。
DDDにおける値段クラスのことを値オブジェクト(Value Object)、
商品クラスのことをエンティティ(Entity)といいます。
今回は値オブジェクトについて書いていきたいと思います。
値オブジェクト
値オブジェクトは業務知識を表現して値として扱われるオブジェクトです。
以下のような特徴を持っています。
不変
値オブジェクトが保持している値(プロパティ)は変わりません。
intやStringなどと同様に扱います。
これにより、値段クラスのインスタンスの円(整数)がいつの間にか変わっていたということ防ぐことができます。
交換可能
値オブジェクトは不変なので、中身を変更するのではなく、
値オブジェクト自体を交換します。
なので、商品クラス内にある値段クラスを変更するときはオブジェクトを入れ替えます。
等価性の比較
値オブジェクトは1 < 2
と同じように比較をすることができます。
== 演算子や hashCode を適切に実装することで等価性を判断できます。
直感的に扱えることと、クラスに新しくプロパティが追加されても値オブジェクトの比較処理を修正するだけでよくなります。
まとめ
今回は値オブジェクトに関して簡単にまとめました。
業務知識をコードでうまく表現できるようにしていきたいです。