dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Dependency injection

ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΉ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡΠ΅Ρ€ΠΈΡŽ статСй ΠΎΡ‚ Jakob Jenkov, посвящСнных Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ зависимостСй, ΠΈΠ»ΠΈ DI. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π° сСрия Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ Π°Π²Ρ‚ΠΎΡ€, анализируя понятия ΠΈ практичСскоС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… понятий ΠΊΠ°ΠΊ Β«Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΒ», Β«Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй», Β«ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для внСдрСния зависимостСй», сравнивая ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², анализируя нСдостатки ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ DI-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Spring), рассказываСт, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡˆΠ΅Π» ΠΊ написанию собствСнного DI-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ прСдлагаСтся ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с довольно Ρ†Π΅Π»ΡŒΠ½Ρ‹ΠΌ взглядом Π½Π° вопрос управлСния зависимостями Π² прилоТСниях.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ сравниваСтся ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ настройкС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ ΠΈ ΠΈΠ·Π²Π½Π΅ (DI). По смыслу настоящая ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒΡŽ Jakob Jenkov Understanding Dependencies, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ даСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ самому ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ «зависимости» ΠΈ ΠΈΡ… Ρ‚ΠΈΠΏΠ°ΠΌ.

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

БСрия Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй

Β«Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй» β€” это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ использованноС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π° Π€Π°ΡƒΠ»Π΅Ρ€Π° Inversion of Control Containers and the Dependency Injection Pattern. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ, Π½ΠΎ ΠΎΠ½Π° упускаСт ΠΈΠ· Π²ΠΈΠ΄Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСимущСства ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² внСдрСния зависимостСй. Π’Π°ΠΊΠΆΠ΅ я Π½Π΅ согласСн с Π²Ρ‹Π²ΠΎΠ΄Π°ΠΌΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½ΠΎ ΠΎΠ± этом β€” Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… тСкстах.

ОбъяснСниС внСдрСния зависимостСй

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй β€” это ΡΡ‚ΠΈΠ»ΡŒ настройки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π°Π΄Π°ΡŽΡ‚ΡΡ внСшнСй ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ внСшними ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. DI β€” это Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° самонастройкС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ нСсколько абстрактно, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ посмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

UPD: послС обсуТдСния прСдставлСнных Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π° с flatscode ΠΈ fogone, я принял Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ спорныС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π² ΠΊΠΎΠ΄Π΅. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ замысСл Π±Ρ‹Π» Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊΠΎΠ² ΠΎΠ½ написан Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ авторский ΠΊΠΎΠ΄ Π² спорных мСстах Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Β«Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅Β», Π½ΠΈΠΆΠ΅ даСтся Π΅Π³ΠΎ исправлСнная вСрсия. Π’Π°ΠΊΠΆΠ΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ ссылкС Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π­Ρ‚ΠΎΡ‚ DAO (Data Access Object), MyDao нуТдаСтся Π² экзСмплярС javax.sql.DataSource для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π‘Π” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для чтСния ΠΈ записи Π² Π‘Π”, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Person.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ класс MyDao создаСт экзСмпляр DataSourceImpl, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ нуТдаСтся Π² источникС Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ MyDao нуТдаСтся Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DataSource, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ зависит ΠΎΡ‚ Π½Π΅Π³ΠΎ. Он Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±Π΅Π· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DataSource. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, MyDao ΠΈΠΌΠ΅Π΅Ρ‚ Β«Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΒ» ΠΎΡ‚ интСрфСйса DataSource ΠΈ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Класс MyDao создаСт экзСмпляр DataSourceImpl ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ DataSource. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, класс MyDao сам Β«Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ свои зависимости». Когда класс Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ собствСнныС зависимости, ΠΎΠ½ автоматичСски Ρ‚Π°ΠΊΠΆΠ΅ зависит ΠΎΡ‚ классов, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ зависимости. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС MyDao завсист Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ DataSourceImpl ΠΈ ΠΎΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ТСстко Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² конструктор DataSourceImpl. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния для этих Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… строк, Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ интСрфСйса DataSource Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π°.

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° класс Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ собствСнныС зависимости, ΠΎΠ½ становится Π½Π΅Π³ΠΈΠ±ΠΊΠΈΠΌ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΊ этим зависимостям. Π­Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ зависимости, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Π°ΠΌ потрСбуСтся ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ класс MyDao. Если Ρƒ вас ΠΌΠ½ΠΎΠ³ΠΎ DAO-классов, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π°ΠΌ придСтся ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… всС. Π’ Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ провСсти ΡŽΠ½ΠΈΡ‚-тСстированиС MyDao, Π·Π°ΠΌΠΎΠΊΠ°Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ DataSource. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ DataSourceImpl. НС трСбуСтся ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΌΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это плохая идСя.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ помСняСм Π΄ΠΈΠ·Π°ΠΉΠ½:

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ созданиС экзСмпляра DataSourceImpl ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π² конструктор. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, это β€” Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ значСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для DataSourceImpl. Π₯отя класс MyDao всС Π΅Ρ‰Π΅ зависит ΠΎΡ‚ этих Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΎΠ½ большС Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ зависимости сам. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ классом, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΌ экзСмпляр MyDao. Зависимости Β«Π²Π½Π΅Π΄Ρ€ΡΡŽΡ‚ΡΡΒ» Π² конструктор MyDao. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ β€” ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡ) зависимостСй». Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π‘Π”, URL, имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ классом MyDao Π±Π΅Π· Π΅Π³ΠΎ измСнСния.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ конструкторами. МоТно Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ зависимости Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹-сСттСры, Π»ΠΈΠ±ΠΎ прямо Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ поля (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ Π½Π΅ согласСн, это Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‚Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… класса).

Класс MyDao ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ нСзависимым. БСйчас ΠΎΠ½ всС Π΅Ρ‰Π΅ зависит ΠΈ ΠΎΡ‚ интСрфСйса DataSource, ΠΈ ΠΎΡ‚ класса DataSourceImpl. НСт нСобходимости Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ интСрфСйса DataSource. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достигнуто ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠ΅ΠΉ DataSource Π² конструктор вмСсто Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² строкового Ρ‚ΠΈΠΏΠ°. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это выглядит:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ класс MyDao большС Π½Π΅ зависит ΠΎΡ‚ класса DataSourceImpl ΠΈΠ»ΠΈ ΠΎΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… строк, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… конструктору DataSourceImpl. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ DataSource Π² конструкторС MyDao.

Π¦Π΅ΠΏΠ½ΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΠ·Ρ€Π°Π·ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π° ΠΈΠ· класса MyDao ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ класс MyDao. ΠšΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ приходится Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DataSource, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² состоянии ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² конструктор MyDao. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ MyBizComponent зависит ΠΎΡ‚ класса DataSourceImpl ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… строк, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΅Π³ΠΎ конструктору. Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ MyDao ΠΎΡ‚ Π½ΠΈΡ…, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ MyBizComponent Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ зависит ΠΎΡ‚ классов ΠΈ ΠΎΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ сам Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, рСализация DataSourceImpl ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ конструктора ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ слоям абстракции. Π‘Π»ΠΎΠΉ Π½ΠΈΠΆΠ΅ MyBizComponent β€” это слой DAO.

РСшСниС β€” ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости ΠΏΠΎ всСм слоям. MyBizComponent Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ экзСмпляра MyDao. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это выглядит:

Π‘Π½ΠΎΠ²Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, MyDao, прСдоставляСтся Ρ‡Π΅Ρ€Π΅Π· конструктор. Π’Π΅ΠΏΠ΅Ρ€ΡŒ MyBizComponent зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ класса MyDao. Если Π±Ρ‹ MyDao Π±Ρ‹Π» интСрфСйсом, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π΅Π· Π²Π΅Π΄ΠΎΠΌΠ° MyBizComponent.

Π’Π°ΠΊΠΎΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ внСдрСния зависимости Π΄ΠΎΠ»ΠΆΠ΅Π½ продолТаСтся Ρ‡Π΅Ρ€Π΅Π· всС слои прилоТСния, с самого Π½ΠΈΠΆΠ½Π΅Π³ΠΎ слоя (слоя доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ) Π΄ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса (Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΡΠ½ΠΎΠ²Ρ‹ внСдрСния зависимостСй

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎΠ± основах внСдрСния зависимостСй (Π°Π½Π³Π». Dependency Injection, DI) простым языком, Π° Ρ‚Π°ΠΊΠΆΠ΅ расскаТу ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ… использования этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, ΠΈΠ»ΠΈ сомнСваСтся Π² нСобходимости использования этого ΠΏΡ€ΠΈΡ‘ΠΌΠ°. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Ρ‘ΠΌ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ?

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ, я Ρ…ΠΎΡ‡Ρƒ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ такая взаимосвязь β€” это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, вСдь Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ класс выполнял всю Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ классы, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. И Π² Ρ‚Π°ΠΊΠΎΠΌ случаС классы смогут эффСктивно Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с зависимостями?

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ‚Ρ€ΠΈ способа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для выполнСния Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ зависимостСй:

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ способ: ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ зависимости Π² зависимом классС

ΠŸΡ€ΠΎΡ‰Π΅ говоря, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто! ΠœΡ‹ создаСм класс, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

НСдостатки

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ лишь свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ классы ΠΎΡ‚Π²Π΅Ρ‡Π°Π»ΠΈ Π·Π° Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ своих собствСнных Π·Π°Π΄Π°Ρ‡. Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΏΡ€ΠΈ этом являСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ставим ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌΠΈ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ: Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ зависимости Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс

Π˜Ρ‚Π°ΠΊ, понимая, Ρ‡Ρ‚ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π²Π½ΡƒΡ‚Ρ€ΠΈ зависимого класса β€” Π½Π΅ самая Π»ΡƒΡ‡ΡˆΠ°Ρ идСя, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ. Π—Π΄Π΅ΡΡŒ зависимый класс опрСдСляСт всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΅ΠΌΡƒ зависимости Π²Π½ΡƒΡ‚Ρ€ΠΈ конструктора ΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ классу ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ…. ЯвляСтся Π»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ нашСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹? Π£Π·Π½Π°Π΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅:

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

НСдостатки

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ всё Π΅Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ свои нСдостатки. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ подходящСС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅? ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ способ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ самом понятии внСдрСния зависимостСй.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй?

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй β€” это способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ зависимостСй Π²Π½Π΅ зависимого класса, ΠΊΠΎΠ³Π΄Π° зависимому классу Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого опрСдСлСния, нашС ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ явно Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ идСю внСдрСния зависимостСй, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ зависимый класс Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ для прСдоставлСния зависимостСй. Но ΠΌΡ‹ всС Π΅Ρ‰Ρ‘ считаСм Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠ»ΠΎΡ…ΠΈΠΌ. ΠŸΠžΠ§Π•ΠœΠ£?!

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ внСдрСния зависимости Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π° с зависимостями (ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Π²Π½Π΅ зависимого класса), Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящСС мСсто для внСдрСния зависимостСй. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс являСтся Π½Π΅ совсСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ мСстом.

Как ΠΆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅? Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ зависимостСй.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ способ: ΠΏΡƒΡΡ‚ΡŒ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ зависимости вмСсто нас

Богласно ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ зависимыС классы ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ своих собствСнных зависимостСй, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ пСрСмСстили ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ зависимостСй ΠΈΠ· зависимого класса Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс. Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρ‡Ρ‚ΠΎ сущСствуСт ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΡ‚ΠΎ ΠΌΠΎΠ³ Π±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ зависимости, вслСдствиС Ρ‡Π΅Π³ΠΎ Π½ΠΈ зависимый, Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ классы Π½Π΅ выполняли Π±Ρ‹ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π­Ρ‚ΠΎΡ‚ способ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с зависимостями Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

«Чистая» рСализация внСдрСния зависимостСй (ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ мнСнию)

ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ зависимостСй возлагаСтся Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ сторону, поэтому Π½ΠΈ ΠΎΠ΄Π½Π° Ρ‡Π°ΡΡ‚ΡŒ прилоТСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ с Π½ΠΈΠΌΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй β€” это Π½Π΅ тСхнология, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. Π­Ρ‚ΠΎ просто идСя. ИдСя Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с зависимостями Π²Π½Π΅ зависимого класса (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ части). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ идСю, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ обращаСмся ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌ для внСдрСния зависимостСй, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ написания шаблонного ΠΊΠΎΠ΄Π°.

Π›ΡŽΠ±ΠΎΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ внСдрСния зависимостСй ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΡ‹Π΅ характСристики. Π’Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ доступны ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ всСгда:

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΈ это происходит Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ (Ρ„Π°ΠΉΠ»Π°Ρ…). ΠŸΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это выглядит Ρ‚Π°ΠΊ (ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ это лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ):

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния Π½Π΅ мСняСтся, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°. ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ Π³ΠΈΠ±Ρ‡Π΅.

НСдостатки

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я попытался ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ основы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с понятиСм внСдрСния зависимостСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ пСрСчислил ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ нСобходимости использования этой ΠΈΠ΄Π΅ΠΈ. БущСствуСт Π΅Ρ‰Ρ‘ мноТСство рСсурсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ большС ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ DI Π² Π²Π°ΡˆΠΈΡ… собствСнных прилоТСниях. НапримСр, этой Ρ‚Π΅ΠΌΠ΅ посвящён ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» Π² ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΉ части нашСго курса Android-профСссии.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠœΠ΅Ρ‚Π°Ρ„ΠΈΠ·ΠΈΠΊΠ° Dependency Injection

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Dependency Injection β€” это часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, прСдназначСнная для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ связанности ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². ΠŸΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, ΠΏΠΎΠΌΠΈΠΌΠΎ достиТСния этой Ρ†Π΅Π»ΠΈ, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ привнСсти поистинС магичСскиС качСства вашим прилоТСниям. Как ΠΈ любая магия, эта Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° воспринимаСтся ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠΉ, Π° Π½Π΅ строгий Π½Π°ΡƒΡ‡Π½Ρ‹ΠΉ Ρ‚Ρ€Π°ΠΊΡ‚Π°Ρ‚. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΌΡƒ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°Π½ΠΈΡŽ явлСний ΠΈ, ΠΊΠ°ΠΊ слСдствиС, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ использованию Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ². Π’ своём авторском ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ шаг Π·Π° шагом, ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΈ ΠΏΠΎ сути, ΠΏΡ€ΠΎΠΉΡ‚ΠΈ логичСский ΠΏΡƒΡ‚ΡŒ ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… основ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π΄ΠΎ Ρ‚ΠΎΠΉ самой ΠΌΠ°Π³ΠΈΠΈ автоматичСского внСдрСния зависимостСй.

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» написан ΠΏΠΎ ΠΌΠΎΡ‚ΠΈΠ²Π°ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ IoC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Hypo, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅. Π’ ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΊΠΎΠ΄Π° я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ruby, ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков для написания ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Π­Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках.

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 1: Dependency Inversion Principle

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

β€” Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСрвис ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ счСтов (InvoiceProcessor) ΠΈ сСрвис ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ (NotificationService). БСрвис ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ счСтов отправляСт увСдомлСния ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… условий, вынСсСм эту Π»ΠΎΠ³ΠΈΠΊΡƒ Π·Π° Ρ€Π°ΠΌΠΊΠΈ. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, данная модСль ΡƒΠΆΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ…Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π° Ρ€Π°Π·Π½Ρ‹Π΅ отвСтствСнности ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° скрываСтся Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ эти зависимости. Частой ошибкой являСтся инициализация зависимости Ρ‚Π°ΠΌ, Π³Π΄Π΅ эта Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ:

Π­Ρ‚ΠΎ являСтся ошибкой Π²Π²ΠΈΠ΄Ρƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ логичСски нСзависимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (High Coupling). Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° СдинствСнной отвСтствСнности (Single Responsibility Principle) β€” зависимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠΌΠΈΠΌΠΎ своих нСпосрСдствСнных отвСтствСнностСй Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои зависимости; Π° Ρ‚Π°ΠΊΠΆΠ΅ Β«Π·Π½Π°Ρ‚ΡŒΒ» интСрфСйс конструктора зависимости, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ для измСнСния (Β«reason to changeΒ», R. Martin). ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° зависимости, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Π½Π΅ зависимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ соотвСтствуСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ инвСрсии зависимостСй (Dependency Inversion Principle). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с интСрфСйсом ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний β€” сСрвису ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ счСтов ΡƒΠΆΠ΅ Π½Π΅Ρ‚ нСобходимости Β«Π·Π½Π°Ρ‚ΡŒΒ», ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сСрвиса ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈ написании ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов для сСрвиса ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ счСтов Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΎΠΌΠ°Ρ‚ΡŒ Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ интСрфСйса сСрвиса ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π·Π°Π³Π»ΡƒΡˆΠΊΠΎΠΉ. Π’ языках с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‚ΠΈΠΏΠ° Ruby, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ notify; со статичСской ΠΆΠ΅ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‚ΠΈΠΏΠ° C#/Java, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс INotificationService, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Mock. Π”Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ вопрос инвСрсии зависимостСй раскрыт АлСксандром Π‘Ρ‹Π½Π΄ΡŽ (AlexanderByndyu) Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, которая совсСм Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»Π° 10-Π»Π΅Ρ‚ΠΈΠ΅!

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 2: рССстр связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ИспользованиС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимости Π½Π΅ выглядит слоТной ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ. Но со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ·-Π·Π° роста количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ связСй ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹. NotificationService ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ сСрвисами ΠΊΡ€ΠΎΠΌΠ΅ InvoiceProcessor. Помимо этого, ΠΎΠ½ сам ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… сСрвисов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, зависят ΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ… ΠΈ Ρ‚.Π΄. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π΅ всСгда ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² СдинствСнном экзСмплярС. Π“Π»Π°Π²Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ становится поиск ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° вопрос β€” Β«ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ зависимости?Β».
Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этого вопроса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π² основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π»Π΅ΠΆΠΈΡ‚ ассоциативный массив зависимостСй. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ интСрфСйс Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠ³ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ практичСски:

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ container.resolve() ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Ρ„Π°Π±Ρ€ΠΈΠΊΠ΅, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры зависимостСй, рСкурсивно обходя Π³Ρ€Π°Ρ„ зависимостСй, описанных Π² рССстрС. Π’ случаС `container.resolve(InvoiceProcessor)` Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π’ языках со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π² качСствС сСлСктора ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Ruby ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ соглашСниС β€” просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ имя Ρ‚ΠΈΠΏΠ° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ snake_case, это ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 3: ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ зависимостСй

ΠœΡ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для управлСния зависимостями. ЕдинствСнным Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра зависимости ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ. А Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ экзСмпляра ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°? НапримСр, ΠΏΡƒΠ»Π° соСдинСний ΠΊ Π‘Π”. ΠšΠΎΠΏΠ½Ρ‘ΠΌ Π³Π»ΡƒΠ±ΠΆΠ΅, Π° Ссли Π½Π°ΠΌ трСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ управляСмоС врСмя ΠΆΠΈΠ·Π½ΠΈ зависимостСй? НапримСр, Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС ΠΊ Π‘Π” послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ HTTP-запроса.
Бтановится ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠΌ Π½Π° Π·Π°ΠΌΠ΅Π½Ρƒ Π² ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ являСтся InstanceFactory. ΠžΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½Π°Ρ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°:

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

И Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся использованиСм Π½Π°Π±ΠΎΡ€Π° стратСгий (Strategy, GoF) для получСния экзСмпляров ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π½Π΅ всСгда создаём Π½ΠΎΠ²Ρ‹Π΅ экзСмпляры ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Container::resolve, поэтому умСстно ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ Factory Π² Resolver. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Container::register появился Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” life_time (врСмя ΠΆΠΈΠ·Π½ΠΈ). Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ β€” ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся Β«transientΒ» (скоротСчный), Ρ‡Ρ‚ΠΎ соотвСтствуСт Ρ€Π°Π½Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ повСдСнию. БтратСгия Β«singletonΒ» Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΉ β€” с Π΅Ρ‘ использованиСм создаётся лишь ΠΎΠ΄ΠΈΠ½ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·.
Β«ScopeΒ» являСтся нСсколько Π±ΠΎΠ»Π΅Π΅ слоТной стратСгиСй. ВмСсто «скоротСчСк» ΠΈ Β«ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π΅ΠΊΒ» Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ срСднСС β€” ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сущСствуСт Π½Π° протяТСнии ΠΆΠΈΠ·Π½ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ запроса Π²Π΅Π±-прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся контСкстом сущСствования Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HTTP-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, соСдинСниС с Π‘Π”, Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ. На протяТСнии ΠΆΠΈΠ·Π½ΠΈ запроса ΠΌΡ‹ собираСм ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ эти зависимости, Π° послС Π΅Π³ΠΎ уничтоТСния ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Ρ‹. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ потрСбуСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ достаточно ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ, Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ структуру:

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

На Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° session, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ привязан ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° request:

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ request Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою миссию, вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ release, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт процСсс уничтоТСния scope.

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 4: Dependency Injection

Π”ΠΎ сих ΠΏΠΎΡ€ я рассказывал ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ рССстр зависимостСй, ΠΈ, Π·Π°Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² соотвСтствии с Π³Ρ€Π°Ρ„ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π²ΡˆΠΈΡ…ΡΡ связСй. А для Ρ‡Π΅Π³ΠΎ это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ? ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ это Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ruby on Rails:

Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ написан Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, тСстируСмым ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ β€œΠ·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒβ€ Rails Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ зависимости ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ конструктор, это Π½Π΅ прСдусмотрСно Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ. Но, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ASP.NET MVC это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. Для получСния максимальной ΠΎΡ‚Π΄Π°Ρ‡ΠΈ ΠΎΡ‚ использования ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° автоматичСского Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ зависимостСй Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ Inversion of Control (IoC, инвСрсия управлСния). Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ зависимостСй Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ лоТится Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€.
ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Rails с нуля. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму:

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ запрос, Ρ€ΠΎΡƒΡ‚Π΅Ρ€ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΏΠΎΡ€ΡƒΡ‡Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ этот запрос. Вакая схСма условно ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° лишь с нСбольшой Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ β€” созданиСм ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ΠΌ зависимостСй занимаСтся IoC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Но здСсь Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос, Π° Π³Π΄Π΅ ΠΆΠ΅ создаётся сам ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€? Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ прилоТСния наш Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π° самом Ρ€Π°Π½Π½Π΅ΠΌ этапС Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ подходящСго мСста, Ρ‡Π΅ΠΌ конструктор прилоТСния App. Он Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящим мСстом для настройки всСх зависимостСй:

Π’ любом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅Ρ‚ΠΎΠ΄ main. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π° являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ call. Π—Π°Π΄Π°Ρ‡Π΅ΠΉ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° являСтся Π²Ρ‹Π·ΠΎΠ² ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ входящих запросов. Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ СдинствСнным мСстом Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ β€” с этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΉΡ‚ΠΈ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ»Π°Π½, вся ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ магия Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ». РСализация ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π°ΠΊΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выглядит Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ создаём Π΅Π³ΠΎ экзСмпляры явно, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ конструктор с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

Π‘Ρ€Π΅Π΄Π° Β«ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Β» ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ благодаря ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ внСдрСния зависимостСй, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ обСспСчиваСт IoC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, встроСнный Π² сСрдцС Π²Π΅Π±-прилоТСния. Π’ конструкторС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ трСбуСтся для Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π±Ρ‹Π»ΠΈ зарСгистрированы ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ обратимся ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Router зависит ΠΎΡ‚ Controller. Если Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки зависимостСй, Ρ‚ΠΎ Controller β€” это ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π° Router β€” постоянная ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΠ°. Как ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ? Π Π°Π·Π³Π°Π΄ΠΊΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ экзСмплярами ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… классов, ΠΊΠ°ΠΊ это выглядит внСшнС. На самом Π΄Π΅Π»Π΅ это proxy-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (Proxy, GoF) с Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ (Factory Method, GoF) instance; ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² соотвСтствии с Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ стратСгиСй. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Controller зарСгистрирован ΠΊΠ°ΠΊ Β«transientΒ», Ρ‚ΠΎ Router ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹ΠΌ экзСмпляром. На Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΡ‘Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Π’.Π΅. ΠΏΠΎΠΌΠΈΠΌΠΎ управлСния зависимостями Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π½Π° основС IoC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Π΅Ρ€Ρ‘Ρ‚ Π½Π° сСбя ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΡΠ½ΠΎΠ²Ρ‹ внСдрСния зависимостСй

dependency injection Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎΠ± основах внСдрСния зависимостСй (Π°Π½Π³Π». Dependency Injection, DI) простым языком, Π° Ρ‚Π°ΠΊΠΆΠ΅ расскаТу ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ… использования этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, ΠΈΠ»ΠΈ сомнСваСтся Π² нСобходимости использования этого ΠΏΡ€ΠΈΡ‘ΠΌΠ°. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Ρ‘ΠΌ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ?

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ, я Ρ…ΠΎΡ‡Ρƒ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ такая взаимосвязь β€” это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, вСдь Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ класс выполнял всю Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ классы, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. И Π² Ρ‚Π°ΠΊΠΎΠΌ случаС классы смогут эффСктивно Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с зависимостями?

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ‚Ρ€ΠΈ способа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для выполнСния Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ зависимостСй:

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ способ: ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ зависимости Π² зависимом классС

ΠŸΡ€ΠΎΡ‰Π΅ говоря, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто! ΠœΡ‹ создаСм класс, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

НСдостатки

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ лишь свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ классы ΠΎΡ‚Π²Π΅Ρ‡Π°Π»ΠΈ Π·Π° Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ своих собствСнных Π·Π°Π΄Π°Ρ‡. Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΏΡ€ΠΈ этом являСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ставим ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌΠΈ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ: Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ зависимости Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс

Π˜Ρ‚Π°ΠΊ, понимая, Ρ‡Ρ‚ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π²Π½ΡƒΡ‚Ρ€ΠΈ зависимого класса β€” Π½Π΅ самая Π»ΡƒΡ‡ΡˆΠ°Ρ идСя, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ. Π—Π΄Π΅ΡΡŒ зависимый класс опрСдСляСт всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΅ΠΌΡƒ зависимости Π²Π½ΡƒΡ‚Ρ€ΠΈ конструктора ΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ классу ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ…. ЯвляСтся Π»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ нашСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹? Π£Π·Π½Π°Π΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅:

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

НСдостатки

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ всё Π΅Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ свои нСдостатки. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ подходящСС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅? ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ способ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ самом понятии внСдрСния зависимостСй.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй?

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй β€” это способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ зависимостСй Π²Π½Π΅ зависимого класса, ΠΊΠΎΠ³Π΄Π° зависимому классу Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого опрСдСлСния, нашС ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ явно Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ идСю внСдрСния зависимостСй, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ зависимый класс Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ для прСдоставлСния зависимостСй. Но ΠΌΡ‹ всС Π΅Ρ‰Ρ‘ считаСм Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠ»ΠΎΡ…ΠΈΠΌ. ΠŸΠžΠ§Π•ΠœΠ£?!

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ внСдрСния зависимости Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π° с зависимостями (ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Π²Π½Π΅ зависимого класса), Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящСС мСсто для внСдрСния зависимостСй. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс являСтся Π½Π΅ совсСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ мСстом.

Как ΠΆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅? Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ зависимостСй.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ способ: ΠΏΡƒΡΡ‚ΡŒ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ зависимости вмСсто нас

Богласно ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ зависимыС классы ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ своих собствСнных зависимостСй, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ пСрСмСстили ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ зависимостСй ΠΈΠ· зависимого класса Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс. Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρ‡Ρ‚ΠΎ сущСствуСт ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΡ‚ΠΎ ΠΌΠΎΠ³ Π±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ зависимости, вслСдствиС Ρ‡Π΅Π³ΠΎ Π½ΠΈ зависимый, Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ классы Π½Π΅ выполняли Π±Ρ‹ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π­Ρ‚ΠΎΡ‚ способ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с зависимостями Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

«Чистая» рСализация внСдрСния зависимостСй (ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ мнСнию)

ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ зависимостСй возлагаСтся Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ сторону, поэтому Π½ΠΈ ΠΎΠ΄Π½Π° Ρ‡Π°ΡΡ‚ΡŒ прилоТСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ с Π½ΠΈΠΌΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй β€” это Π½Π΅ тСхнология, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. Π­Ρ‚ΠΎ просто идСя. ИдСя Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с зависимостями Π²Π½Π΅ зависимого класса (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ части). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ идСю, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ обращаСмся ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌ для внСдрСния зависимостСй, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ написания шаблонного ΠΊΠΎΠ΄Π°.

Π›ΡŽΠ±ΠΎΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ внСдрСния зависимостСй ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΡ‹Π΅ характСристики. Π’Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹ доступны ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ всСгда:

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΈ это происходит Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ (Ρ„Π°ΠΉΠ»Π°Ρ…). ΠŸΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это выглядит Ρ‚Π°ΠΊ (ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ это лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ):

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния Π½Π΅ мСняСтся, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°. ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ Π³ΠΈΠ±Ρ‡Π΅.

НСдостатки

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я попытался ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ основы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с понятиСм внСдрСния зависимостСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ пСрСчислил ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ нСобходимости использования этой ΠΈΠ΄Π΅ΠΈ. БущСствуСт Π΅Ρ‰Ρ‘ мноТСство рСсурсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ большС ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ DI Π² Π²Π°ΡˆΠΈΡ… собствСнных прилоТСниях. НапримСр, этой Ρ‚Π΅ΠΌΠ΅ посвящён ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» Π² ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΉ части нашСго курса Android-профСссии:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *