J'ai hérité d'une grande application Java qui utilise Struts, Spring et Hibernate. Les classes et les interfaces que je traite quotidiennement sont les suivantes: Struts Actions, Struts ActionForms, Objets de valeur, Interfaces de service et implémentations, Interfaces DAO et Implémentations, et Entités. Je suis assez clair sur le comment et le pourquoi de la plupart d'entre eux, sauf que je ne suis pas sûr de la bonne séparation des responsabilités entre les ActionForms, les objets de valeur, et les entités. Je devrais également mentionner que le modèle de domaine (c.-à-d. Toutes les entités) ne contient pas beaucoup (s'il y en a) de vraie logique métier. C'est essentiellement une application CRUD et la plupart de la logique réelle est dans la base de données (beurk!). Quoi qu'il en soit, je m'interroge sur plusieurs problèmes liés à Java:Comment utiliser correctement Struts ActionForms, Value Objects et Entities?
1) Il semble qu'il n'y ait pas beaucoup de différence entre les entités et les objets de valeur (VOs), et beaucoup de code doit être écrit pour transformer dans l'autre quand ils traversent la couche de service dans l'une ou l'autre direction (les actions de Struts ne traitent que des VO, les DAO ne traitent que des entités). Donc, les VO et les Entités semblent un peu redondants. Pourquoi les avoir tous les deux?
2) Où devrait aller le VO < -> Entity translation code? La couche de service, l'Entité, la VO?
3) Les VO sont placés directement dans ActionForms et directement liés aux étiquettes dans la JSP (par exemple). Est-ce une bonne pratique? Si non, quel est le design approprié?
4) Il n'est pas clair comment gérer correctement les dépendances de clés étrangères dans les objets de valeur. Par exemple, certains VO ont un champ de type qui, en termes de base de données, représente une relation de clé étrangère dans une table de types. Dans l'interface utilisateur, cela se traduit par un champ déroulant qui permet à l'utilisateur de choisir le type, OU une étiquette qui affiche simplement la représentation textuelle du type (en fonction de l'écran). Maintenant, le VO devrait-il avoir une propriété pour l'ID de type, la représentation textuelle du type, ou les deux? Qui est responsable de la traduction entre les deux, et quand?
5) Les VO ont un champ pour leur ID de base de données. Je pensais que les VO n'avaient pas d'identité? Qu'est-ce qui se passe avec ça? J'espère que ces questions sont assez génériques pour être d'intérêt général. Il semble que cela viendrait tout le temps dans ce type d'architecture.
Aussi, j'ai le soupçon que cette architecture est très lourde pour cette application, et si vous avez des suggestions sur un meilleur, allez-y. Mais je m'intéresse principalement à la réponse aux questions ci-dessus, car une architecture différente est un refactoring à long terme que je ne peux pas faire maintenant.
Belle réponse, merci! – thvo