Repository pattern i kilka źródeł danych

Zainteresowałem się ostatnio dość mocno Clean Architecture, cała idea wygląda bardzo interesująco …

Natrafiłem jednak na pewien problem związany z “Entity”. Tutaj aż się prosi, żeby wykorzystać wzorzec repozytorium. W prostych przypadkach gdy całe Entity mapuje się do identycznego obiektu w bazie danych to nie ma większych problemów. W tym wypadku np. UserRepository, posiada proste akcje CRUD (np. find, all, create, update, delete). Ale wg założeń w Clean Architecture Entity ma być zupełnie oderwane od bazy danych, a to oznacza, że entity może przechowywać dane, które przechowywane są w kilku tabelach (relacyjne bazy danych) lub dokumentach (nierelacyjne bazy danych). Niestety nie znalazłem wyjaśnienia, gdzie wtedy powinno występować to rozdzielenie (mapowanie) danych, wg mnie to UserRepository powinno robić, ale nie jestem w 100% pewien, może pomiędzy repozytorium a danymi powinna być jakaś warstwa mapująca, a może ta warstwa powinna byc między entity a repozytorium ?. Może ktoś z Was rozważał podobny problem?

ehem. Teoretycznie powinien wtedy robić to model. Z tym że nie model w rozumieniu railsowym. To znaczy powinieneś mieć osobne warstwy modelu logiki biznesowej i ORMa. Tak się to robi w korporacyjnym światku Javy ™.
O ile twoja aplikacja nie ma naprawdę skomplikowanej logiki biznesowej i ponad 300 (tak trzysta) modeli ja bym się w to nie pchał.

Ja model rozumiem jako coś co posiada logike aplikacji, a nie jak “zboczenie” w świecie railsowym, jako activerecord.

Czyli jeśli dobrze rozumiem, to entity powinno łączyć się z warstwą, która rozdzieli dane i dopiero będzie łączyć się z każdym repozytorium (tylko takie mapowanie przed repozytorium powoduje kolejne problemy, gdyż w tym momencie warstwa mapująca narzuca już określoną strukturę danych, którą są 2 warstwy niżej).

Chyba żeby zrobić to tak, że entity łączy się z repozytorium, repozytorium przy wyborze adaptera/backendu wybiera odpowiedni model mapujący który to dopiero rozdziela dane i wtedy dane przekazywane sa do np. ORMa, wtedy to byłoby chyba ok.

W sumie to nie miałem namyśli jakiejś konkretnej aplikacji a sposób zaimplementowania tego problemu.

@wafcio Generalnie jeszcze w swojej kilkunastoletniej karierze nie spotkałem się z projektem w którym tak skomplikowany system byłby potrzebny.

tutaj nie chodzi czy to jest potrzebne czy nie. Chcę po prostu zakodować “Clean Architecture” od Boba Martina: https://www.youtube.com/watch?v=WpkDN78P884.

To Entity to chyba dokladnie to samo co Data Transfer Object - http://martinfowler.com/eaaCatalog/dataTransferObject.html ?

Komentarz Fowlera o ich stosowaniu poza optymalizacja remote calls:

super, tego szukałem

@wafcio W temacie Clean Architecture to, jeśli Java i UML Ci nie straszne, to polecam książkę Domain-Driven Design - http://www.amazon.com/gp/product/0321125215/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321125215&linkCode=as2&tag=shop4f-20 Sam właśnie brnę przez nią. :slight_smile: Choć na WrocLove.rb to co pokazywał Adam Hawkins @adman65 i Emanuele Delbono - @emadb było mocno z tym powiązane.

dzieki za pozycje, zapoznam sie z nimi. To co pokazywał Adam Hawkins było mocno ograniczone, “Rethink Application Architecture” w jego demonstracyjnym wideo nie podoba mi się (ale to moja subiektywna opinia), że zamiast przedstawić ogólną ideę i sposób zakodowania to znaczna większość tego to sposób w jaki testy pisze.