Explication de la leçon
Après cette leçon, tu seras capable de :
L'héritage indique qu'une classe est une sorte d' autre classe (class PremiumAccount(Account)). La composition indique qu'un objet possède un autre objet pour l'aider à accomplir son travail (Notifier possède un Formatter). Les deux modèles sont utiles, mais l'héritage doit représenter une véritable relation de type plutôt qu'un raccourci pour réutiliser du code.
Avec la composition, le constructeur de l'objet externe reçoit un collaborateur et le stocke. Il délègue ensuite le travail : self.formatter.render(message). Fournir le collaborateur depuis l'extérieur (injection par constructeur) facilite le changement de comportement et le test de la classe externe sans avoir à la modifier.
Ne crée pas automatiquement un collaborateur de remplacement dans le constructeur lorsque l'appelant en a déjà fourni un ; cela ignorerait le comportement choisi. La composition évite également de grandes chaînes d'héritage lorsque le seul but est de combiner des responsabilités distinctes.
class Formatter:
def render(self, value):
return value.upper()
class Service:
def __init__(self, formatter):
self.formatter = formatter
def output(self, value):
return self.formatter.render(value)
service = Service(Formatter())
print(service.output("ready"))Sortie :
READYDeux formateurs partagent la même méthode mais produisent des résultats différents.
class PlainFormatter:
def render(self, message):
return message
class BracketFormatter:
def render(self, message):
return f"[{message}]"
class Reporter:
def __init__(self, formatter):
self.formatter = formatter
def report(self, message):
return self.formatter.render(message)
print(Reporter(PlainFormatter()).report("ok"))
print(Reporter(BracketFormatter()).report("ok"))Sortie :
ok
[ok]L'héritage est approprié lorsque l'enfant est réellement un type spécialisé de son parent.
class Storage:
def kind(self):
return "storage"
class CloudStorage(Storage):
def kind(self):
return "cloud storage"
print(CloudStorage().kind())Sortie :
cloud storageUn stockage cloud est un type de stockage ; un service a un formateur.
class RetryPolicy:
def can_retry(self, attempt):
return attempt < 3
class Worker:
def __init__(self, policy):
self.policy = policy
def should_retry(self, attempt):
return self.policy.can_retry(attempt)
print(Worker(RetryPolicy()).should_retry(2))Sortie :
True| Relation | Exemple | Signification |
|---|---|---|
| Héritage (est-un) | class Admin(User) | Type spécialisé |
| Composition (a-un) | Report(formatter) | Utilise un autre objet |
| Injection de dépendance | self.formatter = formatter | Conserver le collaborateur fourni |
| Délégation | self.formatter.render(text) | Demander au collaborateur de faire son travail |
self.formatter).