solid php Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

ΠžΡ‡Π΅Π½ΡŒ простоС объяснСниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID

Disclaimer: ВсСм ΠΌΠΎΠΆΠ½ΠΎ, Π½Ρƒ Π° я Ρ‡Π΅ΠΌ Ρ…ΡƒΠΆΠ΅?!

SOLID β€” это Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΏΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. ЀактичСски ΠΎΠ½ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свои ΠΈ Ρ‡ΡƒΠΆΠΈΠ΅ Π½Π΅Ρ€Π²Ρ‹ ΠΈ врСмя. А ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Π½Π΅ ΠΏΠΎΠΌΠΎΡ‡ΡŒ.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² этих ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…, Π±Π΅Π· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ БМБ.

S β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности (Single Responsibility Principle ΠΈΠ»ΠΈ SRP)

Π”ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для измСнСния класса (Β«A class should have only one reason to change.Β» Robert C. Martin.)

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π½Π° ΠΊΠΎΠΌΠΏΠ΅ Π»Π΅ΠΆΠΈΡ‚ пяток Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… пСсСн, ΠΏΠ°Ρ€Π° Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² ΠΈ Ρ„ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ². Π’Ρ‹ Π²Π°Π»ΠΈΡ‚Π΅ всС это Π² «Мои Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹Β» ΠΈ, Π² Ρ†Π΅Π»ΠΎΠΌ, Ρ€Π°Π΄ΡƒΠ΅Ρ‚Π΅ΡΡŒ ΠΆΠΈΠ·Π½ΠΈ.

ΠŸΠΎΡ‚ΠΎΠΌ Π²Ρ‹ ΠΊΠ°Ρ‡Π°Π΅Ρ‚Π΅ Π΅Ρ‰Π΅ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ², Π½ΠΎΠ²Ρ‹ΠΉ альбом любимой Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ дСсяток Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ². Π’ Β«ΠœΠΎΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ…Β» становится ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π½Π΅ ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½ΠΎ ΠΈ Π²Ρ‹ раскладываСтС всС ΠΏΠΎ ΠΏΠ°ΠΏΠΎΡ‡ΠΊΠ°ΠΌ.

ΠŸΠΎΡ‚ΠΎΠΌ Π²Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ скоростной Π±Π΅Π·Π»ΠΈΠΌΠΈΡ‚, ΡΡ€Ρ‹Π²Π°Π΅Ρ‚Π΅ΡΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ ΠΈ ΠΊΠ°Ρ‡Π°Π΅Ρ‚Π΅ всС сСрии Бимпсонов, ΠΏΠΎΠ»Π½Ρ‹Π΅ дискографии Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ, Π° ΠΊ Ρ„ΠΎΡ‚ΠΊΠ°ΠΌ ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΎΡ‚ΠΊΠΈ ΠΈΠ· ΠΏΠΎΠ΅Π·Π΄ΠΊΠΈ Π½Π° Ρ€Ρ‹Π±Π°Π»ΠΊΡƒ с Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ. ΠŸΠ°ΠΏΠΎΡ‡ΠΊΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π²Π΅Ρ‚Π²ΠΈΡ‚ΡŒΡΡ.

И Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΡƒΡ‚ ΠΈΠΌΠ΅Π΅ΠΌ?

КакиС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Ρ‹?

O β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости (Open-closed Principle ΠΈΠ»ΠΈ OCP)

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ сущности (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.ΠΏ.) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для измСнСния (Β«Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.Β» Bertrand Meyer)

ВСрнСмся ΠΊ Ρ‚ΠΎΠΌΡƒ ΡˆΠ°Π³Ρƒ нашСй истории, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ скоростной Π±Π΅Π·Π»ΠΈΠΌΠΈΡ‚. Допустим, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹ Π½Π°ΠΊΠ°Ρ‡Π°Π»ΠΈ всСвозмоТных Ρ„ΠΈΠ»ΡŒΠΌΠΎΠΌ ΠΏΡ€ΠΎ сантСхников ΠΊΠΈΠ½ΠΎΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Private ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ всС Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎ сантСхников, создали ΠΏΠ°ΠΏΠΊΡƒ «/Π’ΠΈΠ΄Π΅ΠΎ/ΠŸΡ€ΠΎ сантСхников/».

Π§Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π²Ρ‹ скачали Π΅Ρ‰Π΅ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² этой студии, Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎ доставку ΠΏΠΈΡ†Ρ†Ρ‹. Мало Ρ‚ΠΎΠ³ΠΎ, ваша новая Π΄Π΅Π²ΡƒΡˆΠΊΠ° написала Π²Π°ΠΌ БМБ Β«Π― скачала Ρ„ΠΈΠ»ΡŒΠΌ β€žΠΡ„ΠΎΠ½Ρβ€œ ΠΈ сохранила Π΅Π³ΠΎ Π² ΠΏΠ°ΠΏΠΊΡƒ /Π’ΠΈΠ΄Π΅ΠΎ/ΠŸΡ€ΠΎ сантСхников/, ΠΎΠΊ?Β». И Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ всС Π²Π΅Ρ€Π½ΠΎ β€” ΠΏΡ€ΠΎ сантСхника, Π½ΠΎ Π΅ΡΡ‚ΡŒ нюанс.
И Ρ‚ΡƒΡ‚ Π²Π°ΠΌ становится понятно, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры ΠΏΠ°ΠΏΠΎΠΊ(классов), Π° это явноС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° OCP.

Как Π² этом случаС Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? ΠžΡ‡Π΅Π½ΡŒ просто β€” ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСму Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π» измСнСния старого ΠΊΠΎΠ΄Π°. Π’.Π΅. Π½Π΅ Ρ…Π°Ρ€Π΄ΠΊΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ «../ΠŸΡ€ΠΎ сантСхников/», надСясь, Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Ρ‚Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎ Π½ΠΈΡ… ΠΈ Π±ΡƒΠ΄Π΅Ρ‚, Π° ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции Π΄ΠΎ «../Бтудия Private/» ΠΈ спокойно ΡΠΊΠ°Ρ€ΠΌΠ»ΠΈΠ²Π°Ρ‚ΡŒ Π΅ΠΉ ΠΈ сантСхников, ΠΈ разносчиков ΠΏΠΈΡ†Ρ†Ρ‹, ΠΈ прочая-прочая…

А для Афони ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ «../ΠœΠΎΡΡ„ΠΈΠ»ΡŒΠΌ/», Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠ² класс «/Π’ΠΈΠ΄Π΅ΠΎ/»

L β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков (Liskov Substitution Principle ΠΈΠ»ΠΈ LSP)

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ замСняСмыми Π½Π° экзСмпляры ΠΈΡ… ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ² Π±Π΅Π· измСнСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Ну Ρ‚ΡƒΡ‚ совсСм просто.

Для объяснСния Π΄Π°Π²Π°ΠΉΡ‚Π΅ обратимся ΠΊ ΠΌΠΈΠ»ΠΎΡ‚Π΅ ΠΈ Π½ΡΡˆΠ½ΠΎΡΡ‚ΠΈ, Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ «/Π€ΠΎΡ‚ΠΎ/ΠšΠΎΡ‚ΠΈΠΊΠΈ/».
ΠšΠΎΡ‚ΠΈΠΊΠΎΠ² ΠΌΡ‹ любим ΠΈ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ собрано Ρƒ нас ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ.

Π‘Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ прямо запускаСм ΡΠ»Π°ΠΉΠ΄ΡˆΠΎΡƒ ΠΏΠΎ всСй ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΈ Π»ΡŽΠ±ΡƒΠ΅ΠΌΡΡ. И Π²ΠΎΡ‚, Π² ΠΎΠ΄ΠΈΠ½ прСкрасный ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠΆΠ΅ практичСски достигли Π½ΠΈΡ€Π²Π°Π½Ρ‹, Π½Π° экран выводится:

НСвозмоТно ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» «/Π€ΠΎΡ‚ΠΎ/ΠšΠΎΡ‚ΠΈΠΊΠΈ/Книги/ΠšΠΎΡ‚ Π² сапогах.fb2»

Как ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, ваша ΠΏΠΎΠ΄Ρ€ΡƒΠ³Π° Ρ€Π΅ΡˆΠΈΠ»Π° ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ градус ΠΌΠΈΠ»ΠΎΡ‚Ρ‹ ΠΈ отнаслСдовала Β«ΠšΠΎΡ‚ΠΈΠΊΠΈΒ» Π½ΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΎΠΉ «Книги», Π³Ρ€ΡƒΠ±ΠΎ Π½Π°Ρ€ΡƒΡˆΠΈΠ² LSP, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ подкласс «Книги» Π½Ρƒ Π½ΠΈΠΊΠ°ΠΊ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Β«Π€ΠΎΡ‚ΠΎΒ».

I β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса (Interface Segregation Principle ΠΈΠ»ΠΈ ISP)

ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚.

Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ с ΠΏΠ°ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ Ρ„Π°ΠΉΠ»ΠΈΠΊΠ°ΠΌΠΈ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ слоТно, Π½ΠΎ я ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽ β€” Π½Π΅ судитС строго Π·Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Ρ‚ΡΠ½ΡƒΡ‚ΠΎΡΡ‚ΡŒ.

Π’Π°ΠΌ Π½Π°Π΄ΠΎΠ΅Π» стандартный ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»ΡŒ ΠΌΡƒΠ·Ρ‹ΠΊΠΈ ΠΈ Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ, супСрмодный ΠΈ Ρ…Π°ΠΉΠΏΠΎΠ²Ρ‹ΠΉ. Он Π΄Π°ΠΆΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Π»ΠΎΠΆΠΊΡƒ ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ альбома ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ субтитры исполняСмой пСсни. Но Π²ΠΎΡ‚ Π±Π΅Π΄Π°, Ссли Π² ΠΏΠ°ΠΏΠΊΠ΅ альбома ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ Β«cover.jpgΒ» ΠΈ Β«subtitles.txtΒ», Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ°Π΄Π°Π΅Ρ‚ с ошибкой. И Π²ΠΎΡ‚ Π²Ρ‹, проклиная всС Π½Π° свСтС, Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎ всСх ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠ°Ρ… с альбомами эти Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ.

Π’.Π΅., проводя Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ, ΠΌΡ‹ обязали класс Β«ΠœΡƒΠ·Ρ‹ΠΊΠ°Β» ΠΈ всСх Π΅Π³ΠΎ наслСдников Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйс Β«AudioCoverSubtitlesΒ». ΠŸΡ€ΠΈ этом, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ этот интСрфСйс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ альбом Β«Waiting for the SunΒ», альбом Β«The best of The DoorsΒ» Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Β«Audio+CoverΒ», Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«AudioΒ».

Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ мысли, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ толстый интСрфСйс Β«AudioCoverSubtitlesΒ» Π½Π° Ρ‚Ρ€ΠΈ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Β«AudioΒ», Β«CoverΒ» ΠΈ Β«SubtitlesΒ» ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Ρ‹.

D β€” ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (dependency inversion principle ΠΈΠ»ΠΈ DIP)

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

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

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Β«The DoorsΒ», Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Β«Waiting for the SunΒ» (ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅), зависят ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅ΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ абстракции Β«ΠœΡƒΠ·Ρ‹ΠΊΠ°Β», которая опрСдСляСт ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ Π½ΠΈΡ… ΠΌΡƒΠ·Ρ‹ΠΊΠ°).

Допустим, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΌΡƒΠ·Ρ‹ΠΊΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ сТатия β€” «с потСрями» ΠΈ Β«Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒΒ». Π­Ρ‚ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ абстракции Β«ΠœΡƒΠ·Ρ‹ΠΊΠ°Β» β€” Π² Π½ΠΈΡ…, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚Π°ΠΊΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΌΡƒΠ·Ρ‹ΠΊΠ°. ΠŸΡ€ΠΈ этом сама абстракция Β«ΠœΡƒΠ·Ρ‹ΠΊΠ°Β» Π½Π΅ зависит ΠΎΡ‚ этих Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π•ΠΉ всС Ρ€Π°Π²Π½ΠΎ, с потСрями Ρ‚Π°ΠΌ ΠΌΡƒΠ·Ρ‹ΠΊΠ° ΠΈΠ»ΠΈ Π±Π΅Π· Π½ΠΈΡ… β€” ΠΎΠ½Π° ΠΊΠ°ΠΊ Π±Ρ‹Π»Π° ΠΌΡƒΠ·Ρ‹ΠΊΠΎΠΉ, Ρ‚Π°ΠΊ Π΅ΠΉ ΠΈ остаСтся.

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID состоят ΠΈΠ· 5 ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΈΠ΄Π΅ΠΉ ΠΏΠΎ написанию ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ SOLID, сама Π΅Π³ΠΎ идСя появилась Π² 2000 Π³ΠΎΠ΄Ρƒ Π ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΌ ΠœΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΌ (ΠΎΠ΄Π½Π°ΠΊΠΎ, само ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ этому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Π±Ρ‹Π»ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ спустя нСсколько Π»Π΅Ρ‚). ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹Π΅, ΠΊΠ°ΠΊ SOLID Π±Ρ‹Π»ΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈ, Ρ‡Ρ‚ΠΎ спустя лишь нСбольшоС врСмя ΠΎΠ½ΠΈ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ сообщСства программистов.

Π’Π°ΠΊ ΠΆΠ΅, ΡΠΎΠ²ΡƒΡ‚ΡƒΡŽ, послС изучСния ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° этой ΡΡ‚Π°Ρ‚ΡŒΠΈ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π²ΠΎ врСмя), ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ SOLID Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°Ρ….

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ являСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ, ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ…. МнС каТСтся, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты ΠΏΡ€ΠΈ написании ΠΊΠΎΠ΄Π° ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ этому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ ΠΎΠ± этом, ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ зная ΠΎ Π΅Π³ΠΎ сущСстовавании. Однако, Ссли Π²Ρ‹ ΠΏΠΎΠΉΠΌΡ‘Ρ‚Π΅ идСю этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° сСйчас, ΠΈ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Π΄Π΅Ρ€ΠΆΠ° Π΅Ρ‘ Π² Π³ΠΎΠ»ΠΎΠ²Π΅, это, вСроятно ΠΈΠ·Π±Π°Π²ΠΈΡ‚ вас ΠΎΡ‚ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΊΠΎΠ΄Π° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Главная идСя, ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΡ‚ΡŒΡŽ ΠΏΠΎ названию этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°, ΠΎΠ½Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· систСмы Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько достаточно для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π»ΠΎΠ³ΠΈΠΊΠΈ этого класса. А Ρ‚Π°ΠΊ ΠΆΠ΅, класс Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ мастСром Π½Π° всС Ρ€ΡƒΠΊΠΈ, выполняя мноТСство Ρ€Π°Π·Π½ΠΎΠΏΠ»Π°Π½ΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ всС ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ»ΠΎΡ…ΠΎ спрСэктированного класса:

А Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ этот класс вызываСтся ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ‚Π°ΠΊ:

ВмСсто этого, любой ΠΈΠ· классов Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ обязанности

ΠŸΠΎΡ‚ΠΎΠΌΡƒ, сСйчас ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ этот класс с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚Π° ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° вынСсСна Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π³Π΄Π΅ Π΅ΠΌΡƒ ΠΈ мСсто.

Новая вСрсия выглядит Π½Π° порядок Ρ‡ΠΈΡ‰Π΅, ΠΏΡ€ΠΎΡ‰Π΅ для тСстирования, ΠΈ обновлСния.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΡΡ‚ΠΈ/Закрытости

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

НапримСр, Ссли Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ использовали ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€ Twig, Ρ‚ΠΎ Π²Ρ‹ навСрняка писали ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Π½Π΅Π³ΠΎ (добавляя собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Π² ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€). И ΠΊΠ°ΠΊ Ρ€Π°Π·, ΠΈΠ·-Π·Π° слСдования этому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Π²Ρ‹, написав собствСнноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ (ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ интСрфСйсу), Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π° самого ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ написании класса, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ условиСм Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ являСтся наслСдованиС ΠΈ слСдованиС интСрфСйсам.

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

А, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‘Ρ‚ΠΊΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с интСрфСйсами ΠΈ абстрактыми классами, ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ мою ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков (ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°ΠΊ LISP) это ваТная концСпция, придуманная Π΅Ρ‰Ρ‘ Π² Π΄Π°Π»Ρ‘ΠΊΠΎΠΌ 1987-ΠΌ. Π― ΠΎΠΏΠΈΡˆΡƒ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° основу ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, условного описания ΠΊΠΎΠ΄Π°, вмСсто Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ большого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΊΠΎΠ΄ΠΎΠΌ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π»Π΅Π³Ρ‡Π΅ для понимания, я Π±ΡƒΠ΄Ρƒ использова ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ «ΠšΠ»ΠΈΠ΅Π½Ρ‚ский класс»).

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΈΠ»ΠΈ любой подкласс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ этом Π½Π΅ измСняя собствСнный ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹, нСзависимо ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ взаимозамСняСмым Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π΅Π³ΠΎ подклассами, ΠΏΡ€ΠΈ этом, клиСнтский ΠΊΠΎΠ΄ Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ подклассом, Π΅ΠΌΡƒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹.

По-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ: Ссли Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΈ Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ 5 Ρ€Π°Π·Π½Ρ‹Ρ… классов со своСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π²ΡˆΠΈΡ… этот Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс. И ваш ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ этот Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΏΡ€ΠΈ Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Π½Π΅ Π½Π° любой ΠΈΠ· Π΅Π³ΠΎ «Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠΎΠ²», ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½Π΅Π΅.

Для соблюдСния этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°, ΠΏΡ€ΠΈ наслСдовании Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π² подклассах Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ соотвСтствиС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… (ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ соотвСтствиС сигнатур ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²), ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй

Π­Ρ‚ΠΎ ΠΌΠΎΠΉ самый Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±ΠžΠ»ΡŒΡˆΡƒΡŽ чистоту ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³Ρ‡Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

ПослС Ρ‡Π΅Π³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° основС этого интСрфСйса, Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ собой. ΠŸΡ€ΠΈ этом, Π·Π°ΠΌΠ΅Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ основного клиСнтского ΠΊΠΎΠ΄Π°. Для соблюдСния этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° достаточно ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π° основу интСрфСйсов Π° Π½Π΅ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΎ Ρ‡Π΅ΠΌ я ΠΈ писал, Π² Ρ€Π°Π½Π΅Π΅ упомянутой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

РСзюмС

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я попытался Π»Π°ΠΉΡ‚ΠΎΠ²ΠΎ, Π½Π΅ особо нагромоТдая вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ большими кусками ΠΊΠΎΠ΄Π° ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID Π² PHP, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ описаниС ΠΈ привСсти ΠΏΠΎΠ»Π½ΠΎΠΉ объяснСния Π΅Π³ΠΎ сути. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎ SOLID-Ρƒ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ всё большС ΠΈ большС, постоянно Π΄Π΅Ρ€ΠΆΠ° Π² Π³ΠΎΠ»ΠΎΠ²Π΅ эти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΡΡ‚Π°Ρ€Π°ΡΡΡŒ ΠΈΡ… Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π² Π½ΡƒΠΆΠ½Ρ‹Π΅ мСста. ПослС Ρ‡Π΅Π³ΠΎ, ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ само собой.

Subscribe to Π‘Π»ΠΎΠ³ php программиста: ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ PHP, JavaScript, MySql

Get the latest posts delivered right to your inbox

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

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΏΠΎ SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° PHP

Π’Π΅ΠΌΠ° SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ чистоты ΠΊΠΎΠ΄Π° Π½Π΅ Ρ€Π°Π· поднималась Π½Π° Π₯Π°Π±Ρ€Π΅ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΆΠ΅ порядком изъСзТСнная. Но Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ собСсСдования Π² ΠΎΠ΄Π½Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ IT-компанию, Π³Π΄Π΅ мСня попросили Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… SOLID с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ ситуациями, ΠΊΠΎΠ³Π΄Π° я Π½Π΅ соблюл эти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ это ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ. И Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я понял, Ρ‡Ρ‚ΠΎ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ я понимаю эти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΈΡ… всС, Π½ΠΎ привСсти Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹Π΅ ΠΈ понятныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ для мСня стало ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я ΠΈ Ρ€Π΅ΡˆΠΈΠ» для сСбя самого ΠΈ для сообщСства ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ для Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ Π΅Ρ‘ понимания. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, для людСй Ρ‚ΠΎΠ»ΡŒΠΊΠΎ знакомящихся с SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ, Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для людСй Β«ΡΡŠΠ΅Π²ΡˆΠΈΡ… собаку» Π½Π° SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ….

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π·Π½Π°ΠΊΠΎΠΌ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ ΠΈ Ρ…ΠΎΡ‡Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡΠ²Π΅ΠΆΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎ Π½ΠΈΡ… ΠΈ ΠΈΡ… использовании, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ сразу ΠΊ ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ΅ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹? Если Π²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Wikipedia, это:

Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° пяти основных ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Π΄ΠΈΠ·Π°ΠΉΠ½Π° классов Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ β€” Single responsibility, Open-closed, Liskov substitution, Interface segregation ΠΈ Dependency inversion.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности (Single responsibility)

Π˜Ρ‚Π°ΠΊ, Π² качСства ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ довольно популярный ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½ с Π·Π°ΠΊΠ°Π·Π°ΠΌΠΈ, Ρ‚ΠΎΠ²Π°Ρ€Π°ΠΌΠΈ ΠΈ покупатСлями.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности гласит β€” «На ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π° ΠΎΠ΄Π½Π° СдинствСнная ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒΒ». Π’.Π΅. Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами β€” ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ β€” Π½ΠΈ большС, Π½ΠΈ мСньшС.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ описаниС класса для прСдставлСния Π·Π°ΠΊΠ°Π·Π° Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅:

Как ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π΄Π°Π½Π½Ρ‹ΠΉ класс выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для 3 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏΠΎΠ² Π·Π°Π΄Π°Ρ‡: Ρ€Π°Π±ΠΎΡ‚Π° с самим Π·Π°ΠΊΠ°Π·ΠΎΠΌ( calculateTotalSum, getItems, getItemsCount, addItem, deleteItem ), ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·Π°( printOrder, showOrder ) ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…( load, save, update, delete ).
К Ρ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти?
ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ это ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² случаС, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ внСсти измСнСния Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, ΠΌΡ‹ измСняСм сам класс Π·Π°ΠΊΠ°Π·Π°, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π΅Π³ΠΎ нСработоспособности.
Π Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ стоит Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Π½Π° 3 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… класса, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ своСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс занимаСтся своСй ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для Π΅Π³ΠΎ измСнСния.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости (Open-closed)

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков (Liskov substitution)

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

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ явно выполняСтся Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΡ‚ Π½Π΅Π³ΠΎ этого ΠΆΠ΄ΡƒΡ‚.
Но Π² Ρ‡Ρ‘ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°? Π Π°Π·Π²Π΅ Β«ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Β» Π½Π΅ являСтся Β«ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌΒ»? ЯвляСтся, Π½ΠΎ Π² гСомСтричСских понятиях. Π’ понятиях ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π½Π΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Β» Π½Π΅ согласуСтся с ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Β«ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΒ».

Β«Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ Π·Π° ΠΏΡ€Π΅Π΄- ΠΈ постусловия?Β» β€” ΠΌΠΎΠΆΠ΅Ρ‚Π΅ спроситС Π’Ρ‹.
ΠžΡ‚Π²Π΅Ρ‚: прСдусловия – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ стороной ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, постусловия – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ, гарантируСтся Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π»ΡƒΡ‡ΡˆΠ΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ООП ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ расчёта ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ Β«ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Β» наслСдуСт Β«ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΒ», Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ 2 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ сущности:

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ нСсоблюдСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Лискоу ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, принятого Π² связи с этим, рассмотрСн Π² ΠΊΠ½ΠΈΠ³Π΅ Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π° «Быстрая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ» Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лискоу. Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Β».

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса (Interface segregation)

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ гласит, Ρ‡Ρ‚ΠΎ «Много спСциализированных интСрфСйсов Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉΒ»
БоблюдСниС этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ классы-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ/Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс Π·Π½Π°Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ Ρ‚Π΅Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ количСства Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

ВСрнёмся ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠΌ.
ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ наши Ρ‚ΠΎΠ²Π°Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄, скидку, Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ какая-Ρ‚ΠΎ Ρ†Π΅Π½Π°, состояниС ΠΈ Ρ‚.Π΄. Если это ΠΎΠ΄Π΅ΠΆΠ΄Π° Ρ‚ΠΎ для Π½Π΅Ρ‘ устанавливаСтся ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° сдСлана, Ρ†Π²Π΅Ρ‚ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€.
ОпишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс

Π”Π°Π½Π½Ρ‹ΠΉ интСфСйс ΠΏΠ»ΠΎΡ… Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². А Ρ‡Ρ‚ΠΎ, Ссли наш класс Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ скидок ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄ΠΎΠ², Π»ΠΈΠ±ΠΎ для Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ смысла ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ сдСлан (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΊΠ½ΠΈΠ³). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Π½Ρ‘ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ интСрфСйс Π½Π° нСсколько ΠΌΠ΅Π»ΠΊΠΈΡ… ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ классом Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ интСрфСйсы.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (Dependency Invertion)

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ гласит β€” «Зависимости Π²Π½ΡƒΡ‚Ρ€ΠΈ систСмы строятся Π½Π° основС абстракций. ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π½Π΅ зависят ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня. Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций». Π”Π°Π½Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ β€” «зависимости Π΄ΠΎΠ»ΠΆΠ½Ρ‹ строится ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ абстракций, Π° Π½Π΅ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉΒ».

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΠΎΠΏΠ»Π°Ρ‚Ρƒ Π·Π°ΠΊΠ°Π·Π° ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»Π΅ΠΌ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, класс Customer Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ абстракции, Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Ρ‚.Π΅. Π΄Π΅Ρ‚Π°Π»ΠΈ, Π΅ΠΌΡƒ Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½Ρ‹.

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°

НадСюсь, моя Β«ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°Β» ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID ΠΈ даст Ρ‚ΠΎΠ»Ρ‡ΠΎΠΊ ΠΊ ΠΈΡ… использованию Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….
Бпасибо за вниманиС.

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

ΠŸΠΎΡ‡Π΅ΠΌΡƒ SOLID – ваТная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡ программиста. РазбираСмся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… с ΠΊΠΎΠ΄ΠΎΠΌ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚! МСня Π·ΠΎΠ²ΡƒΡ‚ Иван, я ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°ΡŽ со львовским офисом EPAM ΠΊΠ°ΠΊ Solution Architect, Π° ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Ρƒ Π² IT Π½Π°Ρ‡Π°Π» 10 Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄. Π—Π° это врСмя Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π»ΡŽΠ±ΡΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с нуля. Однако Π½Π΅ всСм удаСтся ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ систСму, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ всС Π΅Ρ‰Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ спустя Π³ΠΎΠ΄.

Π’ΠΏΠΎΠ»Π½Π΅ СстСствСнно, Ρ‡Ρ‚ΠΎ вмСстС с разрастаниСм систСмы Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ‚ΡŒΡΡ ΠΈ Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. УспСх Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π°ΠΊΠΎΠΉ систСмы Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²Ρ‹ Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Для достиТСния этой Ρ†Π΅Π»ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΠΈΠ·Π°ΠΉΠ½-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹, Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, Π° Π³Π»Π°Π²Π½ΠΎΠ΅ – ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ проСктирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ SOLID, GRASP ΠΈ DDD.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ SOLID – ваТная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π― ΠΏΠΎΠΊΠ°ΠΆΡƒ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² с ΠΊΠΎΠ΄ΠΎΠΌ, Π³Π΄Π΅ Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID. ΠœΡ‹ выясним, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ послСдствиям это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти Π² долгосрочной пСрспСктивС ΠΈ ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. На ΠΌΠΎΠΉ взгляд, ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсна ΠΊΠ°ΠΊ back-end, Ρ‚Π°ΠΊ ΠΈ front-end Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ.

solid php Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ solid php Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ solid php Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ solid php Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ solid php Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ SOLID

SOLID – Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставил Π ΠΎΠ±Π΅Ρ€Ρ‚ ΠœΠ°Ρ€Ρ‚ΠΈΠ½ Π² 1995 Π³ΠΎΠ΄Ρƒ. Π˜Ρ… идСя состоит Π² нСобходимости ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ зависимостСй ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠΎΠ΄Π°. Код с большим количСством зависимостСй (Ρ‚.Π½. «спагСтти-ΠΊΠΎΠ΄Β») ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ слоТно. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности (Single Responsibility Principle)

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ лишь ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сфокусированы Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ задания. Если ΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ†Π΅Π»ΠΈ сущСстствования класса, ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вынСсти Π·Π° Ρ€Π°ΠΌΠΊΠΈ этого класса.

НапримСр, класс User. Π•Π³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ – ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅: имя, e-mail ΠΈ Ρ‚ΠΈΠΏ подписки, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π² сСрвисС.

Рассмотрим ΠΌΠ΅Ρ‚ΠΎΠ΄ hasUnlimitedContentAccess. На основС Ρ‚ΠΈΠΏΠ° подписки ΠΎΠ½ опрСдСляСт Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Ρƒ. Но Ρ€Π°Π·Π²Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ – ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ класcΠ° User?

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ класса User Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Ρ†Π΅Π»ΠΈ сущСствования: ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΠ± ΡƒΡ€ΠΎΠ²Π½Π΅ доступа ΠΊ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Ρƒ Π½Π° основС подписки. Π­Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Single Responsibility.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ сущСствованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° hasUnlimitedContentAccess Π² классС User ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ послСдствия? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Ρ‚ΠΈΠΏΠΎΠΌ подписки «расплываСтся» ΠΏΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠšΡ€ΠΎΠΌΠ΅ класса User ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ классы MediaLibrary ΠΈ Player, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π° основС этих ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° подписки ΠΏΠΎ-своСму. Если ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ подписок измСнятся, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ всС классы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ выстроил свой Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ.

Π£Π΄Π°Π»ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ hasUnlimitedContentAccess Π² классС User ΠΈ создадим Π½ΠΎΠ²Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с подписками.

ΠœΡ‹ инкапсулировали всС ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с подписками Π² ΠΎΠ΄Π½ΠΎΠΌ классС. Если Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ измСнСния Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ…, ΠΎΠ½ΠΈ останутся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² этом классС ΠΈ Π½Π΅ зацСпят ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅.

Single Responsibility Principle касаСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ уровня классов – ΠΌΠΎΠ΄ΡƒΠ»ΠΈ классов Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ узкоспСциализированы.

ΠšΡ€ΠΎΠΌΠ΅ SOLID сущСствуСт ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² проСктирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния – GRASP. НСкоторыС Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ с SOLID. Если ΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Single Responsibility Principle, Ρ‚ΠΎ с GRASP ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ:

ΠŸΡ€ΠΈΠ½ΠΈΡ†ΠΈΠΏ открытости/закрытости (Open/Close Principle)

ΠšΠ»Π°ΡΡΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Если Π΅ΡΡ‚ΡŒ класс, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прСдусматриваСт мноТСство ΠΎΡ‚Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ Π»ΠΈΠ±ΠΎ ряд ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шагов, ΠΈ Π΅ΡΡ‚ΡŒ высокая Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡ… количСство Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ класс Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ отвСтвлСния ΠΈΠ»ΠΈ шаги Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΊ Π΅Π³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

НавСрноС, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· нас Π²ΠΈΠ΄Π΅Π» бСсконСчныС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ if then else ΠΈΠ»ΠΈ switch. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ добавляСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ условиС, ΠΌΡ‹ пишСм ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ if then else, мСняя ΠΏΡ€ΠΈ этом сам класс. Π›ΠΈΠ±ΠΎ класс выполняСт процСсс с мноТСством ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шагов – ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ шаг ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΅Π³ΠΎ измСнСнию. А это Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Open/Close Principle.

Рассмотрим нСсколько способов Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ класса Π±Π΅Π· Π΅Π³ΠΎ нСпосрСдствСнного измСнСния.

Как Π²ΠΈΠ΄ΠΈΠΌ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ класса ShapeManger. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ тСсно связана с самой Ρ„ΠΈΠ³ΡƒΡ€ΠΎΠΉ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ свою ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ, привСсти ΠΈΡ… ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ интСрфСйсу, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ getMinArea.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Ρƒ нас появятся Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, всС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс IShape. И класс ShapeManager сразу Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π±Π΅Π· всякого Ρ€ΠΎΠ΄Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ.

А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌ? Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡Π°Ρ‚ Single Responsibility Principle. Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ шаблоном проСктирования «БтратСгия» (Strategy): ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ мноТСство ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, стратСгии ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Inversion of Control ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Π’ этом случаС класс, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉΡΡ Π² Π½ΠΈΡ…, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ стратСгии Π½Π° этапС создания автоматичСски.

Рассмотрим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° происходит ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ многошаговая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…. Если количСство шагов измСнится, Π½Π°ΠΌ придСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ класс.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€ Β«ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Β» (Pipeline)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ изобраТСния, ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ†ΠΈΡ„ΠΈΡ€ΡƒΠ΅ΠΌ массив с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ. Π‘Π°ΠΌ класс ImageProcessor остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ изобраТСния ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии ImageProcessor, ΠΈΠ½Π°Ρ‡Π΅ скомбинируСм Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² массивС pipeMethods.

Π•Ρ‰Π΅ нСсколько прСимущСств. Π Π°Π½Π΅Π΅ ΠΌΡ‹ добавляли Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ прямо Π² ImageProcessor, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ зависимости. НапримСр, ΠΌΠ΅Ρ‚ΠΎΠ΄ highlightLetters Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для поиска символов Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. БоотвСтствСнно, большС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² – большС зависимостСй. БСйчас ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ PipeMethod ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ зависимости.

ПослС Ρ‚Π°ΠΊΠΎΠΉ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ всС ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, такая структура ΠΊΠΎΠ΄Π° ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΊΠΎΠ² ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с Ρ‡Π΅Ρ‚ΠΊΠΈΠΌΠΈ интСрфСйсами.

Π”ΠΎ этого ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ большой ΠΌΠ΅Ρ‚ΠΎΠ΄ fixQuality, Π³Π΄Π΅ Π±Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΠ»ΠΎΡΡŒ ΠΈ исправлСниС баланса Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ контраста. Однако Π² Ρ‚Π°ΠΊΠΎΠΌ большом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ слоТно ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°.

ВСроятно, Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π±Ρ‹ ситуация, ΠΊΠΎΠ³Π΄Π° для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Π° изобраТСния fixQuality Ρ€Π°Π±ΠΎΡ‚Π°Π» Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π½Π° этапС тСстирования ΠΎΠ½ Π±Ρ‹ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» вовсС. ИмСя нСсколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΡΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для достиТСния Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ GRASP, ΠΎΠ±Ρ‰ΠΈΠ΅ с Open/Close Principle:

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лисков (Liskov Substitution Principle)

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

Если ΠΌΡ‹ пСрСопрСдСляСм ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ΡŒ повСдСнию Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ случай, ΠΊΠΎΠ³Π΄Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠ΅ классов-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ транспортных срСдств:

ВсС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ добавляСм Π½ΠΎΠ²Ρ‹ΠΉ класс – ПоСзд.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ΅Π·Π΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ своСго двиТСния, Ρ‚ΠΎ turn Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лисков.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… класса: FreeDirectionalVehicle – Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния ΠΈ BidirectionalVehicle β€” Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ Π½Π°Π·Π°Π΄. Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС классы Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ лишь Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ смогут ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, класс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ условия Π΄ΠΎ ΠΈ послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. НапримСр:

Π’ этой ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΌΡ‹ Π½Π΅ смоТСм Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Logger ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ TcpLogger, Ρ‚.ΠΊ. Π΄ΠΎ ΠΈ послС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ openConnection ΠΈ closeConnection. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, ΠΌΡ‹ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ 2 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… условия Π½Π° Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° log, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лисков.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ openConnection ΠΈ closeConnection ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌΠΈ. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ log класса TcpLogger ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ запись Π»ΠΎΠ³ΠΎΠ² Π² Ρ„Π°ΠΉΠ». Π‘ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ) Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» с Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°, ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ всС Π»ΠΎΠ³ΠΈ. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈ Π²ΠΎ врСмя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΅Π΅ запуска.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса (Interface Segregation Principle)

Π›ΡƒΡ‡ΡˆΠ΅, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ мноТСство спСциализированных интСрфСйсов, Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ‰ΠΈΠΉ. ИмСя ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс, Π΅ΡΡ‚ΡŒ риск ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс логичСски Π½Π΅ смоТСт ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’Π°ΠΊ ΠΊΠ°ΠΊ с Ρ„Π°ΠΉΠ»Π° ΠΌΡ‹ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ локально, ΠΌΠ΅Ρ‚ΠΎΠ΄ Connect лишний. Π Π°Π·Π΄Π΅Π»ΠΈΠΌ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс IDataSource:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ каТдая имплСмСнтация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (Dependency Inversion Principle)

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ:

Наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня UserService ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня: localStorage, fetch ΠΈ Date. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠ»ΠΎΡ… Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вмСсто fetch Ρ€Π΅ΡˆΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, которая Π΄Π΅Π»Π°Π΅Ρ‚ HTTP-запросы, Ρ‚ΠΎ придСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ UserService. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ слоТно ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ тСстами.

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getUser ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс User, Π° Π½Π΅ Π΅Π³ΠΎ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ – интСрфСйс IUser.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ абстракции, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля UserService.

Как Π²ΠΈΠ΄ΠΈΠΌ, ΠΊΠΎΠ΄ стал Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ взглянСм Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ интСрфСйсов ICache ΠΈ IRemoteService.

ΠœΡ‹ сдСлали Π²Ρ€Π°ΠΏΠ΅Ρ€Ρ‹ Π½Π°Π΄ localStorage ΠΈ fetch. Π’Π°ΠΆΠ½Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… классов являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ localStorage ΠΈ fetch Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. ΠœΡ‹ всС врСмя Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с созданными для Π½ΠΈΡ… интСрфСйсами. LocalStorage ΠΈ fetch Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² конструктор, Ссли Ρ‚Π°ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Для тСстов ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ mocks ΠΈΠ»ΠΈ stubs, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ замСнят localStorage ΠΈΠ»ΠΈ fetch, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² конструктор.

ΠŸΠΎΡ…ΠΎΠΆΠΈΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΈ для Π΄Π°Ρ‚Ρ‹: Ссли Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· LocalStorageCache Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π΄Π°Ρ‚Ρƒ. Если ΠΆΠ΅ для тСстов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ конструктора.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

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

НСкоторыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ особСнно часто. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ, ΠΈ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ проСктирования. Если ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡ… ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π½Π΅ допустим Π»Π°Π²ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ слоТности систСмы. Одними ΠΈΠ· самых простых Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² являСтся SOLID

И Π² Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: ΠΎΡ‚Ρ†Π°-основатСля SOLID, Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π°, Π½Π΅Π±Π΅Π·ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ настоящСй Ρ€ΠΎΠΊ-Π·Π²Π΅Π·Π΄ΠΎΠΉ Π² ΠΌΠΈΡ€Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ПО. На Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ… ΡƒΠΆΠ΅ выросло Π½Π΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΡΡƒΠΏΠ΅Ρ€ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… программистов. Β«Clean CodeΒ» ΠΈ Β«Clean CoderΒ» β€” Π΄Π²Π΅ Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ качСствСнный ΠΊΠΎΠ΄ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΡΠΎΡ‡Π°ΠΉΡˆΠΈΠΌ стандартам Π² индустрии. Π”ΡƒΠΌΠ°ΡŽ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· вас ΡƒΠΆΠ΅ успСли ΠΏΡ€ΠΈΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½ΠΈΡ…, Π° Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ шанс ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Ρ‚ΡŒ свой ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

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

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

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