Bonjour,

Effectivement ce cas précis ne s'était pas encore présenté mais il ressemble tout de même aux listes de produits des pages de consultation/édition des purifications ou des tests biologiques. Ce ne sont alors pas des Molecule ou des MoleculeProvenance qu'on liste mais des Extrait ou des Fractions (la différence étant qu'Extrait et Fraction héritent tous deux de Produit).
La différenciation de traitement pour ces deux entités étaient alors gérée par des typeof, et tu fais bien de soulever le problème Eric car cette solution mériterait également d'être améliorée.

Pour la liste des Molecule/MoleculeProvenance, je vois deux améliorations :
  - différenciation de traitement sans passer par des typeof
  - interface commune afin de ne pas itérer sur une liste d'Object (ou pour être précis d'AbstractModel, tel qu'écrit actuellement dans le code)

En ce qui concerne le pattern visiteur, ce n'est pas à mon avis la solution la plus adaptée car nous n'avons pas besoin d'avoir plusieurs traitements pour un type d'objet. Par ailleurs, l'ajout d'une propriété "visitor" (appelée par accept) a davantage d'impact sur le modèle que l'ajout d'une méthode (bien qu'il soit possible de la déclarer @Transiant).

Voici deux propositions à discuter qui reprend le cas de l'Id à afficher à chaque ligne du tableau (propriété "id" si Molecule ou "molecule.id" si MoleculeProvenance).

1ère proposition :

lien pour modifier le diagramme

+ la surcharge de méthode permet la différenciation de traitement
+ aucune modification du modèle, MoleculeRow est indépendant du modèle et peut ainsi être inclue dans la couche web
- ne répond pas au problème d'interface commune

2ème proposition :

lien pour modifier le diagramme

(comprendre <<Interface>> pour --Interface--)

+ l'utilisation du surclassage permet d'apporter les deux améliorations
- est un peu plus intrusif par rapport au modèle (bien que l'interface et les méthodes supplémentaires n'auront a priori pas d'impact sur la structure de la BD sous-jacente)

Quelle solution préférez-vous ? Une autre alternative à proposer ?

Adrien

--
Adrien Cheype
Ingénieur en Systèmes d'Information
Service « Informatique Scientifique et Appui aux Partenaires du Sud »
Direction du Système d'Information (DSI)
http://www.ird.fr/dsi/
http://www.ird.fr/informatique-scientifique/

INSTITUT DE RECHERCHE POUR LE DEVELOPPEMENT
BP A5 - 98848 Nouméa - Nouvelle Calédonie
Tél. +687 260 789