web-dev-qa-db-fra.com

Quand utiliser l'association, l'agrégation, la composition et l'héritage?

J'ai lu de nombreux articles sur Stackoverflow expliquant la différence entre les relations: associations, agrégation, composition et héritage, avec des exemples. Cependant, je suis plus spécifiquement confus quant aux avantages et aux inconvénients de chacune de ces approches, et quand une approche est la plus efficace pour la tâche à accomplir. C'est quelque chose sur lequel je n'ai pas été capable de trouver une bonne réponse.

Pour rester en ligne avec les directives du forum, je not demande pourquoi les gens préfèrent personnellement utiliser l’héritage par rapport à la composition, par exemple. Je suis particulièrement intéressé par les avantages/faiblesses objectives de chaque approche, aussi fort que cela puisse paraître. C'est à dire. Une approche crée-t-elle un code plus lisible qu'une autre, ou a-t-elle une meilleure efficacité du temps d'exécution, etc.

Idéalement, si quelqu'un pouvait me donner des exemples concrets dans lesquels ces approches ont peut-être réussi ou échoué et pourquoi, ce serait extrêmement utile pour développer mes connaissances et, j'espère, les autres.

Dans l’intérêt d’assurer une base solide pour travailler, j’ai inclus des exemples de chaque relation dans Python 2. Espérons que cela devrait permettre d’éviter la confusion, si ma compréhension de ces relations n’est pas exacte.

Association

La classe B a une relation d’association hebdomadaire avec la classe A, car elle utilise des attributs spécifiques de A dans la méthode addAllNums. Cependant, c'est l'étendue de la relation.

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def addNums():
        self.b + self.c

class B(object):
    def __init__(self, d, e):
        self.d = d
        self.e = e

    def addAllNums(self, Ab, Ac):
        x = self.d + self.e + Ab + Ac
        return x

ting = A("yo", 2, 6)
ling = B(5, 9)

print ling.addAllNums(ting.b, ting.c)

Agrégation

La classe B forme une relation d'agrégation avec la classe A, car elle référence un objet A indépendant lors de l'initialisation, en tant qu'un de ses attributs. Alors qu'un objet B dépend de A, en cas de destruction de B, A continuera d'exister car il est indépendant de B.

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def addNums():
        self.b + self.c

class B(object):
    def __init__(self, d, e, A):
        self.d = d
        self.e = e
        self.A = A

    def addAllNums(self):
        x = self.d + self.e + self.A.b + self.A.c
        return x

ting = A("yo", 2, 6)
ling = B(5, 9, ting)

print ling.addAllNums()

Composition

Tout comme l'agrégation, cependant, plutôt que de référencer un objet indépendant, B initialise en fait une instance de A dans son propre constructeur en tant qu'attribut. Si l'objet B est détruit, l'objet A l'est aussi. C'est pourquoi la composition est une relation si forte.

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def addNums():
        self.b + self.c

class B(object):
    def __init__(self, d, e):
        self.d = d
        self.e = e
        self.A = A("yo", 2, 6)

    def addAllNums(self):
        x = self.d + self.e + self.A.b + self.A.c
        return x

ling = B(5, 9)

print ling.addAllNums() 

J'ai décidé de ne pas inclure un exemple d'héritage car j'en suis tout à fait satisfait, et j'estime que son inclusion peut donner un sens à la question.

Quoi qu’il en soit, encore une fois, quels sont les avantages et les inconvénients des exemples ci-dessus et de l’héritage (comparés les uns aux autres).

Merci.

9
daydreamingwill

La règle de base selon wikipedia est que les relations s’atténuent avec le temps ou que le modèle conceptuel est de plus en plus détaillé, c’est-à-dire que les compositions deviennent des agrégations et que les agrégations deviennent des associations. à mesure que vous ajoutez des fonctionnalités, le moteur peut être transféré d'une voiture à une autre, ce qui en fait une agrégation.

Donc, pour répondre à votre question sur les avantages et les inconvénients de chaque méthode, il s’agit davantage de la relation que vous modélisez, comme si je stockais un nom sous la forme d’une chaîne ou d’un nombre.

1
Harlekuin

Mon opinion personnelle est que vous devriez d’abord réfléchir à la manière dont vous modéliseriez les données du monde réel de manière à vous aider à résoudre des problèmes spécifiques du monde réel. Assigner des choses à des classes, décrire les relations entre les classes et/ou les instances, décrire les propriétés des choses, etc., est la partie difficile: obtenez ce droit, et le modèle dans le code (héritage, agrégation, sous-classification, etc.) devient facile. Par exemple:

Quelle est la relation entre les carrés et les rectangles? Les matrices inversibles sont-elles une sous-classe de matrices carrées? Une vache morte est-elle un mammifère? L'étudiant est-il une sous-classe d'une personne? Est-ce que l'enseignant est une sous-classe? Qu'en est-il des assistants?

0
MMN