Что такое инверсия контроля (IoC)?

Ответ

Инверсия контроля (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-объект.
  • Гибкость: Упрощает управление конфигурацией и жизненным циклом объектов в больших приложениях.