ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимости: РазбираСмся с SOLID: Π˜Π½Π²Π΅Ρ€ΡΠΈΡ зависимостСй / Π₯Π°Π±Ρ€

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

РазбираСмся с SOLID: Π˜Π½Π²Π΅Ρ€ΡΠΈΡ зависимостСй / Π₯Π°Π±Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ глянСм Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй ΠΈΠ· Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ:

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (Π°Π½Π³Π». dependency inversion principle, DIP) β€” Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ связанности Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π’Ρ…ΠΎΠ΄ΠΈΡ‚ Π² пятёрку ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID.

Π€ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ°:

A. ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ. Оба Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

B. Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠ½Π΅ доводилось ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ опрСдСлСния. Мол «Π½Ρƒ Π° Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ, Π½Π°Π΄ΠΎ Π·Π°Π²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ классы Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π° Π½Π° интСрфСйс». И Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π²Π΅Ρ€Π½ΠΎ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ интСрфСйс? Π”Π° ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠΎΠ±Ρ‰Π΅ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ΅Π½? Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ.

ΠœΠΎΠ΄ΡƒΠ»ΠΈ

ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” логичСски взаимосвязанная ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов.

Π§Ρ‚ΠΎ Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ нСдопонимания, Π²Π²Π΅Π΄Π΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. Под ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ систСмы. НапримСр Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ нСзависимый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π° Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ β€” Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ, это Π½ΠΈΡ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ элСмСнт Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ систСмы. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, формируя Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π°. БоотвСтствСнно ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ:

Π—Π΄Π΅ΡΡŒ стрСлочки ΠΌΠ΅ΠΆΠ΄Ρƒ модулями ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΊΡ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. БоотвСтствСнно эти ΠΆΠ΅ стрСлочки Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΌ направлСния зависимостСй ΠΌΠ΅ΠΆΠ΄Ρƒ нашими модулями.

И Π²ΠΎΡ‚ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ «Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΊΠ½ΠΎΠΏΠΎΡ‡ΠΊΡƒ». И ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» этой ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ E. ΠœΡ‹ Π½Π΅ раздумывая ΠΏΠΎΠ»Π΅Π·Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π°Π΄ΠΎ, ΠΈ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ интСрфСйс взаимодСйствия с нашим ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ.

ΠœΡ‹ ΡƒΠΆΠ΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ код… Π½ΠΎ ΠΌΡ‹ ΠΆΠ΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ помСняли… ΠΏΠΎΠΉΠ΄Π΅ΠΌ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅ сломали Π»ΠΈ ΠΌΡ‹ ΠΊΠΎΠ³ΠΎ. И Ρ‚ΡƒΡ‚ оказываСтся Ρ‡Ρ‚ΠΎ ΠΈΠ·-Π·Π° Π½Π°ΡˆΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ сломался ΠΌΠΎΠ΄ΡƒΠ»ΡŒ B. ОкСй. ΠŸΠΎΡ‡ΠΈΠ½ΠΈΠ»ΠΈ. А Π²Π΄Ρ€ΡƒΠ³ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΊΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ B Ρ‚ΠΎΠΆΠ΅ сломался? И Π² ΠΏΡ€Π°Π²Π΄Ρƒ! ΠœΠΎΠ΄ΡƒΠ»ΡŒ A Ρ‚ΠΎΠΆΠ΅ отвалился. Чиним… ΠšΠΎΠΌΠΌΠΈΡ‚ΠΈΠΌΡΡ, ΠΏΡƒΡˆΠΈΠΌ. Π₯ΠΎΡ€ΠΎΡˆΠΎ Ссли Π΅ΡΡ‚ΡŒ тСсты, Ρ‚ΠΎΠ³Π΄Π° ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ быстро ΠΈ быстро смоТСм ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим ΠΏΡ€Π°Π²Π΄Π΅ Π² Π³Π»Π°Π·Π°, ΠΌΠ°Π»ΠΎ ΠΊΡ‚ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ тСсты.

А Π΅Ρ‰Π΅ ΠΊΠΎΠ»Π»Π΅Π³Π΅ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π» Π±Π°Π³ ΠΎΡ‚ тСстировщика, ΠΌΠΎΠ» ΠΌΠΎΠ΄ΡƒΠ»ΡŒ C сломался. Оказалось Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎ нСостороТности завязался Π½Π° ваш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ E, Π° Π²Π°ΠΌ ΠΎΠ± этом Π½Π΅ сказал. Π”Π° Π΅Ρ‰Π΅ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ этот состоит ΠΈΠ· ΠΊΡƒΡ‡ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ всСм ΠΎΡ‚ модуля E Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ. И Π²ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈ ΠΎΠ½ Π»Π°Π·Π°Π΅Ρ‚ ΠΏΠΎ своСй части Π³Ρ€Π°Ρ„Π° зависимостСй (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΏΡ€ΠΎΡ‰Π΅ Π² Π½Π΅ΠΌ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‡Π΅ΠΌ Π²Π°ΠΌ, Π½Π΅ ваша ΠΆΠ΅ Ρ‡Π°ΡΡ‚ΡŒ систСмы) ΠΈ ΠΏΡ€ΠΎΠΊΠ»ΠΈΠ½Π°Π΅Ρ‚ вас.

На рисункС Π²Ρ‹ΡˆΠ΅, ΠΎΡ€Π°Π½ΠΆΠ΅Π²Ρ‹ΠΉ ΠΊΡ€ΡƒΠΆΠΎΡ‡Π΅ΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. А красныС β€” ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. И Π½Π΅ Ρ„Π°ΠΊΡ‚ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΡ€ΡƒΠΆΠΎΠΊ β€” ΠΎΠ΄ΠΈΠ½ класс. Π­Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. И Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ссли ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρƒ нас Π½Π΅ сильно ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ½ΠΈ Π½Π΅ сильно ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. А Ρ‡Ρ‚ΠΎ Ссли Ρƒ нас ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΡ€ΡƒΠΆΠΎΡ‡Π΅ΠΊ Π±Ρ‹Π» Π±Ρ‹ связан с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ? Π­Ρ‚ΠΎ ΠΆ Ρ‡ΠΈΠ½ΠΈΡ‚ΡŒ всС Π½Π° любой Ρ‡ΠΈΡ…. И Π² ΠΈΡ‚ΠΎΠ³Π΅ простая Π·Π°Π΄Π°Ρ‡Π° «ΠΊΠ½ΠΎΠΏΠΎΡ‡ΠΊΡƒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ» прСвращаСтся Π² Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ куска систСмы. Как Π±Ρ‹Ρ‚ΡŒ?

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС

ПозднСС связываниС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ связываСтся с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя ис­полнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° Π½Π΅ Π½Π° этапС компиляции.

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

ΠœΡ‹ вспоминаСм ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΈ, Π½ΠΎ Π½Π΅ Π±Ρ€ΠΎΡΠ°Ρ‚ΡŒ ΠΆΠ΅ Π½Π°ΠΌ всС? Π”Π°Π²Π°ΠΉΡ‚Π΅ всС ΠΆΠ΅ сначала Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ с рСгистрациСй ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° ΡƒΠΆ ΠΏΠΎΡ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. Надо всС ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅. А ΠΏΠΎΡ‚ΠΎΠΌΡƒ вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³ΡƒΠ³Π»ΠΈΡ‚ΡŒ «ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ» ΠΈΠ»ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π² нашСм Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм интСрфСйс PasswordEncoder. Π‘Π΄Π΅Π»Π°Π² это, ΠΌΡ‹ создадим «ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚». Мол всякий ΠΊΡ‚ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡΡ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот интСрфСйс, обязан ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ ΠΈ бСзопасноС Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ пароля. Π‘Π°ΠΌ ΠΆΠ΅ интСрфСйс Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎ бСзумия простым:

interface PasswordEncoder
{
    public function encode(string $password): string;
}

Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠœΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΏΡ€ΠΎ соль ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π°ΠΏΠΈΡ…Π½ΡƒΠ»ΠΈ. А ΡƒΠΆ ΠΏΠΎΡ‚ΠΎΠΌ сдСлаСм Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ с ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ email-Π° ΠΎ Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ зарСгистрировали ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°ΠΆΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠ°Π΄ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ эти интСрфСйсы Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ для нас, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π΄Π΅Π»ΠΎ быстрСС шло. ΠšΡ€Π°ΡΠΎΡ‚Π°.

А ΠΏΡ€Π΅Π»Π΅ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ динамичСски Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’ΠΎ Π΅ΡΡ‚ΡŒ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ энкодСр ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ИмСнно это подразумСваСтся ΠΏΠΎΠ΄ ΠΏΠΎΠ·Π΄Π½ΠΈΠΌ связываниСм. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ «Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ прямо ΠΏΠ΅Ρ€Π΅Π΄ использованиСм ΠΎΠ½ΠΎΠΉ.

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

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ зависимостСй

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈΡΡŒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ E всС Π»ΠΎΠΌΠ°Π΅Ρ‚. И ваш ΠΊΠΎΠ»Π»Π΅Π³Π° Π·Π°Ρ…ΠΎΡ‚Π΅Π» Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² «Ρ‡ΡƒΠΆΠΎΠΌ» ΠΊΠΎΠ΄Π΅. Как Π½ΠΈΠΊΠ°ΠΊ, ΠΎΠ½ ΠΈΠ· этого модуля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Для этого Π² своСм ΠΌΠΎΠ΄ΡƒΠ»Π΅ C ΠΎΠ½ создал интСрфСйс, ΠΈ написал ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΠ· Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ модуля ΠΈ прСдоставляСт доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ссли Π²Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚Π΅ β€” ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ «ΠΏΠΎΠ»ΠΎΠΌΠΊΡƒ» ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ этот интСрфСйс располоТСн Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ модуля C, ΠΊΠΎΠ³Π΄Π° Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ β€” Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ модуля E. Мол ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ модуля E Π²Π·Π±Ρ€Π΅Π΄Π΅Ρ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄, Π΅ΠΌΡƒ придСтся ΠΏΠΎΡ‡ΠΈΠ½ΠΈΡ‚ΡŒ наш Π°Π΄Π°ΠΏΡ‚Π΅Ρ€.

Ну Π° ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ скоро Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ Π½Π°ΠΌ Ρ‚Π°ΠΊ ΠΆΠ΅ стоит Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ наш зависимый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΠ· модуля E побольшС, Ρ‚ΠΎ интСрфСйс вашСго ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π½Π°ΠΌ Π½Π΅ годится. Нам Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой. Нам Ρ‚Π°ΠΊ-ΠΆΠ΅ придСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот интСрфСйс Π² Ρ€Π°ΠΌΠΊΠ°Ρ… модуля E, Π΄Π°Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. ВзглянСм Ρ‡Ρ‚ΠΎ Ρƒ нас Π²Ρ‹ΡˆΠ»ΠΎ:

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΄Π²Π° интСрфСйса, Π° Π½Π΅ ΠΎΠ΄ΠΈΠ½. Если Π±Ρ‹ ΠΌΡ‹ помСстили интСрфСйс Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ E, ΠΌΡ‹ Π±Ρ‹ Π½Π΅ устранили зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ модулями. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ€Π°Π·Π½Ρ‹ΠΌ модулям Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ возмоТности. Наша Π·Π°Π΄Π°Ρ‡Π° ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚Ρƒ Ρ‡Π°ΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ собираСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ упростит ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ.

Π’Π°ΠΊ ΠΆΠ΅, Ссли Π²Ρ‹ посмотритС Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π²Ρ‹ΡˆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСализация Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ² Π»Π΅ΠΆΠΈΡ‚ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ E, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйсы ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π’Π΅ΠΌ самым ΠΌΡ‹ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ стрСлочки, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. ΠœΡ‹ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ зависимости.

НС всС зависимости стоят Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

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

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ссли Π½Π°ΠΌ понадобится Π»ΠΎΠ³Π³Π΅Ρ€, ΠΌΡ‹ всСгда смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс PSR\Logger ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ стандартизирован, Π° Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ смоТСм Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой Π»ΠΎΠ³Π³Π΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ этот интСрфСйс Π½Π° наш вкус:

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, благодаря этому интСрфСйсу, нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всС Π΅Ρ‰Π΅ Π½Π΅ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π»ΠΎΠ³Π³Π΅Ρ€Π°. Π›ΠΎΠ³Π³Π΅Ρ€ ΠΆΠ΅ зависит ΠΎΡ‚ этой абстракции. Но ΠΎΠ±Π° «ΠΌΠΎΠ΄ΡƒΠ»Ρ» Π½Π΅ зависят Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ «Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΡ‚ посторонних Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ самодостаточными. Когда всС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ нСзависимы, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ нСзависимо ΠΈΡ… Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ. А это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π°ΠΆΠ½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бизнСса.

Часто, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ± абстракциях, люди Π»ΡŽΠ±ΡΡ‚ Π΄ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ всС Π΄ΠΎ крайности, забывая Π·Π°Ρ‡Π΅ΠΌ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ всС это Π½ΡƒΠΆΠ½ΠΎ.

Когда ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ планируСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ дольшС, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ вашСго Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, ΠΈΠΌΠ΅Π΅Ρ‚ смысл всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π²Π΅Ρ‰ΠΈ Π·Π°Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹. Π­Ρ‚ΠΎ своСго Ρ€ΠΎΠ΄Π° ΠΊΡ€Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… условиях ΠΎΠ½Π° ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π°. ΠœΠ΅Π½ΡΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΌΡ‹ врядли Π±ΡƒΠ΄Π΅ΠΌ, Π° Π²ΠΎΡ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠ°ΠΆΠΎΡ€Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π±Π΅Π· Π±ΠΎΠ»ΠΈ ΠΌΡ‹ ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ.

Или ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ распространСнноС Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ β€” абстракция ΠΎΡ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ являСтся Ρ†Π΅Π»ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой абстракции, это скорСС ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ качСства. ВмСсто этого ΠΌΡ‹ просто Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ изоляции, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наша Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π΅ зависСла ΠΎΡ‚ возмоТностСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этими возмоТностями.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ поиск Π² нашСй любимой MySQL, Π½ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ потрСбовался Π±ΠΎΠ»Π΅Π΅ качСствСнная рСализация. И ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²Π·ΡΡ‚ΡŒ ElasticSearch для этого, просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌ поиск Π΄Π΅Π»Π°Ρ‚ΡŒ быстрСС. ΠžΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ MySQL ΠΌΡ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, Π½ΠΎ благодаря выстроСнной абстракции, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эффСктивнСС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ.

Или ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ соц ΡΠ΅Ρ‚ΡŒ, ΠΈ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ‚Ρ€Π΅ΠΊΠ°Ρ‚ΡŒ рСпосты. Π”Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π° MySQL Π½ΠΎ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π’ΡƒΡ‚ Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π³Ρ€Π°Ρ„ΠΎΠ²Ρ‹Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. И Ρ‚Π°ΠΊΠΈΡ… сцСнариСв массы. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π΄Ρ€Π°Π²Ρ‹ΠΌ смыслом Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π° Π½Π΅ Π΄ΠΎΠ³ΠΌΠ°ΠΌΠΈ.

На этом ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ всС. Π― ΡƒΠ²Π΅Ρ€Π΅Π½ Ρ‡Ρ‚ΠΎ я Π½Π΅ всС сказал ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ вопросы, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π½Π΅ стСсняСмся Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² коммСнтариях. Π’Π°ΠΊ ΠΆΠ΅ я ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ знаю ΠΎΡ‚Π½ΡŽΠ΄ΡŒ Π½Π΅ всС, ΠΈ Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ коммСнтариям Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ‚Π΅ΠΌΡƒ Ρ‡ΡƒΡ‚ΡŒ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° инвСрсия зависимости ΠΏΠΎΠΌΠΎΠ³Π»Π° ΠΈΠ»ΠΈ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡. Ну ΠΈ Ссли Π²Ρ‹ нашли ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ/ошибки Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€” Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ сообщСниям Π² Π»ΠΈΡ‡ΠΊΡƒ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй β€” Π΄ΠΎΡ…ΠΎΠ΄Ρ‡ΠΈΠ²ΠΎΠ΅ объяснСниС

Наталия ΠΠΈΡˆΡ‚Π°, PHP Developer, Π² своСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π° DOU.UA ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΎΡ€Π΄ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ пояснСниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию.

Image by Peter Wolf from Pixabay

В этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΡΒ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (Dependency inversion principle, Π΄Π°Π»Π΅Π΅ DIP). Π’Β ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ упомянуты уровни абстракций, поэтому Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с этим понятиСм Π·Π°Π±Π»Π°Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Завязка

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ-чСловСчСски Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π²Β DIP, Π½Π°Π΄ΠΎ Ρ€Π°ΡΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ с самого Π½Π°Ρ‡Π°Π»Π°Β β€” с интСрфСйсов ΠΈΒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Β«ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов, Π°Β Π½Π΅Β Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉΒ». ΠΠ΅Β ΠΏΠΎΠ»Π΅Π½ΠΈΡ‚Π΅ΡΡŒ, ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Β β€” это Π²Π°ΠΆΠ½ΠΎ.

ВспоминаСм, Ρ‡Ρ‚ΠΎ интСрфСйс — это срСдство осущСствлСния Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ воздСйствия; общая Π³Ρ€Π°Π½ΠΈΡ†Π° Π΄Π²ΡƒΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… составных частСй, посрСдством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ (чСстно списала ΠΈΠ·Β Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ). ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, Π²ΠΎΡ‚ у нас Π΅ΡΡ‚ΡŒ мСханичСскиС Π½Π°Ρ€ΡƒΡ‡Π½Ρ‹Π΅ часы. И всС взрослыС люди Π·Π½Π°ΡŽΡ‚, ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ интСрфСйс Β«Ρ†ΠΈΡ„Π΅Ρ€Π±Π»Π°Ρ‚ со стрСлочками». Я понятия нС имСю, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ устроСно Π²Π½ΡƒΡ‚Ρ€ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚Π°ΠΌ ΡˆΠ΅ΡΡ‚Π΅Ρ€Ρ‘Π½ΠΊΠΈ-колёсики, ΠΏΡ€ΡƒΠΆΠΈΠ½ΠΊΠΈ ΠΈΒ ΠΏΡ€ΠΎΡ‡Π΅Π΅ Π±Π°Ρ€Π°Ρ…Π»ΠΎ. МнС Π½Π΅Β Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ о богатствС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΌΠΈΡ€Π° этого Ρ‡ΡƒΠ΄Π° ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΈ. Я лишь знаю, Ρ‡Ρ‚ΠΎ всС мСханичСскиС часы ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ интСрфСйс Β«Ρ†ΠΈΡ„Π΅Ρ€Π±Π»Π°Ρ‚ со стрСлочками», ΠΈΒ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ этим. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚Β Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Β Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’ΠΎΒ Π΅ΡΡ‚ΡŒ, интСрфСйс — это абстракция. Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм на это ΠΊΠ°ΠΊ Π½Π°Β ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ. Когда ΠΌΡ‹Β Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ, по сути Π½Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ лишь Π·Π½Π°Ρ‚ΡŒ составныС части систСмы ΠΈΒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡƒΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ. Как ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΈ ΡƒΠΌΠ΅ΡŽΡ‚ это Π΄Π΅Π»Π°Ρ‚ΡŒΒ β€” Π²Β ΠΌΠΎΠΌΠ΅Π½Ρ‚ конструирования Π½ΠΈΠΊΠΎΠ³ΠΎ Π½Π΅Β ΠΊΠΎΠ»Ρ‹ΡˆΠ΅Ρ‚. Π’Ρ‹Ρ€Π°ΠΆΠ°ΡΡΡŒ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΡƒΠΌΠ½ΠΎ, нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ ΡƒΡ€ΠΎΠ²Π½ΠΈ абстракции (ΠΈΒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ элСмСнтов, находящихся Π²Β ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅), Π°Β Ρ‚Π°ΠΊΠΆΠ΅ их интСрфСйсы.

ВсС классы Π½Π°Π΄ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ абстракции, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ своими интСрфСйсами. Π­Ρ‚ΠΎ ΠΈΒ Π·Π½Π°Ρ‡ΠΈΡ‚Β ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов, Π°Β Π½Π΅Β Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠšΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ языка в дальнСйшСм ΠΌΡ‹Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ, Abstract Class ΠΈΠ»ΠΈ Interface,Β β€” по сути Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Β Π²Π°ΠΆΠ½ΠΎ.

Если ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ на этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΈΒ ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΡƒΠ³Π»ΠΎΠΌ: Π½Π°ΠΌ Π½Π΅Β ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, с каким ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ классом (Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ) ΠΌΡ‹Β ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ (часы Ρ„ΠΈΡ€ΠΌΡ‹ Ρ‚Π°ΠΊΠΎΠΉ-Ρ‚ΠΎ, модСль такая-Ρ‚ΠΎ). Достаточно Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΡƒΒ Π½Π΅Π³ΠΎ супСркласс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ (Abstract Class ΠΈΠ»ΠΈ Interface, в нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Ρ†ΠΈΡ„Π΅Ρ€Π±Π»Π°Ρ‚ со стрСлочками).

ΠšΡƒΠ»ΡŒΠΌΠΈΠ½Π°Ρ†ΠΈΡ

ΠΒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ настало врСмя чудСс: я привСду наглядный ΠΎΠ±Ρ€Π°Π·Ρ‡ΠΈΠΊ проСктирования с кусками ΠΊΠΎΠ΄Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΈΠΌ основным языком программирования являСтся PHP (проститС, Ρ‚Π°ΠΊ Π²Ρ‹ΡˆΠ»ΠΎ), Ρ‚ΠΎΒ ΠΈΒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΡΒ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΡŽ ΠΏΠΎΠ΄ особСнности этого языка.

Π˜Ρ‚Π°ΠΊ, любой ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π·Π²ΡƒΠΊΠΈ (Π½Π΅Β Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎΒ β€” ΡˆΡƒΠΌΠΈΡ‚ сСбС и всё). ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΠ΅ΠΌ:

НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±Π°Ρ€Π°Π±Π°Π½:

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

Π’ΠΎΡ‚ ΠΌΡ‹ ΠΈ сконструировали ряд классов, Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΡƒΡΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡƒΠΌΠ΅ΡŽΡ‚ (Ρ‚.Π΅. Π½Π° интСрфСйсах).

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ услоТним наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов. Мои Π΄Ρ€ΡƒΠ·ΡŒΡ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΈ Π²Π·ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ ΠΎΠ½ΠΈ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ, Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ ΠΏΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹Ρ… инструмСнтов. Π’ Π½Ρ‘ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅ΠΉ всС инструмСнты Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π½Π°Ρ‚ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π΄ΠΎ блСска (repair), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ (pack). ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ инструмСнты Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ‡ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΈ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ. На ΠΎΠ΄Π½ΠΎΠΌ Π΄Ρ‹Ρ…Π°Π½ΠΈΠΈ пишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ классы для нашСй Π·Π°Π΄Π°Ρ‡ΠΈ.

Нам понадобится инструмСнт, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π·Π²ΡƒΠΊ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ:

НапримСр Π²ΠΎΡ‚ такая губная Π³Π°Ρ€ΠΌΠΎΡˆΠΊΠ° Ρ„ΠΈΡ€ΠΌΡ‹ Marys (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»Π°):

А Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΌΠ°Π³Π°Π·ΠΈΠ½ ΠΏΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹Ρ… инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ инструмСнты ΠΊ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅:

Набор классов, мягко говоря, вСсёлый, но для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚.

ΠœΡ‹Β Π½Π΅Β Π½Π°Ρ€ΡƒΡˆΠ°Π»ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Β«ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов, Π°Β Π½Π΅Β Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉΒ». ΠœΡ‹Β ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ классы, ΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΡƒΡΡΡŒ на их способностях. Однако, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎ взглянСм на послСдний класс Pawnshop.

Допустим, ΠΏΠΎΒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Β Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹Β Ρ€Π΅ΡˆΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ интСрфСйс Instrument, Π²Β Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² станСт Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Или наш ΠΌΠ°Π³Π°Π·ΠΈΠ½ Ρ€Π΅ΡˆΠΈΡ‚ Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊΒ ΠΏΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹ΠΌ Π±Π°Π»Π°Π»Π°ΠΉΠΊΠ°ΠΌ ΠΏΡ€ΠΈΡ‚ΠΎΡ€Π³ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΈΒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΎΠ²Ρ‹ΠΌΠΈ инструмСнтами, Π½Π΅Β Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½ΠΈΒ Π²Β ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅, Π½ΠΈΒ Π²Β Ρ€Π΅ΠΌΠΎΠ½Ρ‚Π΅. Или Π΅Ρ‰Ρ‘ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΈΒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт пСрСстанСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Π½Π°ΠΌ интСрфСйс. Но в работС Pawnshop мы опираСмся Π½Π°Β Π½Π°Π΄Π΅ΠΆΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданный ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ субклассом InstrumentΒ β€” это ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ бСзрассудно. А сколько Ρ‚Π°ΠΊΠΈΡ… Pawnshop у нас по всСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡƒΒ β€” ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠ»ΠΎΡ…ΠΎ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚Β ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ? Π”Π°Β ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ слишком часто ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. А концСпции (абстракции и интСрфСйсы) Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΆΠΈΠ²ΡƒΡ‡ΠΈ.

Развязка

Настало врСмя Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π°Β ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй, Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ в ассортимСнтС и количСствС:
β€”Β ΠšΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ от абстракций, Π°Β Π½Π΅Β ΠΎΡ‚Β ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… классов;
— Абстракции Π½Π΅Β Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚Β Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ от абстракций;
β€”Β ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π½Π΅Β Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚Β ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ. Оба Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ от абстракций.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅Β Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов, Π½ΠΎΒ ΠΈΒ ΠΏΡ€Π΅ΡΠ΅Ρ‡ΡŒ бСспорядочноС использованиС конструкции new, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ она создаёт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. БоотвСтствСнно, класс, Π²Β ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡΒ new, автоматичСски становится зависимым от этой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, а нС от абстракции. НС смотря Π΄Π°ΠΆΠ΅ Π½Π°Β Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹Β ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов.

Если всё Ρ‚Π°ΠΊ просто, Ρ‚ΠΎΒ ΠΏΠΎΡ‡Π΅ΠΌΡƒΒ ΠΆΠ΅ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ называСтся «инвСрсия зависимостСй». Π§Ρ‚ΠΎ инвСртируСтся?

ВСрнёмся к нашим ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ инструмСнтам. Π₯отя мы и строили классы, проСктируя ΠΈΡ…Β Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов, всё Ρ€Π°Π²Π½ΠΎ наш класс Pawnshop зависит ΠΎΡ‚Β ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ:

Если ΠΌΡ‹ попытаСмся ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ DIP, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС new Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ области β€” для этого Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ· ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² ΠΈΠ»ΠΈ Dependency Injection. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ.

НапримСр, ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Или Ρ‚Π°ΠΊ:

Или Π΅Ρ‰Ρ‘ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ. Π‘ΡƒΡ‚ΡŒ Π²Β Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹Β ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Новая схСма зависимостСй Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ, ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ ΠΊΒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ рСализациям (MarysHarmonica, BillysDrum ΠΈΒ Π΄Ρ€.), помСняли своё Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. ΠœΡ‹Β ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ зависимости. До примСнСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° DIP у нас присутствовала Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Pawnshop ΠΎΡ‚Β ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… классов ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов. Π’Π΅ΠΏΠ΅Ρ€ΡŒΒ ΠΆΠ΅ Π½ΠΈΡ‡Ρ‚ΠΎ нС зависит ΠΎΡ‚Β ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, всё зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ от абстракций. Π—Π°Β ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π°ΡˆΠΈΡ… «изоляторов», ΠΊΡƒΠ΄Π° мы помСстили new. ΠΠΎΒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ создания экзСмпляров Π²Π½ΡƒΡ‚Ρ€ΠΈ этих ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… конструкций Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»Π΅Π³Ρ‡Π΅, Ρ‡Π΅ΠΌ Ρ€Ρ‹ΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΒ Π½Π΅ΠΎΠ±ΡŠΡΡ‚Π½Ρ‹ΠΌ просторам ΠΊΠΎΠ΄Π°, выискивая, Π³Π΄Π΅Β ΠΆΠ΅ ΠΌΡ‹Β Π½Π°ΠΏΠ»ΠΎΠ΄ΠΈΠ»ΠΈ наши вновь измСнившиСся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Β new) Π½Π΅Β ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΌ классам. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹Β Π½Π΅Β Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡ…Β ΠΌΠ΅Π½ΡΡ‚ΡŒΒ Π½ΠΈΠΊΠΎΠ³Π΄Π°. А раз эти классы «хроничСски Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Β», то и связанныС с измСнСниями риски ΠΎΡ‚ΠΏΠ°Π΄Π°ΡŽΡ‚.

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ говоря, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ DIP ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°Π΅Ρ‚:
β€”Β ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Β ΡƒΡ€ΠΎΠ²Π½Π΅ интСрфСйсов;
β€”Β Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ созданиС измСняСмых классов (скаТи Π½Π΅Ρ‚ бСспорядочным new!).

Π˜Β Π²ΠΎΡ‚ ΠΌΡ‹Β Π²Π½ΠΎΠ²ΡŒ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ ΠžΠžΠŸΒ β€” это Π΄ΠΎΒ Ρ‚ΠΎΡˆΠ½ΠΎΡ‚Ρ‹ логичСская и достаточно простая для понимания Π²Π΅Ρ‰ΡŒ.

P.S. Использовав ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ phpΒ <new $firmName . $instrumentName> я экономлю количСство строк ΠΊΠΎΠ΄Π°, акцСнтируя вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ на происходящСм Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Для Π΄ΠΎΡ‚ΠΎΡˆΠ½Ρ‹Ρ…: ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС, Ρ‡Ρ‚ΠΎ вмСсто этой строки Ρ‚Π°ΠΌ написано if-if-if.

P.P.S.Β Π”Π°, Π΄Π°Β Β«Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅Β Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²Β Π±ΠΎΠ΅Π²ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅Β». Однако, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, я полагаю, ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° DIP.

Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй (DIP) | by Kedren Villena

Когда я ΡƒΠ·Π½Π°Π» ΠΎ S.O.L.I.D. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования (ООП), инвСрсия зависимостСй Π±Ρ‹Π»Π° для мСня самой слоТной для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ понимания. МСня смущаСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ гласит:

ВысокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ . Оба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ высокого уровня ΠΈ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ? Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ абстракции ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ?

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ это, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с простого прилоТСния. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ собираСмся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, прСдставляСт собой простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€. (Код Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° C#).

Базовая рСализация ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ простой, ΠΊΠ°ΠΊ привСдСнная Π½ΠΈΠΆΠ΅:

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ простой класс ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° с двумя опСрациями Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Ρ‡Ρ‚ΠΎ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, скаТСм, Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅? Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² наш Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ класс Calculator ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ класс. Π­Ρ‚Π° модификация сломаСт Π±ΡƒΠΊΠ²Ρƒ «О» Π² S.O.L.I.D. ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытия-закрытия (OCP) . OCP ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΈΠ»ΠΈ Β«Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒΒ») наш класс Calculator, фактичСски Π½Π΅ внося Π² Π½Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄Π° (ΠΈΠ»ΠΈ Β«ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉΒ»)? Π’ΠΎΡ‚ Π³Π΄Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (DIP) вступаСт Π² ΠΈΠ³Ρ€Ρƒ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π² DIP:

Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ . Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций .

ΠŸΡ€ΡΠΌΠΎ сСйчас ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π² наш класс Calculator. Глядя Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ , Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈ , Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ с ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ наш ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ интСрфСйс Π½Π° самом Π΄Π΅Π»Π΅ являСтся «абстракциСй», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ наш ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€. Β«Π”Π΅Ρ‚Π°Π»ΠΈΒ» β€” это фактичСская рСализация интСрфСйса.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ наш класс Calculator, Ρ‡Ρ‚ΠΎΠ±Ρ‹ фактичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ICalculatorOperation. ΠœΡ‹ собираСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ Dependency Injection Ρ‡Π΅Ρ€Π΅Π· Constructor Injection. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, это ΠΊΠΎΠ³Π΄Π° зависимости ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ ΠΈΠ»ΠΈ слуТбой. Π­Ρ‚ΠΎ рСализация ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй.

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ это, посмотритС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° послС Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° (Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅):

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ наши ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Β«Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΒ» ΠΈ Β«Π’Ρ‹Ρ‡Π΅ΡΡ‚ΡŒΒ», Π½Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ наш интСрфСйс/ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ICalculatorOperation:

Π‘ нашим Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π»Π΅Π³ΠΊΠΎ Β«Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒΒ» ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² наш класс Calculator, фактичСски Π½Π΅ «модифицируя» Π΅Π³ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нашС простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

Π‘ нашим Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π»Π΅Π³Ρ‡Π΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (DIP) . ΠœΡ‹ использовали Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ Dependency Injection (DI) , которая являСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ DIP, Ρ‡Ρ‚ΠΎΠ±Ρ‹ фактичСски ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Open-Close (OCP) . Наш класс Calculator Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ полагаСтся Π½Π° Π½Π°ΡˆΡƒ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, которая являСтся ICalculatorOperation, Π° Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ICalculatorOperation.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ Π² DIP:

ВысокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ . Оба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций .

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ высокого уровня , Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ссылаСмся, являСтся классом Calculator , Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ модулями ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ . классы ( AddCalculatorOperation , SubtractCalculatorOperation , MultiplyCalculatorOperation , DivideCalculatorOperation ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ICalculatorOperation , которая являСтся нашСй абстракциСй .

Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ высокого уровня ΠΈ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ? Π§Ρ‚ΠΎΠ±Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ это, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ UML для этого:

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ UML для нашСго ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ находится Π½Π° Π²Ρ‹ΡˆΠ΅ части Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° находятся Π½Π° ниТняя Ρ‡Π°ΡΡ‚ΡŒ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹. Для дальнСйшСго выдСлСния:

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

  • Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй β€” это рСализация ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй.
  • Одним ΠΈΠ· способов достиТСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° открытия-закрытия являСтся использованиС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй.
  • ΠœΠΎΠ΄ΡƒΠ»ΠΈ высокого уровня Π² DIP β€” это ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ UML ΠΈ зависят ΠΎΡ‚ уровня абстракции. Абстракции находятся Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹. НизкоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ находятся Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ фактичСскими рСализациями уровня абстракции.

ОбъяснСниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй ΠΈ способы Π΅Π³ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ понимания Π² ΡƒΡ‡Π΅Π±Π½Ρ‹Ρ… пособиях | by Giedrius Kristinaitis

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй β€” это большС, Ρ‡Π΅ΠΌ просто абстракции ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Giedrius Kristinaitis

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ инвСрсии зависимостСй. Π‘ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй, ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΅Π³ΠΎ часто ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй Π½Π΅ Ρ‚Π°ΠΊ прост для понимания, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡˆΠΈΠ±Π°ΡŽΡ‚ΡΡ. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ гласит, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° абстракции, Π° Π½Π΅ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π§Ρ‚ΠΎ это Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°ΠΆΠ΅ Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Π» ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… SOLID? Они сразу Π΄ΡƒΠΌΠ°ΡŽΡ‚ ΠΎΠ± интСрфСйсах/абстрактных классах ΠΈ ΠΈΡ… рСализациях, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл, ΠΈ Π΄ΡƒΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы Π² качСствС зависимостСй Π² своСм ΠΊΠΎΠ΄Π΅.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ этого являСтся созданиС интСрфСйса для всСго, Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций, Π° интСрфСйсы β€” это абстракции.

Π’Π°ΠΊΠΎΠ΅ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΠ΅ рассматриваСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΊΠ°ΠΊ ТСсткоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ Π½Π΅ фокусируСтся Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ½ΠΎ.

Π›ΡŽΠ΄ΠΈ часто ΡƒΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΈΠ· Π²ΠΈΠ΄Ρƒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°. Π‘ΠΊΠ°ΠΆΠΈΡ‚Π΅, Π° Β« зависят ΠΎΡ‚ абстракций, Π° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Β» ΠΈ Β« ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй Β» Π·Π²ΡƒΡ‡Π°Ρ‚ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅? Π˜Ρ… Π½Π΅Ρ‚, Ссли Π½Π΅ ΠΊΠΎΠΏΠ½ΡƒΡ‚ΡŒ Π³Π»ΡƒΠ±ΠΆΠ΅. Когда Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ люди Π΄ΡƒΠΌΠ°ΡŽΡ‚ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΎΠ½ΠΈ Π΄ΡƒΠΌΠ°ΡŽΡ‚ ΠΎ зависимости ΠΎΡ‚ абстракций, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ упуская Ρ‡Π°ΡΡ‚ΡŒ инвСрсии зависимостСй.

Π§Ρ‚ΠΎ мСня бСспокоит, Ρ‚Π°ΠΊ это Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй продаСтся Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… курсах ΠΈ ΡƒΡ‡Π΅Π±Π½Ρ‹Ρ… пособиях. ВсС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, это ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ Π΅ΡΡ‚ΡŒ интСрфСйс, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅ΡΡ‚ΡŒ 2 Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого интСрфСйса, ΠΈ использованиС интСрфСйса Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ прСдставлСно ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй. Как я ΡƒΠΆΠ΅ сказал, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ отсутствуСт сама инвСрсия зависимостСй.

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, замаскированный ΠΏΠΎΠ΄ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²Π²Π΅Π΄Π΅ΠΌ Π² смСсь Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠΎΠΌ. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ? ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ β€” это использованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа для прСдставлСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ этот символ? Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹/абстрактныС классы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ символ. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса β€” это Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ символом β€” интСрфСйсом.

Π Π°Π·Π²Π΅ это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ продаСтся ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй?

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ часто продаСтся ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй.

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ зависимостСй β€” это большС, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ β€” это большС, Ρ‡Π΅ΠΌ просто ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ. Π’Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID Π±Ρ‹Π» достаточно Π½Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто ввСсти Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для опрСдСлСния ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°? Π― Π½Π΅.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, просто это Π½Π΅ сам ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ. Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚-Ρ‚ΠΎ ΠΈ появляСтся концСпция инвСрсии зависимостСй. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для достиТСния инвСрсии.

ΠŸΠΎΡ‚ΠΎΠΊ управлСния

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ я смогу ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ ΠΈΠ½Π²Π΅Ρ€ΡΠΈΡŽ зависимостСй, ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ввСсти Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ понятиС, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ управлСния.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ управлСния? ΠŸΠΎΡ‚ΠΎΠΊ управлСния β€” это просто порядок выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Image by Giedrius Kristinaitis

ΠœΠ΅Ρ‚ΠΎΠ΄ main Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π² классС Document , Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π² Document Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π² ScreenDisplay класс. Π­Ρ‚ΠΎ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ зависимости ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ управлСния.

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ зависимостСй

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ зависимостСй ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ зависимостСй ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΡƒ управлСния. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Giedrius Kristinaitis

Однако ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ ΠΌΠΈΠ½ΡƒΡ‚ΠΊΡƒ. Π Π°Π·Π²Π΅ это Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° классичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ интСрфСйса ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Оно Π΄Π΅Π»Π°Π΅Ρ‚. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ Document большС Π½Π΅ зависит ΠΎΡ‚ ScreenDisplay , ΠΎΠ½ зависит ΠΎΡ‚ DisplayInterface , Π° ScreenDisplay Ρ‚Π°ΠΊΠΆΠ΅ зависит ΠΎΡ‚ DisplayInterface . ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с классичСским интСрфСйсом тСхничСски Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ (это Ρ‚ΠΎΠΆΠ΅ Ρ€Π΅Π΄ΠΊΠΎ упоминаСтся).

Π’Π°ΠΊ Ρ‡Π΅ΠΌ ΠΆΠ΅ ΠΎΠ½ отличаСтся ΠΎΡ‚ классичСского ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ отсутствуСт Ρ‡Π°ΡΡ‚ΡŒ инвСрсии зависимостСй ΠΈ это просто ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ? Π­Ρ‚ΠΎ нС… , Π½ΠΎ Π½Π΅ .

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ScreenDisplay , просто инвСрсия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ особого смысла Π²Π½Π΅ контСкста ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈ это ошибка ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹Ρ… руководств ΠΈ курсов, ΠΎΠ½ΠΈ Π½Π΅ говорят ΠΎ модулях .

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ? ΠœΠΎΠ΄ΡƒΠ»ΠΈ β€” это нСзависимых Π³Ρ€ΡƒΠΏΠΏ связанных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ слабо связанных (Π½Ρƒ, это Ρ‚ΠΎ, ΠΊ Ρ‡Π΅ΠΌΡƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ).

Какой смысл ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ зависимости, Ρ‡Π΅Π³ΠΎ это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ?

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

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ прСимущСства, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ обслуТиваниС. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ нСзависимы, сам ΠΏΠΎ сСбС ΠΎΠ³Ρ€ΠΎΠΌΠ΅Π½.

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ особого смысла Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΠΎΠ»Π½ΠΎΠΉ нСзависимости Π½Π΅Ρ‚, вСдь ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ нСзависимо Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ куски, Ссли ΠΎΠ½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅? Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ вСсь ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла.

Насколько слоТно Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, зависит ΠΎΡ‚ вашСго тСхничСского стСка, поэтому Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ слоТно Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ нСзависимыми ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ зависимости.

Допустим, Π²Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π½Π° языкС со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π³Π΄Π΅ зависимости Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ извСстны Π²ΠΎ врСмя выполнСния, Π° компиляция всСго прилоТСния Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько часов. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ сСбС ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ссли Π±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ просто Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ части нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

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

Π’ΠΎΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с модулями ΠΊΠΎΠ΄Π°:

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Giedrius Kristinaitis

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

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΡ‡Π΅ΠΌΡƒ класс Document ΠΈ DisplayInterface находятся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅? Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для достиТСния ΠΏΠΎΠ»Π½ΠΎΠΉ нСзависимости модуля. Если Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, это сдСлало Π±Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° высокого уровня зависимым ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ модуля (ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ). DisplayInterface β€” это просто абстракция, посрСдством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с внСшним ΠΌΠΈΡ€ΠΎΠΌ.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠ°ΠΊ обстоят Π΄Π΅Π»Π° с ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ основным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°? Основной ΠΌΠΎΠ΄ΡƒΠ»ΡŒ зависит ΠΎΡ‚ Π±Π΅Ρ‚ΠΎΠ½Π° Класс Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° , Π° Π½Π΅ абстракция. Π Π°Π·Π²Π΅ это Π½Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ? Если Π²Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ инвСрсии зависимостСй ΠΊΠ°ΠΊ ΠΊ ТСсткому ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ, Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ.

НСвозмоТно Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ всС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с абстракциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ часто являСтся Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ.

This entry was posted in ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΠ΅