2015-08-25 1 views
4

J'ai des problèmes avec l'architecture propre. Pour ceux d'entre vous qui ont lu l'article de blog de Fernando Cejas http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/, ma question est basée sur elle, et son code.Comment implémenter une ou plusieurs relations dans l'architecture propre

Son exemple de projet a un seul objet de domaine par utilisateur. Et tout est clair avec les POJO. Là où j'ai un problème, disons que l'utilisateur a des livres. Une relation de un à plusieurs. Comment aborderiez-vous cela dans Clean Architecture?

Tout comme lui j'ai quelques couches, donc 3 classes par objet de domaine (User, UserModel, UserEntity) et un référentiel par objet de domaine (UserDataRepository). Notre nouvel exemple aurait également Book, BookModel, BookEntity et BookDataRepository. J'ai également des classes de cas d'utilisation avec des variations CRUD.

Le problème pour moi est au niveau UI/Presenter. À ce stade du programme, j'ai un objet UserModel ET une liste de BookModels. Je n'ai pas userModel.getBooks(). Je n'ai pas userModel.save() (qui enregistrerait aussi tous les changements de livre).

Pour accentuer le problème, pour que cette analogie ressemble encore plus à mon cas d'utilisation réel, j'ai aussi la liste de toutes les pages dans les livres! :) Ainsi, lorsque je sauvegarde l'utilisateur, je veux sauvegarder dans les livres, et toutes les pages pour chaque livre qui aurait pu être modifié.

Comment procéder?

Deuxième question BONUS: Dans mon problème du monde réel, j'ai des classes qui dérivent d'une classe de base. Pour utiliser l'analogie ci-dessus: LeftPage et RightPage dériveraient de PageBase. Un livre a une liste. Cependant LeftPage et RightPage ont tous deux leurs dépôts séparés, leurs cas d'utilisation séparés, etc. (Mais cela ne fonctionne pas) Comment enregistrer une liste ?? Dois-je faire un SavePages de cas d'utilisation séparée qui aurait un:

si (pages.elementAt (i) instanceof LeftPage) { SaveLeftPage saveLeft = new ..... } else { SaveRightPage saveRight = nouveau ..... }

Je ne pense pas que je peux utiliser le polymorphisme parce que dans toute la documentation que j'ai vu, les modèles ne connaissent pas les cas d'utilisation.

J'espère que vous pouvez aider, je vous remercie beaucoup pour votre temps :)

-Mike

Répondre

1

C'est Uncle Bob's Clean Architecture. Fernando Cejas a fait un exemple simplifié dans Android mais vous devriez lire les concepts de l'original.

Pour votre problème, quel est votre cas d'utilisation? Enregistrer l'utilisateur avec les livres et les pages? Vous pouvez le faire, si ce sont les exigences du cas d'utilisation. Votre entité Utilisateur peut avoir une collection de Livres qui, à son tour, chaque livre aura une collection de Pages et votre UserRepository doit être capable de résoudre chacun à sa propre table (ou vous pouvez injecter des dépôts dans vos propres dépôts, mais dans ce cas vous devez être capable de sauvegarder tout ou annuler)

Pouvez-vous enregistrer un livre uniquement avec une référence utilisateur? Avoir une propriété qui identifie le propriétaire du livre ou le transmettre par argument à une UseCase pour le livre.

 public class SaveBookCase extends UseCase 
     { 
      public SaveBookCase(IBookRepository repository, Book book, int userId) 
      { 
      /// 
      } 

      //or 

      public SaveBookCase(IBookRepository repository, SaveBookRequest request) 
      { 
      /// SaveBookRequest is a class that has the book and the user id 
      } 
     } 

En ce qui concerne votre deuxième question bonus, si vous avez seulement une liste de PageBase que vous devez transmettre aux SavePages de USECASE, qui tranchera chaque élément au référentiel correct (dans ce cas, vous injecter 2 dépôts) . Mais dans votre exemple, il peut s'agir de la même entité de base de données avec un champ identifiant s'il s'agit de la gauche ou de la droite et, dans ce scénario, n'utilisez qu'un seul référentiel.

+0

Merci pour votre réponse. Oui, je sais que c'est Oncle Bob's :) Je me réfère à la version de M. Cejas pour deux raisons a) Je fais une application Android et b) le texte ci-dessus est juste un edit d'une lettre que je lui ai envoyé . :) Les spécificités du cas d'utilisation n'ont pas d'importance, il existe de nombreux cas d'utilisation. Ce qui compte, ce sont les données. Par exemple, je peux obtenir un utilisateur du référentiel d'utilisateurs. Mais alors on s'attendrait à faire user.getBooks() (de manière synchrone). Puis, avec le livre retourné, book.getPage() (encore une fois, de manière synchrone). Quel est le design correct pour rendre cela possible? – MikeWallaceDev

+0

Je ne sais pas si j'ai compris. Vous voulez quelque chose de similaire au chargement paresseux? Charger l'entité principale en premier et charger seulement les entités enfants à la demande (getBooks())? – jaimetotal

+0

Non, j'essaie de comprendre la bonne façon de reconstruire cette arborescence. Tous les documents/exemples fonctionnent avec de simples POJO. Et je le comprends. Mais rien ne montre comment travailler avec des objets qui sont parents-> enfants. En utilisant la connaissance de la documentation, j'aurais un objet Utilisateur et * à côté * un autre objet de la liste de types . Je ne sais pas comment créer correctement un objet Utilisateur qui a un enfant de la liste . – MikeWallaceDev