2010-10-16 25 views
3

J'ai une application Web (dans ASP.NET MVC) avec un contrôleur de citations. Ce contrôleur peut gérer plusieurs types de citation, MotorQuotation, PropertyQuotation, etc ...Quelles méthodes peuvent être employées pour utiliser la composition par rapport à l'héritage?

Actuellement, il utilise l'héritage, c'est-à-dire un modèle de citation et ses enfants, pour modéliser le domaine. Les différentes classes d'enfants ont des différences dans les données qu'ils stockent et non dans leurs comportements. La différence de comportement viendrait avec leurs méthodes de validation car les validations peuvent être différentes selon les champs uniques qu'une classe enfant peut stocker.

La question est de savoir comment quelqu'un modéliserait les objets de citation en utilisant la composition au lieu de l'héritage?

+1

Je sais qu'ils disent "préfèrent la composition à l'héritage" - ce n'est pas la même chose que "ne pas utiliser l'héritage quand c'est approprié". En dehors de cette énonciation, quel est votre élan pour convertir en composition? – Oded

+0

Chaque objet de soumission peut être un type unique. Ensuite, le contrôleur de devis doit avoir un conteneur distinct pour chaque type de devis qu'il peut gérer. Il y aurait aussi du code supplémentaire pour itérer sur tous les types. Je pense que ce problème particulier est un ajustement à la main pour l'héritage. Considérons la maintenabilité. Si vous ajoutez un nouveau type de citation pour l'héritage, vous implémentez une nouvelle classe dérivée. Si vous ajoutez un nouveau type de devis pour la composition, vous implémentez une nouvelle classe autonome, plus vous devez modifier le code du contrôleur pour prendre en charge un nouveau type de conteneur. –

+0

@Amardeep Je n'ai pas très bien compris votre commentaire. Que voulez-vous dire par "conteneur"? Dans le contrôleur, je dois utiliser l'objet parent en tant que modèle, puis le convertir en l'enfant qu'il est censé être. N'est-ce pas une mauvaise architecture? – Laz

Répondre

2

La façon dont vous décrivez le problème, il semble que ce soit un bon cas pour l'utilisation de l'héritage. La règle de base est d'utiliser l'héritage si A est-a B et d'utiliser la composition si A est-implémenté-en-termes-de B.

La recommandation de préférer la composition à l'héritage ne signifie pas "ne jamais utiliser l'héritage" ". Cela signifie utiliser l'héritage de manière appropriée. Par exemple, si vous écrivez une classe Stack en C++ en utilisant un std::vector, vous ne voulez pas dériver Stack de vector. Un Stack n'est pas un vector, il est mis en œuvre-en-termes-d'un vector, ce qui implique la composition. Vous voulez également éviter de créer des hiérarchies de classes profondes, car cela entraîne un couplage étroit.

Dans votre cas, cependant, l'héritage semble être un choix évident.

+1

Exactement. La règle "préférer la composition sur l'héritage" s'applique spécifiquement à la question de la réutilisation du code, pas à tous les aspects de la conception OO. – Porculus