考える場所

ココロとカラダ、思考する全部

ドメインモデル貧血症

If you have an anemic domain, the repository will be just a DAO.
- SapiensWorks | Repository vs DAO

RepositoryとDAOの違いが分かりづらいのは当然だ。RepositoryとDAOは同じだったのだ。貧血症のドメインにおいてRepositoryは単にDAOだという。

These services live on top of the domain model and use the domain model for data.
- AnemicDomainModel

サービスレイヤを設けてモデルを単にデータとして扱ってしまう。ドメインロジックをサービスレイヤに寄せてgetterとsetterしかもたないモデルを作ってしまう。ドメインオブジェクトとDTOを同じにするからRepositoryとDAOも同じになってしまう。

ドメインモデル貧血症は驚くほど一般的に受け入れられた病だ。お仕事で当たり前に書くコードが貧血症を患っている。見慣れてしまっているからこのアンチパターンのパラダイム(手続き型プログラミング)から抜け出すのは結構大変だ。

なお、サービスレイヤは次のようにあるべきとされている。

  • 薄くある
  • ビジネスのルールや知識をもたない
  • タスクをコーディネートしてドメインオブジェクトのコラボレーションに委譲するだけ
  • ステートレス(ユーザーやプログラムについてタスクの進捗を反映する場合を除いて)

教訓

The fundamental horror of this anti-pattern is that it's so contrary to the basic idea of object-oriented design; which is to combine data and process together.
- AnemicDomainModel

Javaを使えばオブジェクト指向になるというのではない。データと処理を一緒にするというオブジェクト指向のもっともシンプルで基本的な考え方を忘れないこと。