repositoryとのやりとりを抽象するのではなく、repositoryとの間のデータを抽象しよう
repositoryを抽象するのではなく、repositoryとの間のデータを抽象しよう
repositoryパターンはつらがち
DBに対するCRUDを抽象化したら、ORMが持ってる便利機能を捨てることになって面倒
なぜつらいのか?
DBに対する操作を抽象しようとしてるから
DBと、それを極めて便利に入出力する現代のライブラリがある
これらは、高機能であり、乗っかった方がいい
古くはActiveRecord,
今のTSだとPrsima.....
このプロトコルを抽象するのは無理
ライブラリの再実装をしているみたいな苦しみになる
ではどうするべきか?
DBとやりとりする際の、値の方を抽象するとよい
言い換えると、型を定めると良い
ORMに入出力する際のデータを単純なjsonか、value object的なものを用意する
ORMの便利機能に合わせて、その型を変えれば良い
型を扱うのが難しい言語、class baseな言語の場合は、value object的なもので代用すると良いのかもしれない(想像)
一方で、値を取り扱うのは簡単である。
ライブラリが、DBのrelationshipに基づいて、複数のテーブルの値を取ってきたとする
UserテーブルとPostテーブルにrelationshipがあり、それらを同時に取ってくるようなの
code:js
{
userId: 1
name: 'miyamonz'
posts: [
{postId: 1, content: 'こんにちは' },
..
getUserWithPostsというメソッドを抽象するのではなく、
このjson的な値に型を定めれば良いのである
code:ts
{
userId: number
name: string
posts: {postId: number, content: string}[]
}
そしてこの型を使って、コントローラ層やview層は値を使用すればいい
これなら、リポジトリ層と分離はできる
これは、言い換えると、UsersWithCommentsという値の抽象をするということである
GetUserWithCommentsというメソッドやインターフェースを抽象するとしんどいが、
UsersWithCommentsというデータを抽象するのは便利
まず、最低でもviewで必要とされてるから、この型は、間違いなく使われていて、意義のあるものである
そして、このデータの型という抽象に対して、ORM等ライブラリが満たすようにデータを返せばいいだけ