--- aliases: - IoC tags: - maturity/🌱 date: 2023-10-26 zero-link: - "[[../../meta/zero/00 АрхитСктура ПО|00 АрхитСктура ПО]]" parents: - "[[АрхитСктурная концСпция]]" linked: --- Inversion of Control (IoC) β€” это [[архитСктурная концСпция]], которая Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ управлСния зависимостями ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ самого ΠΊΠΎΠ΄Π° ΠΊ внСшнСй систСмС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ зависит ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΎΠ½ сам создаёт ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ. Π’ IoC этот процСсс контролируСтся ΠΈΠ·Π²Π½Π΅, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ ΠΈ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΌΠΈ. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ зависит ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса для выполнСния своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ класс сам создаёт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. ```java 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 Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° созданиС своСй зависимости: ```java 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|SOLID]], особСнно [[../../../../garden/ru/dev/architecture/Dependency Inversion Principle|ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй]] (Dependency Inversion Principle, DIP), согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ высокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Оба Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций. Π’ контСкстС IoC это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ классы Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои зависимости, Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· интСрфСйсы ΠΈΠ»ΠΈ внСшниС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Ρƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, тСстированиС ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ прилоТСния. **ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° IoC** - **ОслаблСниС связности ΠΊΠΎΠ΄Π°**. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ классы Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ свои зависимости Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΈΡ… связь с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ рСализациями ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ. Π­Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Ρƒ зависимостСй Π±Π΅Π· измСнСния самого класса. - **Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ тСстирования**. IoC позволяСт Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ зависимости Π½Π° тСстовыС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, mock-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹), Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ процСсс ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСстирования. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… нСзависимо ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… зависимостСй. - **Π›ΡƒΡ‡ΡˆΠ°Ρ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ**. БистСма, построСнная Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… IoC, Π»Π΅Π³Ρ‡Π΅ адаптируСтся ΠΊ измСнСниям ΠΈ Π½ΠΎΠ²Ρ‹ΠΌ трСбованиям. НовыС зависимости ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π±Π΅Π· Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°. - **Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отвСтствСнности**. Π‘ IoC создаётся Ρ‡Ρ‘Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ зависимостями. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ класса, Π½Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°ΡΡΡŒ Π½Π° вопросы создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². *** ## ΠœΠ΅Ρ‚Π° информация **ΠžΠ±Π»Π°ΡΡ‚ΡŒ**:: [[../../meta/zero/00 АрхитСктура ПО|00 АрхитСктура ПО]] **Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ**:: [[АрхитСктурная концСпция]] **Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ**:: **Автор**:: **Π‘ΠΎΠ·Π΄Π°Π½Π°**:: [[2023-10-26]] ### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - ### Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ - [[Dependency Injection]]