考える場所

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

Repositoryのプラクティス

A method like Update is appropriate on a DAO, but not a Repository
- hibernate - What is the difference between DAO and Repository patterns - Stack Overflow

Repositoryはcollection of objectsの抽象である。従ってUpdate(Entity)をしない。Repositoryがもつインタフェースは次の3つであるとする見方だ。

  • Get(id)
  • Find(ISpecification)
  • Add(Entity)

Repositoryのインタフェースをin-memoryのcollectionに対する操作と捉えるとUpdateをしないのは分かる。変更は単にオブジェクトが変更されているだけに過ぎない。それでも物理的にはデータベース(あるいは別のデータソース)に変更を反映する必要がある。先の引用は次のように続く。

when using a Repository, changes to entities would usually be tracked by separate UnitOfWork.
- hibernate - What is the difference between DAO and Repository patterns - Stack Overflow

Repositoryがin-memoryのcollectionなら、確かに変更は別の仕組み(UnitOfWork)にするべきなのかもしれない。しかしそこまでするのはさすがに手間かなと思う。仕組みを多くすればそれだけ複雑になるから。更新もRepositoryの役割に含めるくらいのことはしてもよいだろう。

疑問

  • Find(ISpecification)は分離の観点においてベターなプラクティスなのか

ISpecificationの実装はつまり検索条件であると理解するが、これを引数で指定するというのは分離の観点でよいことなのだろうか。検索の実装をRepositoryの外から指定すればRepositoryを単に実装上の仕組みにしてしまうし、ドメインオブジェクトはおろかデータソースも抽象化しないことになると思えるのだが、違うのだろうか。

この実装こそがRepositoryであると言う記事を見るが、どうも腹落ちしない。