Что такое инверсия зависимостей в python?

можете объяснить это с точки зрения python?
  • Вопрос задан
  • 489 просмотров
Пригласить эксперта
Ответы на вопрос 2
Ranc58
@Ranc58
Backend python developer
По сути - как и везде. Пример- У бизнесс логики не должно быть зависимостей от конкретных реализаций. Сегодня у вас все хранится в постгрес а завтра в монге. Инверсия зависимостей позволяет более менее безболезненно совершить такой переезд, так как слой бизнесс логики понятия не имеет где вы храните данные. Ниже накидал грубый но вроде понятный кусок кода. Есть некая сущность блог, к которой можно добавлять пользователей и смотреть их. Блог должен откуда то тянуть данные и где то хранить их. Мы создаем некий интерфейс DBInterface ,который имеет стандартные методы добавить/удалить данные. Далее создаем класс SQLdb который реализует этот интерфейс.

В самом классе блога мы реализуем функции получения/добавления пользователей без привязки к конкретной системе хранения: просто создаем экземпляр класса SQLdb и экземпляр класса Blog , передавая туда sqldb. Когда мы захотим переехать на монгу - нам не надо будет трогать класс блога. Мы всего лишь реализуем класс Mongodb для новой базы и будем опрокидывать его в блог вместо sqldb. Итог - блог не зависит от системы хранения вообще.
Пример сильно упрощен и утрирован, но для понимания как оно работает думаю сойдет)

from abc import ABC, abstractmethod
import random


class DBInterface(ABC):

    @abstractmethod
    def insert(self, data):
        pass

    @abstractmethod
    def get(self, id):
        pass


class SQLdb(DBInterface):

    def insert(self, data):
        print(f"inserted {data} from mysql")
        return random.randint(0, 100)

    def get(self, id):
        print(f"get user {id} data from mysql")
        return {'id': id, "data": "some_data"}


class Mongodb(DBInterface):

    def insert(self, data):
        print(f"inserted {data} from mongo")
        return random.randint(0, 100)

    def get(self, id):
        print(f"get user {id} data from mongo")
        return {'id': id, "data": "some_data"}


class Blog:

    def __init__(self, db, blog_id):
        self.db = db
        self.blog_id = blog_id

    def add_user(self, name):
        self.db.insert(name)

    def get_users(self):
        return self.db.get(self.blog_id)


if __name__ == '__main__':
    sql_db = SQLdb()
    mongo_db = Mongodb()

    blog_with_sql = Blog(db=sql_db, blog_id=1)
    blog_with_sql.add_user("test") # Выведет inserted test from mysql

    blog_with_mongo = Blog(db=mongo_db, blog_id=1)
    blog_with_mongo.add_user("test") # Выведет inserted test from mongo
Ответ написан
Hivemaster
@Hivemaster
Админ, который хочет программировать
То же самое, что и в любом другом языке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы