Инверсия зависимостей в Python - PullRequest
2 голосов
/ 22 апреля 2020

Я начал применять принципы SOLID к своим проектам. Все они для меня понятны, кроме инверсии зависимостей, потому что в Python у нас нет изменений для определения переменной в типе некоторого класса внутри другого класса (или, может быть, просто я не знаю). Итак, я реализовал принцип обращения зависимостей в двух формах и хочу знать, какая из них истинна, как я могу их исправить. Вот мои коды:

d1.py:

class IFood:
    def bake(self, isTendir: bool): pass

class Production:
    def __init__(self):
        self.food = IFood()

    def produce(self):
        self.food.bake(True)

class Bread(IFood):
    def bake(self, isTendir:bool):
        print("Bread was baked")

d2.py:

from abc import ABC, abstractmethod
class Food(ABC):
    @abstractmethod
    def bake(self, isTendir): pass

class Production():
    def __init__(self):
        self.bread = Bread()

    def produce(self):
        self.bread.bake(True)

class Bread(Food):
    def bake(self, isTendir:bool):
        print("Bread was baked")

1 Ответ

2 голосов
/ 22 апреля 2020
# define a common interface any food should have and implement
class IFood:
    def bake(self): pass
    def eat(self): pass

class Bread(IFood):
    def bake(self):
        print("Bread was baked")
    def eat(self):
        print("Bread was eaten")

class Pastry(IFood):
    def bake(self):
        print("Pastry was baked")
    def eat(self):
        print("Pastry was eaten")

class Production:
    def __init__(self, food): # food now is any concrete implementation of IFood
        self.food = food # this is also dependnecy injection, as it is a parameter not hardcoded

    def produce(self):
        self.food.bake()  # uses only the common interface

    def consume(self):
        self.food.eat()  # uses only the common interface

Используйте это:

ProduceBread = Production(Bread())
ProducePastry = Production(Pastry())
...