Ответ
Инверсия контроля (Inversion of Control, IoC) — это принцип проектирования, при котором управление потоком выполнения программы передается внешнему фреймворку или контейнеру. Вместо того чтобы ваш код вызывал функции фреймворка, фреймворк вызывает ваш код в нужные моменты.
Простыми словами, вы пишете компоненты (например, обработчики запросов), а фреймворк решает, когда и как их вызывать. Это снижает связанность кода и повышает его модульность.
Самый распространенный способ реализации IoC — Внедрение зависимостей (Dependency Injection, DI).
Пример с DI:
Вместо того чтобы сервис сам создавал зависимость (например, подключение к БД), он получает её извне.
# Зависимость
class DatabaseConnection:
def save(self, data: str):
print(f"Saving '{data}' to the database.")
# Сервис, который использует зависимость
class UserService:
# Зависимость `db_connection` внедряется через конструктор
def __init__(self, db_connection: DatabaseConnection):
self._db = db_connection
def create_user(self, username: str):
self._db.save(username)
# IoC-контейнер (или главный модуль) создает и связывает объекты
db = DatabaseConnection()
user_service = UserService(db) # Управление зависимостью "инвертировано"
user_service.create_user("Alice")
Преимущества:
- Слабая связанность (Low Coupling):
UserService
не знает, как создатьDatabaseConnection
, что упрощает замену компонентов. - Упрощение тестирования: В тестах можно легко подменить настоящую
DatabaseConnection
на mock-объект. - Гибкость: Упрощает управление конфигурацией и жизненным циклом объектов в больших приложениях.