1

Dans un projet au travail que nous avons une certaine classe de type valeur dans notre modèle de domaine qui comprend un très grand nombre d'attributs ...Vous cherchez des informations sur une utilisation du motif adaptateur

public class BigValueType { 
    private Foo foo; 
    private Bar bar; 
    private Baz baz; 

    //... 
} 

Nous avons Nous avons réalisé que nous aimerions "concentrer" ceci en un certain nombre de classes différentes, un peu plus spécialisées, qui ne possèdent qu'un sous-ensemble des attributs de cette classe. Je pense que nous aimerions avoir quelque chose comme différentes "vues" de ces données. Cependant, ce modèle de domaine est destiné à être plutôt général, et non spécifique à ce projet. Des extensions spécifiques au projet lui seront ajoutées lors de futurs projets, mais le modèle de domaine commun sera séparé de ces extensions. Si nous définissons simplement un groupe de classes maintenant, il est probable que d'autres projets utilisant le modèle de domaine devront écrire leurs propres versions légèrement différentes plus tard. (Nous ne pouvons pas facilement prédire quelles vues de ces données seront utiles.)

Je pense que ce que nous devrions faire est d'écrire des adaptateurs spécifiques au projet pour cette grande classe qui présente les différentes vues des données. De cette façon, les futurs utilisateurs du domaine n'ont rien à toucher dans le modèle de domaine "commun" pour définir de nouvelles vues de cette information.

public class AdapterA { 
    private BigValueType wrapped; 
    //... 

    public ViewA(BigValueType wrapped) { 
     //... 
    } 

    public Foo getFoo() { 
     return wrapped.getFoo(); 
    } 

    //... 
} 

Cela fait plus de sens pour moi que l'héritage normal parce que notre classe de niveau supérieur/l'interface aurait presque rien dedans.

Des commentaires sur cette approche?

Répondre

1

Tout d'abord, il est important de comprendre le problème que vous souhaitez résoudre. Avoir une classe avec un grand nombre d'attributs n'est pas nécessairement mauvais et si vous voulez faire le refactoring seulement pour se conformer aux «bons» principes de conception, je reconsidérerais la décision. Ceci étant dit, il s'agit d'un concept assez commun dans le monde de l'architecture orientée services. Vous avez un grand service qui prend un message complexe avec un assez grand nombre d'attributs en tant que demande. Ce service est ensuite «adapté» pour répondre aux besoins de clients différents. Donc, votre design devrait bien fonctionner. Bien sûr, cela suppose que vous connaissiez déjà toutes les «vues» possibles ou que vous deviez écrire de nouveaux adaptateurs pour de nouveaux clients. Cette 'adaptation' peut être effectuée à deux niveaux - le niveau de l'interface utilisateur (qui est essentiellement votre conception - pour adapter la classe) ou à un niveau inférieur, comme au niveau de la base de données, et cela modifie à son tour votre classe principale aussi. Cela dépend de votre application, des utilisateurs de votre infrastructure, etc. Une autre approche à prendre en considération pourrait également être la méthode REST: exposer les données (Foo, Baz, etc.), bien que provenant de la classe principale, et laisser les clients effectuer leur propre traitement des données avec les données principales (Foo, Baz, etc.). classe fournissant essentiellement des fonctionnalités CRUD sur ces données. Votre classe se comporte alors plutôt comme une structure sans réelle logique métier.

L'une de ces trois approches devrait être acceptable, à mon humble avis.

0

bien .. me semble bien. Je pense que votre solution en utilisant la composition est bien meilleure que l'utilisation de l'héritage, cela affectera votre modèle et génèrera beaucoup de classes cohésives.

0

J'ai trouvé que l'objectif de partager du code entre plusieurs projets est plus difficile qu'il n'y paraît. Au moins, il est difficile de l'obtenir droite!C'est exactement pour les raisons que vous discutez autour de ne pas savoir exactement quelles fonctionnalités vous pourriez avoir besoin dans un nouveau projet. Le problème est que le problème de l'adaptateur ne va pas résoudre cela pour vous (si les objets sous-jacents ne prennent pas en charge le jeu de fonctionnalités requis, c'est-à-dire).

Je suggère que vous utiliser interfaces pour vos projets distincts, mais que vous codez les implémentations séparément. Si vous vous trouvez écrire exactement le même code 3 fois puis tirez-le dans une bibliothèque commune. Essayez de garder votre bibliothèque aussi légère que possible.

La gestion de plusieurs dépendances peut être coûteuse plus tard, lorsque vous avez besoin d'ajouter des fonctionnalités (en conflit) et que vous avez la complication d'affecter de nombreuses applications.

Questions connexes