Inversion des dépendances
Leçon 26 sur 28 du cours Clean Code - Écrire un meilleur code avec Python de Coddy.
« Dépendre des abstractions, [pas] des concrétions. »
Montrons un exemple qui viole ce principe,
class LocalStorage:
def save(self, key, value):
print("Saved, " + key + ":" + value)La classe LocalStorage enregistre une paire clé et valeur.
Maintenant, nous avons une autre classe principale qui utilise LocalStorage,
class App:
def start(self, key, value):
storage = LocalStorage()
storage.save(key, value)LocalStorage est une implémentation concrète et App en dépend !
La meilleure façon serait de créer une interface (classe abstraite),
from abc import ABC, abstractmethod
class Storage(ABC):
@abstractmethod
def save(self):
passEt ensuite, utiliser une instance de l'interface au lieu de l'implémentation concrète.
Défi
FacileOn vous donne un code qui est presque terminé, ajoutez la classe abstraite Storage.
Notez qu'après l'implémentation, il est facile de passer à une autre classe concrète, par exemple CloudStorage...
Essayez vous-même
from abc import ABC, abstractmethod
# your code here
class LocalStorage(Storage):
def save(self, key, value):
print("Saved, " + key + ":" + value)
class App:
def __init__(self, storage):
self.storage = storage
def start(self, key, value):
storage.save(key, value)
if __name__ == "__main__":
storage = LocalStorage()
app = App(storage)
key = input()
value = input()
app.start(key, value)