generated at
repositoryとのやりとりを抽象するのではなく、repositoryとの間のデータを抽象しよう
repositoryを抽象するのではなく、repositoryとの間のデータを抽象しよう

repositoryパターンはつらがち
DBに対するCRUDを抽象化したら、ORMが持ってる便利機能を捨てることになって面倒
repositoryパターンに対する批判があるのもこういったところだろう

なぜつらいのか?
DBに対する操作を抽象しようとしてるから

DBと、それを極めて便利に入出力する現代のライブラリがある
これらは、高機能であり、乗っかった方がいい
古くはActiveRecord, 
今のTSだとPrsima.....
このプロトコルを抽象するのは無理
ライブラリの再実装をしているみたいな苦しみになる

ではどうするべきか?
DBとやりとりする際の、値の方を抽象するとよい
言い換えると、型を定めると良い
ORMに入出力する際のデータを単純なjsonか、value object的なものを用意する
ORMの便利機能に合わせて、その型を変えれば良い
型を扱うのが難しい言語、class baseな言語の場合は、value object的なもので代用すると良いのかもしれない(想像)

一方で、値を取り扱うのは簡単である。
ライブラリが、DBのrelationshipに基づいて、複数のテーブルの値を取ってきたとする
UserテーブルとPostテーブルにrelationshipがあり、それらを同時に取ってくるようなの
js
{ userId: 1 name: 'miyamonz' posts: [ {postId: 1, content: 'こんにちは' }, ..
getUserWithPosts というメソッドを抽象するのではなく、
このjson的な値に型を定めれば良いのである
ts
{ userId: number name: string posts: {postId: number, content: string}[] }
そしてこの型を使って、コントローラ層やview層は値を使用すればいい
これなら、リポジトリ層と分離はできる


これは、言い換えると、 UsersWithComments という値の抽象をするということである
GetUserWithComments というメソッドやインターフェースを抽象するとしんどいが、
UsersWithComments というデータを抽象するのは便利
まず、最低でもviewで必要とされてるから、この型は、間違いなく使われていて、意義のあるものである

そして、このデータの型という抽象に対して、ORM等ライブラリが満たすようにデータを返せばいいだけ




メソッドやプロトコルは運搬が難しいが、値は運搬が容易、という特徴に基づいているという点では、the value of valuesの考えの一種であるとも言える