digital-garden/dev/architecture/Inversion of Control.md

5.8 KiB
Raw Blame History

aliases tags date zero-link parents linked
IoC
maturity/🌱
2023-10-26
../../meta/zero/00 Архитектура ПО
Архитектурная концепция

Inversion of Control (IoC) — это архитектурная концепция, которая заключается в передаче управления зависимостями программы от самого кода к внешней системе. Обычно, если один объект зависит от другого, он сам создаёт или запрашивает его. В IoC этот процесс контролируется извне, что позволяет программам быть более гибкими и легко расширяемыми.

Простой пример: допустим, у вас есть класс, который зависит от другого класса для выполнения своей работы. В обычном подходе класс сам создаёт объект-зависимость.

class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

    public Car() {
        // Класс Car сам создает зависимость
        this.engine = new Engine();
    }

    public void drive() {
        engine.start();
        System.out.println("Car is moving");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.drive();
    }
}

С использованием IoC, создание объекта Engine передаётся внешнему компоненту. Теперь Car не отвечает за создание своей зависимости:

class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

    // Зависимость передается через конструктор (IoC)
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("Car is moving");
    }
}

public class Main {
    public static void main(String[] args) {
        // Создание зависимостей осуществляется снаружи
        Engine engine = new Engine();
        Car car = new Car(engine);
        car.drive();
    }
}

IoC помогает реализовать принципы ../../../../garden/ru/dev/architecture/SOLID, особенно ../../../../garden/ru/dev/architecture/Dependency Inversion Principle (Dependency Inversion Principle, DIP), согласно которому высокоуровневые модули не должны зависеть от низкоуровневых модулей напрямую. Оба типа модулей должны зависеть от абстракций. В контексте IoC это означает, что классы не должны напрямую создавать свои зависимости, а получать их через интерфейсы или внешние механизмы. Такой подход упрощает замену реализаций, тестирование и расширение приложения.

Преимущества IoC

  • Ослабление связности кода. Поскольку классы не создают свои зависимости напрямую, их связь с конкретными реализациями уменьшается. Это облегчает изменение или замену зависимостей без изменения самого класса.
  • Упрощение тестирования. IoC позволяет легко заменять реальные зависимости на тестовые (например, mock-объекты), что упрощает процесс модульного тестирования. Вы можете изолировать классы и тестировать их независимо от реальных зависимостей.
  • Лучшая расширяемость. Система, построенная на принципах IoC, легче адаптируется к изменениям и новым требованиям. Новые зависимости могут быть добавлены или изменены без значительного изменения существующего кода.
  • Разделение ответственности. С IoC создаётся чёткое разделение между бизнес-логикой и управлением зависимостями. Это помогает сосредоточить внимание на основной функциональности класса, не отвлекаясь на вопросы создания объектов.

Мета информация

Область:: ../../meta/zero/00 Архитектура ПО Родитель:: Архитектурная концепция Источник:: Автор:: Создана:: 2023-10-26

Дополнительные материалы

Дочерние заметки