2013-08-06 4 views
1

J'ai un modèle de domaine A que je veux transformer en un autre modèle de domaine B. Donc, pour chaque élément de modèle, j'ai besoin de le convertir en un ou plusieurs éléments de B.convertir le modèle de domaine java du domaine A au domaine B

domaine a semble très simplifié comme:

public class Model 
{ 
    public List<ModelElement> elements; 
} 

public class ModelElement 
{ 
    public SubElement subElement; 
} 

public class SubElement 
{ 
    public String someData; 
} 

ressemble domaine B comme

public class Layout 
{ 
    public List<Layer> layers; 
} 

public class Layer 
{ 
    public LayerData layerData; 
} 

public class LayerData 
{ 
    public int layerNumber; 
    public String name; 
} 

Ceci est vraiment simplifié, mes modèles sont un peu plus complexe, mais pour expliquer, je pense qu'il est assez. Donc, ma question est, quelle est une bonne approche pour le convertisseur.

Je pensais écrire une seule classe, qui traverse le modèle et convertit chaque élément. À la fin, j'ai un énorme cours de conversion, ce qui n'est pas très agréable.

Mon autre approche consistait à construire une usine, ce qui donne pour chaque élément du domaine A un convertisseur spécifique. Chaque convertisseur peut alors appeler l'usine pour obtenir le convertisseur pour les sous-éléments. Malheureusement, j'ai besoin pour certaines conversions d'éléments de données supplémentaires. Donc, pour l'utiliser dans certains convertisseurs, je dois les passer à travers tous les convertisseurs supérieurs, ce qui ne sonne pas très bien aussi.

Quelle serait une bonne façon de le faire?

Merci pour l'aide Simon

Répondre

0

Si votre modèle de données est hiérarchique et fini, j'irais avec la première approche , mais diviser ses responsabilités en plusieurs classes. Avoir la classe principale publiant les données nécessaires pour convertir. Ensuite, il appelle une classe de convertisseur pour la racine (Model/Layout) qui convertit et appelle les sous-convertisseurs (ModelElement/Niveau de couche) et ainsi de suite. L'astuce consiste à toujours passer une référence à la classe principale, qui fonctionnera comme une enveloppe ou un magasin de données pour les convertisseurs. Ce faisant, vous obtiendrez un design agréable, découplé avec simple responsable: fournir des données, convertir une seule classe et ainsi de suite.

Ceci est seulement un croquis du design que j'irais. C'est le meilleur que je peux dessiner compte tenu de l'information. Vous pouvez vouloir l'adapter et peut-être ajouter une certaine abstraction (par exemple des interfaces avec la publication de données réduite pour la classe d'enveloppe).

0

Vous voudrez peut-être regarder DOZER. La lib permettra la transformation générique des champs (s'ils partagent le même nom) et permettra également le convertisseur personnalisé.

Questions connexes