Особое место в архитектуре занимает понятие "инверсия управления", это довольно широкий термин, который можно рассматривать в контексте разных аспектов управления архитектурой. Существуют много разных форм инверсии управления, и они могут находится на разных уровнях абстракции, отражать разные аспекты управления и деже иметь разное схематическое представление.
В этом стрим мы поговорим о трех вариантах инверсии контроля:
Прежде чем говорить о конкретных вариантах инверсии управления хотелось бы отметить, что существует огромное количество разных толкований этого термина. В общем смысле под инверсией понимается передача управления от потомков к родителю, таким образом, что у родительских сущностей появляется контролировать потомков в рамках их ответственности.
Но самый главный вопрос, который мы должны себе задать - инверсия управления "чего"?
Сердцем любых вычислений является процессор. Упрощенно это вычислительное устройство, которое получает на вход последовательность команд, а на выход отдает результат их выполнения. С позиции построения программы такой функциональности явно недостаточно, поэтому любой компьютер кроме процессора имеет память, в котрой хранится последовательность команд и с можно устанавливать указатель на ту команду, которую процессор должен выполнить следующей.
Так мы приходим к пониманию того, что программа - это команды которые должны быть организованы в правильно порядке и процесс организации произвольных команд в нужной последовательности и называется "поток управления".
Тот кто решает в какой последовательности выстраивать команды в потоке и осуществляет управление этим потоком.
В простых программах поток команд может быть организован как угодно, хоть в виде обычного списка. Но усложнение программ и задач, которые эти программы решают привело к структурному программированию (основной принцип - код должен быть организован в блоки), а затем и к объектно ориентированному программированию.
Таким образом у нас появились абстракции более высокого уровня, которые объединяются в блоки, компоненты, модули и т.д. И особенностью этих блоков является то, что они могут зависеть друг от друга.
Так появилась потребность управления зависимостями и понятие "инверсии" зависимостей.
Важно! Данный подход является статическим.
Следующий шаг в процессе организации зависимостей - это динамическое управление зависимостями. Т.е. такой подход, который бы позволил определять зависимости и подставлять их в программу непосредственно в процессе выполнения кода.
Так обычная инверсия зависимостей стала "инверсией контроля зависимостей", что получило отражение в принципах IOC 1, 2, 3 типов или DI.
На данном этапе должно быть понятно, что инверсное управление чем-либо - это эффективный способ "развернуть" управление и разгрузить части системы, перенеся центры принятия решений в более удачное место. Этот принцип можно применять где угодно. Я приведу пример из личного опыта, как мы инвертировали стандартные процессы управления ресурсов, в средствах мониторинга. Это пример инверсии более высокого уровня, которая тем ни менее остается инверсией управления.
Рассмотрим детально то, как формируется инверсия управления в разных случаях, на конкретных вариантах реализации.