Skip to content

atlance/solid-principles

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

1 Commit
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

SOLID Β«SΒ»: ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной обязанности (single responsibility principle, SPR)

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

Π’Π΅Ρ€ΠΌΠΈΠ½ Β«SOLIDΒ» прСдставляСт собой Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ пяти Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ с классами Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ:

  1. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° СдинствСнной обязанности
  2. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° открытости/закрытости
  3. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков
  4. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° раздСлСния интСрфСйса
  5. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй

Π­Ρ‚ΠΈΠΌΠΈ ΠΏΡΡ‚ΡŒΡŽ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ слСдуСт Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ написании ΠΊΠΎΠ΄Π°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

Класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· 5 Π³ΠΈΠ±ΠΊΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ½ΠΈΠ³Π΅ «Быстрая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Β» Π ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΌ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΌ. Π—Π°Ρ‚Π΅ΠΌ эта ΠΊΠ½ΠΈΠ³Π° Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅ΠΈΠ·Π΄Π°Π½Π° Π² вСрсии для C# Β«ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ Π³ΠΈΠ±ΠΊΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° языкС C#Β». Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Π²ΠΏΠΎΠ»Π½Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ Ρ‚Π°ΠΊ Π»Π΅Π³ΠΊΠΎΒ  Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

Класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Но Ρ‡Π΅ΠΌ обусловлСна подобная Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ?Β Π’ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языках программирования сущСствованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»Π΅Ρ‡ΡŒ Π·Π° собой ряд Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Π”Π²Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ Π΄Π²ΡƒΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΈ каТдая ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ своС собствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² случаС C++, C# Java ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСсовмСстимости ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ частями прилоТСния.

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

Аудитория

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ СдинствСнной отвСтствСнности, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ класс ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, являСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Ρ‡Π΅ΠΌ простоС просматриваниС списка.

НапримСр, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов поиска ΠΏΡ€ΠΈΡ‡ΠΈΠ½ измСнСния - Π°Π½Π°Π»ΠΈΠ· Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ класса. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚Π΅ΠΌΠΈ Π»ΠΈΡ†Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ класса. Π’ΠΎΡ‚ нСсколько ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΈΡ… возмоТная аудитория.

  1. ΠœΠΎΠ΄ΡƒΠ»ΡŒ сохраняСмости - аудитория Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ администраторов Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² ПО.
  2. ΠœΠΎΠ΄ΡƒΠ»ΡŒ отчСтности - аудитория Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠ»Π΅Ρ€ΠΊΠΎΠ², Π±ΡƒΡ…Π³Π°Π»Ρ‚Π΅Ρ€ΠΎΠ² ΠΈ опСрационистов.
  3. ΠœΠΎΠ΄ΡƒΠ»ΡŒ расчСта ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ для систСмы расчСта Π·Π°Ρ€Π°Π±ΠΎΡ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‹ - аудитория ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΡŽΡ€ΠΈΡΡ‚ΠΎΠ², ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΈ Π±ΡƒΡ…Π³Π°Π»Ρ‚Π΅Ρ€ΠΎΠ².
  4. ΠœΠΎΠ΄ΡƒΠ»ΡŒ поиска ΠΊΠ½ΠΈΠ³ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ - аудитория ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ библиотСкаря ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π ΠΎΠ»ΠΈ ΠΈ Π°ΠΊΡ‚Π΅Ρ€Ρ‹

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

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли аудитория обусловливаСт ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ измСнСния, Π°ΠΊΡ‚Ρ‘Ρ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ свСсти понятия ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π»ΠΈΡ† Π²Ρ€ΠΎΠ΄Π΅ «АрхитСктора Π”ΠΆΠΎΠ½Π°Β» ΠΈΠ»ΠΈ «БСкрСтаря ΠœΠ°Ρ€ΠΈΠΈΒ» ΠΊ опСрациям.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, согласно Π ΠΎΠ±Π΅Ρ€Ρ‚Ρƒ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ, ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ - это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выполняСт ΠΎΠ΄ΠΈΠ½ взятый Π°ΠΊΡ‚Ρ‘Ρ€.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

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

АктСр для отвСтствСнности - СдинствСнный источник ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ этой отвСтствСнности. (Π ΠΎΠ±Π΅Ρ€Ρ‚ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½)

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сами сСбя

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ класс Book, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт Π² сСбС ΠΊΠ½ΠΈΠ³Ρƒ вмСстС с Π΅Ρ‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

<?php

class Book
{
    public function getTitle()
    {
        return "A Great Book";
    }
 
    public function getAuthor()
    {
        return "John Doe";
    }
 
    public function turnPage()
    {
        // pointer to next page
    }
 
    public function printCurrentPage()
    {
        echo "current page content";
    }
}

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

РаздСляй ΠΈ властвуй

Π‘ΠΎΠ²ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ с прСдставлСниСм являСтся ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‚.ΠΊ. это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности (ΠŸΠ•Πž). Рассмотрим ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅:

<?php

class Book
{
    public function getTitle()
    {
        return "A Great Book";
    }

    public function getAuthor()
    {
        return "John Doe";
    }

    public function turnPage()
    {
        // pointer to next page
    }

    public function getCurrentPage()
    {
        return "current page content";
    }

}

interface Printer
{
    public function printPage($page);
}

class PlainTextPrinter implements Printer
{
    public function printPage($page)
    {
        echo $page;
    }
}

class HtmlPrinter implements Printer
{
    public function printPage($page)
    {
        echo $page;
    }
}

Π”Π°ΠΆΠ΅ ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ прСдставлСниС. ΠŸΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡΡΡŒ ΠŸΠ•Πž, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способны Β«ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΒ» сСбя

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ сам сСбя ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ· прСдставлСния.

<?php

class Book
{
    public function getTitle()
    {
        return "A Great Book";
    }

    public function getAuthor()
    {
        return "John Doe";
    }

    public function turnPage()
    {
        // pointer to next page
    }

    public function getCurrentPage()
    {
        return "current page content";
    }

    public function save()
    {
        $filename = '/documents/'. $this->getTitle(). ' - ' . $this->getAuthor();
        file_put_contents($filename, serialize($this));
    }
}

ΠœΡ‹ снова ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, БистСму управлСния ΠΊΠ½ΠΈΠ³ΠΎΠΉ ΠΈ Π‘ΠΎΡ…Ρ€Π°Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ класс ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΈ сохраняСмости ΠΈΠ»ΠΈ способа пСрСлистывания страницы. МоТно ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² измСнСния Π΄Π°Π½Π½Ρ‹Ρ….

<?php

class Book
{
    public function getTitle()
    {
        return "A Great Book";
    }

    public function getAuthor()
    {
        return "John Doe";
    }

    public function turnPage()
    {
        // pointer to next page
    }

    public function getCurrentPage()
    {
        return "current page content";
    }

}

class SimpleFilePersistence
{
    public function save(Book $book)
    {
        $filename = '/documents/' . $book->getTitle() . ' - ' . $book->getAuthor();
        file_put_contents($filename, serialize($book));
    }
}

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ сохранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс, ΠΌΡ‹ смоТСм явно Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сохраняСмости, Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияя Π½Π° класс Book. Π’Π°ΠΊ, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ класса DatabasePersistence Π±ΡƒΠ΄Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ, ΠΈ наша бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ°, выстроСнная Π²ΠΎΠΊΡ€ΡƒΠ³ дСйствий с ΠΊΠ½ΠΈΠ³ΠΎΠΉ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ измСнится.

ВысокоуровнСвоС прСдставлСниС

Π’ своих ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… я Π½Π΅ Ρ€Π°Π· ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π» Π’Π°ΡˆΠ΅ΠΌΡƒ вниманию схСму высокоуровнСвой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, которая ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅.

Если ΠΌΡ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π°Π½Π½ΡƒΡŽ схСму, Ρ‚ΠΎ сразу ΠΏΠΎΠΉΠΌΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ ΠŸΠ•Πž. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΎ с ΠΏΡ€Π°Π²ΠΎΠΉ стороны схСмы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Β«Π€Π°Π±Ρ€ΠΈΠΊΒ» (Factories) ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° нашСго прилоТСния (Main). Один Π°ΠΊΡ‚Ρ‘Ρ€ - ΠΎΠ΄Π½Π° ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ. О сохраняСмости (Persistence) Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ, располоТив Π΅Π΅ Π²Π½ΠΈΠ·Ρƒ. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прСдназначаСтся для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ отвСтствСнности. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, с Π»Π΅Π²ΠΎΠΉ стороны ΠΌΡ‹ размСстили прСдставлСниС, ΠΈΠ»ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ доставки, Π² Π²ΠΈΠ΄Π΅ MVC ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса. И вновь соблюдСн ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности. ВсС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ остаСтся Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, - это Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с самой бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ.

Вопросы проСктирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния

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

Π“Π»Π°Π²Π½ΠΎΠ΅ достоинство ПО - простота внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠ΅ качСство - Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния способности ПО ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ ΠΊΡ€ΡƒΠ³ потрСбностСй ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Однако для достиТСния высокого значСния Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, сначала Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ критСрия. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ критСрия Π½Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹, соблюдая ΠŸΠ•Πž, ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ быстро Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ИзлоТим по шагам:

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ критСрия Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ установлСно Π΄ΠΎ опрСдСлСния значСния Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ критСрия.

  1. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅ потрСбностСй ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.
  2. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ – это потрСбности Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ².
  3. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΠΈ Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ измСнСния этих Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ².
  4. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΠΈ Π² измСнСниях Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ², Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π°ΡˆΡƒ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ нашСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹:

  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ².
  2. Π’Ρ‹ΡΠ²ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отвСтствСнности ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡ‚Ρ‘Ρ€Π°.
  3. Π‘Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‡Π°Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° свою Ρ‡Π°ΡΡ‚ΡŒ.

МСнСС ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

<?php

class Book
{
    public function getTitle()
    {
        return "A Great Book";
    }

    public function getAuthor()
    {
        return "John Doe";
    }

    public function turnPage()
    {
        // pointer to next page
    }

    public function getCurrentPage()
    {
        return "current page content";
    }

    public function getLocation()
    {
        // returns the position in the library
        // ie. shelf number & room number
    }
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ это выглядит Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΈ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ. Π£ нас Π½Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ относился Π±Ρ‹ ΠΊ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ располагаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° turnPage() ΠΈ Π΅Ρ‰Π΅ нСсколькими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ свСдСния ΠΎ ΠΊΠ½ΠΈΠ³Π΅. Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ Π΅Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getLocation().

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

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getAuthor(), getTitle() ΠΈ getLocation() ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π°ΠΊΡ‚Π΅Ρ€ΠΎΠ². ΠŸΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ для Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ чтСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΅Π΅ страниц, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΈΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½Π° Π»ΠΈ ΠΈΠΌ эта ΠΊΠ½ΠΈΠ³Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, для Ρ‚Π°ΠΊΠΈΡ… Π°ΠΊΡ‚Ρ‘Ρ€ΠΎΠ² ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ всС ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ getLocation(), Ρ‚.ΠΊ. Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠ΅Ρ‚, Π³Π΄Π΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ хранятся Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠ½ΠΈΠ³ΠΈ. ΠšΠ½ΠΈΠ³Ρƒ Π½Π°ΠΉΠ΄Π΅Ρ‚ ΠΈ отдаст Π² Ρ€ΡƒΠΊΠΈ посСтитСля Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π΅ΠΌ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности.

<?php

class Book
{
    public function getTitle()
    {
        return "A Great Book";
    }

    public function getAuthor()
    {
        return "John Doe";
    }

    public function turnPage()
    {
        // pointer to next page
    }

    public function getCurrentPage()
    {
        return "current page content";
    }

}

class BookLocator
{
    public function locate(Book $book)
    {
        // returns the position in the library
        // ie. shelf number & room number
        $repository->findBookBy($book->getTitle(), $book->getAuthor());
    }

}

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ класс BookLocator. ΠŸΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŽ ΠΆΠ΅ потрСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ класс Book. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, BookLocator ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколькими Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами. Π’Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€Π° ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Book. Π­Ρ‚ΠΎ всСгда зависит ΠΎΡ‚ нашСй Π·Π°Π΄Π°Ρ‡ΠΈ. Π’Π°ΠΆΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ организация хранСния ΠΊΠ½ΠΈΠ³, скорСС всСго, измСнится, ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΡŽ придСтся ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ Π² Π½ΠΎΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Book Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, Ссли ΠΌΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠΌ читатСлям ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΊΠ½ΠΈΠ³, Π·Π°ΠΊΡ€Ρ‹Π² доступ ΠΊ ΠΈΡ… страницам – ΠΌΡ‹ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ повлияСм Π½ΠΈ Π½Π° библиотСкаря, Π½ΠΈ Π½Π° собствСнно процСсс поиска ΠΏΠΎΠ»ΠΎΠΊ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… находятся ΠΊΠ½ΠΈΠ³ΠΈ.

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

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½cΡ‚Π²Π΅Π½Π½ΠΎΠΉ отвСтствСнности Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ классов ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ опрСдСляСтся ΠŸΠ•Πž, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Но, ΠΊΠ°ΠΊ ΠΈ каТдая мСдаль, ΠŸΠ•Πž ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Π΅ стороны. ΠžΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ прилоТСния, учитывая ΠŸΠ•Πž, с самого Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π’Π°ΠΊΠΆΠ΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ сразу Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚Π΅Ρ€ΠΎΠ², сколько Π½Π°ΠΌ понадобится. Однако, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, ΠΊΡ€Π°ΠΉΠ½Π΅ опасно ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ всС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ части прилоТСния с самого Π½Π°Ρ‡Π°Π»Π°. ИзлишнСС соблюдСниС ΠŸΠ•Πž ΠΌΠΎΠΆΠ΅Ρ‚ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ привСсти ΠΊ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈ вмСсто Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ слоТно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊΠΎΠΉ класс ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π·Π° Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚.

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

SOLID Β«OΒ»: ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости (open/closed principle, OCP)

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости Π»Π΅Π³ΠΊΠΎ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ, Π½ΠΎ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт этому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ слоТно.

Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° для ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости (OCP) Π±Ρ‹Π» сформулирован французским программистом Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ΠΎΠΌ ΠœΠ°ΠΉΠ΅Ρ€ΠΎΠΌ ΠΈ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅Π» Π² ΠΌΠΈΡ€ Π² Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³Π΅ Β«Object-Oriented Software ConstructionΒ» Π² 1988 Π³ΠΎΠ΄Ρƒ. ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ ΠΊ этому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ ΠΏΡ€ΠΈΡˆΠ»Π° Π² Π½Π°Ρ‡Π°Π»Π΅ 2000-Ρ… Π³ΠΎΠ΄ΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π² SOLID.

Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, классов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ситуации, ΠΊΠΎΠ³Π΄Π° понадобится Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. РСшСниС – Π² написании Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅ Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π½Π° Java, C, C++ ΠΈΠ»ΠΈ C#, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ затрагиваСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ исходный ΠΊΠΎΠ΄, Π½ΠΎ ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Ρƒ созданиС Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π·Π°Π½ΠΎΠ²ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ Β«exeΒ» ΠΈ DLL-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

SRP Π² контСкстС SOLID

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

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ Π² этом ΠΊΠΎΠ΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ±Π»ΡŽΠ΄Π΅Π½Ρ‹ ΠΎΠ±Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°. Но это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ SRP-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ всСгда ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ OCP, ΠΈΠ»ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π½ΠΎ Π² ΠΏΡ€Π΅ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, Ссли соблюдСн ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, привСсти ΠΊΠΎΠ΄ ΠΊ соблюдСнию Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ составит большого Ρ‚Ρ€ΡƒΠ΄Π°.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° OCP

Π‘ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости ΠΎΡ‡Π΅Π½ΡŒ прост: ΠΌΠ΅ΠΆΠ΄Ρƒ двумя классами Π΅ΡΡ‚ΡŒ простыС связи, Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· классов Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ OCP.

Класс User Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ класс Logic. Если Π²Ρ‚ΠΎΡ€ΠΎΠΉ класс Logic Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ старыС Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ Π½ΠΎΠ²Ρ‹Π΅, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс Logic придСтся нСсколько ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. User Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ связан с классом Logic, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, способа ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ User, попросту Π½Π΅ сущСствуСт. Когда Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ языках со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‚ΠΎ класс User, скорСС всСго, Ρ‚ΠΎΠΆΠ΅ придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Когда ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языках, Ρ‚ΠΎ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ User ΠΈ Logic ΠΈ динамичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ пСрСкомпиляции ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π° это – ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠΎΠ΄

ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ схСмС, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли любой ΠΎΠ΄ΠΈΠ½ класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒΡΡ. Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, это – Π²Π΅Ρ€Π½ΠΎ. ΠžΡ‡Π΅Π½ΡŒ интСрСсно Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΠΎΡ‚ самый ΠΏΡ€Π΅Π΄Π΅Π», Ρ‚Ρƒ Ρ‡Π΅Ρ€Ρ‚Ρƒ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ OCP Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС, Ρ‡Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, ΠΈΠ»ΠΈ ΠΆΠ΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ слишком большими.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ прогрСсс Π·Π°ΠΊΠ°Ρ‡ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π° основных класса - Progress ΠΈ File.

    public function testItCanGetTheProgressOfAFileAsAPercent()
    {
        $file = new File();
        $file->length = 200;
        $file->sent = 100;
     
        $progress = new Progress($file);
     
        $this->assertEquals(50, $progress->getAsPercent());
    }

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π» использован Progress. Π’ качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…, нСзависимо ΠΎΡ‚ фактичСского Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°. Класс File Π±Ρ‹Π» использован Π² качСствС источника ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для класса Progress. Π£ Ρ„Π°ΠΉΠ»Π° Π΅ΡΡ‚ΡŒ опрСдСлСнная Π΄Π»ΠΈΠ½Π° Π² Π±Π°ΠΉΡ‚Π°Ρ… ΠΈ ΠΏΠΎΠ»Π΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ sent, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдоставляСт объСм Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΡƒ. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ эти значСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. МоТно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сущСствуСт нСкая волшСбная Π»ΠΎΠ³ΠΈΠΊΠ°, которая это ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚, поэтому Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ просто ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ.

<?php

class File
{
    public $length;
    public $sent;
}

Класс File – это простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащий 2 поля. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ содСрТимоС ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, имя Ρ„Π°ΠΉΠ»Π°, ΠΏΡƒΡ‚ΡŒ ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ, дирСктория, Ρ‚ΠΈΠΏ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

<?php

class Progress
{
    private $file;
 
    public function __construct(File $file)
    {
        $this->file = $file;
    }
 
    public function getAsPercent()
    {
        return $this->file->sent * 100 / $this->file->length;
    }
}

ΠŸΡ€ΠΎΡ‰Π΅ говоря, Progress – это класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ File Π² конструкторС. Для ясности Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… конструктора. БущСствуСт СдинствСнный ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Progress, это - getAsPercent(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ отправляСмыС значСния ΠΈ Π΄Π»ΠΈΠ½Ρƒ ΠΈΠ· File ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ всС Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Ρ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎ, понятно ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Testing started at 5:39 PM ...
PHPUnit 3.7.28 by Sebastian Bergmann.
.
Time: 15 ms, Memory: 2.50Mb
OK (1 test, 1 assertion)

Код выглядит ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΎΠ½ всС Ρ€Π°Π²Π½ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости. Но, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

ИзмСнСниС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ

Π’ΠΏΠΎΠ»Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ появится Π½ΡƒΠΆΠ΄Π° Π² Π½ΠΎΠ²Ρ‹Ρ… функциях. Одной ΠΈΠ· Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ нашСго прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΊΠ°Ρ‡ΠΊΠ° ΠΌΡƒΠ·Ρ‹ΠΊΠΈ, Π½ΠΎ ΠΈ Π΅Π΅ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅. Π”Π»ΠΈΠ½Π° File прСдставлСна Π² Π±Π°ΠΉΡ‚Π°Ρ…, Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΡƒΠ·Ρ‹ΠΊΠΈ – Π² сСкундах. Π‘Π»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ прогрСсса, Π½ΠΎ нСльзя Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ?

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π½Π΅Ρ‚, нСльзя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наш прогрСсс ΡƒΠΆΠ΅ связан с File ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎ Π½Π΅ измСнится Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ смоТСм ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ для распознавания ΠΌΡƒΠ·Ρ‹ΠΊΠΈ. Но для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ появилось распознаваниС ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Progress ΠΈΠΌΠ΅Π» прСдставлСниС ΠΎ Music ΠΈ ΠΎ File. Если Π±Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ соотвСтствовало ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ OCP, Ρ‚ΠΎ File ΠΈΠ»ΠΈ Progress Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ, Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ прогрСсса ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»Π΅Π³ΠΊΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ ΠΌΡƒΠ·Ρ‹ΠΊΠ΅.

РСшСниС 1: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρƒ PHP

Π£ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков Π΅ΡΡ‚ΡŒ прСимущСство: ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² процСссС исполнСния. Π­Ρ‚ΠΎ позволяСт Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π² конструкторС Progress с Π²ΠΏΠΎΠ»Π½Π΅ работоспособным ΠΊΠΎΠ΄ΠΎΠΌ.

<?php

class Progress
{
    private $file;
 
    public function __construct($file)
    {
        $this->file = $file;
    }
 
    public function getAsPercent()
    {
        return $this->file->sent * 100 / $this->file->length;
    }
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Progress ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ.

<?php

class Music
{
    public $length;
    public $sent;
 
    public $artist;
    public $album;
    public $releaseDate;
 
    public function getAlbumCoverFile()
    {
        return 'Images/Covers/' . $this->artist . '/' . $this->album . '.png';
    }
}

И класс Music Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

    public function testItCanGetTheProgressOfAMusicStreamAsAPercent()
    {
        $music = new Music();
        $music->length = 200;
        $music->sent = 100;
     
        $progress = new Progress($music);
     
        $this->assertEquals(50, $progress->getAsPercent());
    }

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, любоС ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠΎΠ΅ содСрТаниС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с классом Progress. МоТно Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ это Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π΅Π΅ имя:

<?php

class Progress
{
    private $measurableContent;
 
    public function __construct($measurableContent)
    {
        $this->measurableContent = $measurableContent;
    }
 
    public function getAsPercent()
    {
        return $this->measurableContent->sent * 100 / $this->measurableContent->length;
    }
 
}

ВсС, каТСтся, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ, Π½ΠΎ Π² этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° громадная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Когда File Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ Π² Ρ€ΠΎΠ»ΠΈ опрСдСлитСля Ρ‚ΠΈΠΏΠ°, ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ класс Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€Π΅ΠΏΡ‡Π°Π»Π°. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π° ΠΎ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ нСточностях ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ простая ошибка.

Argument 1 passed to Progress::__construct()
must be an instance of File,
instance of Music given.

ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±Ρ‹Π» Π±Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π² ΠΎΠ±ΠΎΠΈΡ… случаях, Π½ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ сообщСниС. ΠŸΡ€Π°Π²Π΄Π°, ΠΎΡ‡Π΅Π½ΡŒ нСясноС. НСт способа ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π² нашСм случаС это - строка) Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ свойств ΠΈΠ»ΠΈ ΠΎΠ½ΠΈ просто Π½Π΅ Π±Ρ‹Π»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ Π΄Π΅Π±Π°Π³ΠΈΠ½Π³ Π² этом случаС становятся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: программисту приходится ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ класс Progress ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΏΠΎ повСдСнию Progress, Π° Ссли Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ‚ΠΎ благодаря доступу ΠΊ полям sent ΠΈ length Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ getAsPercent(). Но Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ всС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС.

ПодобноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ нСльзя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ (Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ слишком большиС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠΏΡ€Π°Π²Π΄Π°ΡŽΡ‚ усилий).

РСшСниС 2: БтратСгия ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² проСктирования

Π­Ρ‚ΠΎ – Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнноС ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ доступноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для соотвСтствия OCP, простой ΠΈ эффСктивный ΠΌΠ΅Ρ‚ΠΎΠ΄.

Π¨Π°Π±Π»ΠΎΠ½ БтратСгия ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ интСрфСйс. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ – это особый Ρ‚ΠΈΠΏ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ классом сСрвСра. Оба класса Π±ΡƒΠ΄ΡƒΡ‚ вСсти сСбя Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ.

<?php

interface Measurable
{
    public function getLength();
    public function getSent();
}

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

    public function testItCanGetTheProgressOfAFileAsAPercent()
    {
        $file = new File();
        $file->setLength(200);
        $file->setSent(100);
     
        $progress = new Progress($file);
     
        $this->assertEquals(50, $progress->getAsPercent());
    }

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, сначала ΠΏΠΎΠΉΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π³Π΄Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сСттСрами для установки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠšΡΡ‚Π°Ρ‚ΠΈ, сСттСры Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² нашСм ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ интСрфСйсС (Measurable), Π½ΠΎ Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ‚ΡƒΠ΄Π° прописываСтС. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ для опрСдСлСния ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ клиСнтским классом Progress ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ сСрвСрными классами File ΠΈ Music.

НуТно Π»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ значСния для Progress? ВСроятно, Π½Π΅Ρ‚. Вряд Π»ΠΈ Π²Π°ΠΌ придСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ сСттСры Π² интСрфСйсС, Π½ΠΎ Ссли Π²Ρ‹ всС ΠΆΠ΅ Ρ€Π΅ΡˆΠΈΡ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚ΠΎ заставитС всС сСрвСрныС классы Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с сСттСрами. Одним ΠΈΠ· Π½ΠΈΡ… Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ сСттСры, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ вСсти сСбя Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ нСпрСдсказуСмо. Π§Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Progress ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π» Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ ΠΏΠ΅Ρ‡ΠΈ? Класс OvenTemperature ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ со значСниями Π² конструкторС ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ класса. Но ΠΈΠΌΠ΅Ρ‚ΡŒ здСсь сСттСры – это странно.

<?php

class File implements Measurable
{
    private $length;
    private $sent;
 
    public $filename;
    public $owner;
 
    public function setLength($length)
    {
        $this->length = $length;
    }
 
    public function getLength()
    {
        return $this->length;
    }
 
    public function setSent($sent)
    {
        $this->sent = $sent;
    }
 
    public function getSent()
    {
        return $this->sent;
    }
 
    public function getRelativePath()
    {
        return dirname($this->filename);
    }
 
    public function getFullPath()
    {
        return realpath($this->getRelativePath());
    }
}

Класс File Π±Ρ‹Π» слСгка ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ трСбованиям Π²Ρ‹ΡˆΠ΅, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Measurable; Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ сСттСры ΠΈ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ для ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹. А класс Music Π½Π° Π½Π΅Π³ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ.

<?php

class Progress
{
    private $measurableContent;
 
    public function __construct(Measurable $measurableContent)
    {
        $this->measurableContent = $measurableContent;
    }
 
    public function getAsPercent()
    {
        return $this->measurableContent->getSent() * 100 / $this->measurableContent->getLength();
    }
 
}

Класс Progress Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠΆΠΊΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ, ΡƒΠΊΠ°Π·Π°Π² Π² конструкторС Ρ‚ΠΈΠΏ. Наш Ρ‚ΠΈΠΏ – это Measurable (ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ). ПослС этого Ρƒ нас появляСтся явный ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. Π’ Progress всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа – ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈΡ… Π² интСрфСйсС измСрСния. ΠšΠ»Π°ΡΡΡ‹ File ΠΈ Music всСгда смогут ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ классу Progress, ΠΏΡƒΡ‚Π΅ΠΌ простого исполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² интСрфСйса: это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΊΠΎΠ³Π΄Π° класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс.

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ° ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса

Π›ΡŽΠ΄ΠΈ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ интСрфСйс с Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ слово Β«InterfaceΒ» Π² ΠΊΠΎΠ½Ρ†Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, IFile ΠΈΠ»ΠΈ FileInterface. Π­Ρ‚ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ старого ΠΎΠ±Ρ€Π°Π·Ρ†Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΎΠ½ΠΎ со старыми стандартами. Имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΈ ясно Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡΡƒΡ‚ΡŒ Π΅Π³ΠΎ содСрТимого. IDE опрСдСляСт Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Π² долю сСкунды ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ это позволяСт Π½Π°ΠΌ ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΈ поэтому, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΠ΄ΠΈΠΌ Π΄Π°Ρ‚ΡŒ имя интСрфСйсу, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅. Когда ΠΌΡ‹ Π½Π°Π·Π²Π°Π»ΠΈ интСрфСйс ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΡ‹ΠΌ (Measurable), Ρ‚ΠΎ Π΄ΡƒΠΌΠ°Π»ΠΈ ΠΎ Progress. Если Π±Ρ‹ ΠΌΡ‹ Π±Ρ‹Π»ΠΈ прогрСссом, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Ρ‹? ΠžΡ‚Π²Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ прост: Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΈ присвоили Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Measurable.

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

РСшСниС 3: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄

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

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ высокого уровня

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΆΠ΅ всС это влияСт Π½Π° Π½Π°ΡˆΡƒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ высокого уровня?Β 

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

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ Π½ΠΎΠ²Ρ‹Ρ… классов. Но соотвСтствиС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ открытости-закрытости ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ классы ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ постоянного измСнСния.

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

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

Если Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ всС ΠΏΡ€ΠΎΠ΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ интСрфСйсов, Ρ‚ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Π»ΠΎ, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ быстрыми ΠΈ Π»Π΅Π³ΠΊΠΈΠΌΠΈ. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ссли ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, скорСС всСго, это Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ снова ΠΈ здСсь ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ ΠΏΠΎΠΌΠΎΡ‡ΡŒ.

SOLID Β«LΒ»: ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков (Liskov substitution principle, LSP)

ΠŸΠΎΠ΄ΠΊΠ»Π°ΡΡΡ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° подстановки Π±Ρ‹Π»Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Π‘Π°Ρ€Π±Π°Ρ€ΠΎΠΉ Лисков Π² Π΅Π΅ Π΄ΠΎΠΊΠ»Π°Π΄Π΅ Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ 1987 Π³ΠΎΠ΄Π°, Π° спустя 7 Π»Π΅Ρ‚ – ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² соавторствС с Π”ΠΆΠ°Π½Π½Π΅Ρ‚ Π’ΠΈΠ½. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π‘Π°Ρ€Π±Π°Ρ€ΠΎΠΉ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Β«Π’ Ρ‚ΠΎΠΌ случаС, Ссли q(x) – свойство, Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ… Π½Π΅ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° T, Ρ‚ΠΎ свойство q(y) Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅Ρ€Π½Ρ‹ΠΌ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ряда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² y, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ Ρ‚ΠΈΠΏΡƒ S, ΠΏΡ€ΠΈ этом S – ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ Π½Π΅ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° T.Β»

НСкотороС врСмя спустя, послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΌ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΌ всСй пятСрки ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID Π² ΠΊΠ½ΠΈΠ³Π΅ ΠΎ быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈ послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ вСрсии ΠΊΠ½ΠΈΠ³ΠΈ ΠΎ быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ для языка программирования C#, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΒ  стал Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π°Π» сам Π ΠΎΠ±Π΅Ρ€Ρ‚ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½:

ΠŸΠΎΠ΄Ρ‚ΠΈΠΏΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹.

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

Π•ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс Vehicle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ абстрактным Π² Ρ‚ΠΎΠΌ числС, ΠΈ Π΄Π²Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

<?php

class Vehicle
{
    public function startEngine()
    {
        // Default engine start public functionality
    }
 
    public function accelerate()
    {
        // Default acceleration public functionality
    }
}

class Car extends Vehicle
{
    public function startEngine()
    {
        $this->engageIgnition();
        parent::startEngine();
    }
 
    private function engageIgnition()
    {
        // Ignition procedure
    }
}
 
class ElectricBus extends Vehicle
{
    public function accelerate()
    {
        $this->increaseVoltage();
        $this->connectIndividualEngines();
    }
 
    private function increaseVoltage()
    {
        // Electric logic
    }
 
    private function connectIndividualEngines()
    {
        // Connection logic
    }
 
}

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой ΠΈΠ· Π½ΠΈΡ…, Ссли ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Vehicle.

<?php

class Driver
{
    public function go(Vehicle $v)
    {
        $v->startEngine();
        $v->accelerate();
    }
}

А это ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ простой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблонного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° проСктирования Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ использовался ΠΈ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ открытости-закрытости.

ΠžΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΎΠΏΡ‹Ρ‚Π΅ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ открытости-закрытости, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков сильно с Π½ΠΈΠΌ связан. И Π² самом Π΄Π΅Π»Π΅, ΠΊΠ°ΠΊ сказал Π ΠΎΠ±Π΅Ρ€Ρ‚ ΠœΠ°Ρ€Ρ‚ΠΈΠ½, Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° LSP – это скрытоС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° OCP. Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ проСктирования – классичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ соблюдСния ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° подстановки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· способов соблюдСния OCP.

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° LSP

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½Π΅Π΅ ΠΈ нагляднСС, Π±ΡƒΠ΄Π΅Ρ‚ использован классичСский понятный ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

<?php

class Rectangle
{
    private $topLeft;
    private $width;
    private $height;
 
    public function setHeight($height)
    {
        $this->height = $height;
    }
 
    public function getHeight()
    {
        return $this->height;
    }
 
    public function setWidth($width)
    {
        $this->width = $width;
    }
 
    public function getWidth()
    {
        return $this->width;
    }
 
}

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с основной гСомСтричСской Ρ„ΠΎΡ€ΠΌΡ‹ – ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (Rectangle). Π­Ρ‚ΠΎ всСго лишь простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… с сСттСрами ΠΈ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π°ΠΌΠΈ для ΡˆΠΈΡ€ΠΈΠ½Ρ‹ (width) ΠΈ высоты (height). Если ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ этим ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Ρ‚ΠΎ придСтся ввСсти Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, Π² Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ – это просто ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΠΎΡ€ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс Square, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΠΉ класс Rectangle. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, каТСтся, Ρ‡Ρ‚ΠΎ подкласс – это Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ.

Но Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Square ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ Rectangle ΡƒΠΆΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ?

<?php

class Square extends Rectangle
{
    public public function setHeight($value)
    {
        $this->width = $value;
        $this->height = $value;
    }
 
    public public function setWidth($value)
    {
        $this->width = $value;
        $this->height = $value;
    }
}

ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ – это ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΈ высотой, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, рСализация Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ Π±Ρ‹Π»Π° Π±Ρ‹ Π½Π΅ совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ сСттСры, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высоту. Но ΠΊΠ°ΠΊ это повлияСт Π½Π° клиСнтский ΠΊΠΎΠ΄?

<?php

class Client
{
    public function areaVerifier(Rectangle $rect)
    {
        $rect->setWidth(5);
        $rect->setHeight(4);
 
        if($rect->area() != 20) {
            throw new Exception('Bad area!');
        }
 
        return true;
    }
}

РСально ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ клиСнтский класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚, Ссли Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ оказываСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ.

    public function area()
    {
        return $this->width * $this->height;
    }

Ну ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса Rectangle.

<?php

class LspTest extends PHPUnit_Framework_TestCase
{
    public function testRectangleArea()
    {
        $rect = new Rectangle();
        $client = new Client();
        $this->assertTrue($client->areaVerifier($rect));
    }
 
}

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого тСста ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ: ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ пустой ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для опрСдСлСния Π΅Π³ΠΎ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΈ. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Если наш класс Square опрСдСляСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Ρ‚ΠΎ Π΅Π³ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π½Π° клиСнтский areaVerifier() Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Π² матСматичСском ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Square – это всС Ρ‚ΠΎΡ‚ ΠΆΠ΅ Rectangle. Но наш Π»ΠΈ это класс?

    public function testSquareArea()
    {
        $rect = new Square();
        $client = new Client();
        $this->assertTrue($client->areaVerifier($rect));
    }

ВСстированиС ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚. А ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ появляСтся ΠΏΡ€ΠΈ запускС тСста Π²Ρ‹ΡˆΠ΅.

PHPUnit 3.7.28 by Sebastian Bergmann.
 
Exception : Bad area!
#0 /paht/: /.../.../LspTest.php(18): Client->areaVerifier(Object(Square))
#1 [internal public function]: LspTest->testSquareArea()

Π˜Ρ‚Π°ΠΊ, Π² нашСм Β«ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΒ» смыслС Square класс - это Π½Π΅ Rectangle, ΠΈΠ½Π°Ρ‡Π΅ Π±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‹ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков Π½Π°Ρ€ΡƒΡˆΠ°Π»ΠΈΡΡŒ.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ особСнно Ρ…ΠΎΡ€ΠΎΡˆ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ LSP, ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ здСсь Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ абстракциСй Π½Π°Π΄ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ. А Ссли ΠΌΡ‹ попытаСмся ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎ Ρƒ нас Π½ΠΈΠΊΠΎΠ³Π΄Π° это Π½Π΅ получится.

SOLID Β«IΒ»: ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса (interface segregation principle, ISP)

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

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ Π½Π° стартС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² нашСм ΠΌΠΎΠ΄ΡƒΠ»Π΅. ПодобноС Π½Π°Ρ‡Π°Π»ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ:

  1. большой класс Car ΠΈΠ»ΠΈ Bus Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ интСрфСйса Vehicle. Одни Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚Π°ΠΊΠΈΡ… классов ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽΡ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΈΡ… любой Ρ†Π΅Π½ΠΎΠΉ;
  2. малСнькиС классы Π²Ρ€ΠΎΠ΄Π΅ LightsControl, SpeedControl ΠΈΠ»ΠΈ RadioCD Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ вСсь интСрфСйс, Π½ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈΠΌΠΈ частСй;

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· этих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ нашСй бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ.

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ интСрфСйс Π½Π° куски, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… займСтся своСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Для ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… классов – идСально. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ интСрфСйсы, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ транспорта, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ°ΡˆΠΈΠ½Ρƒ (car) Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π²Ρ‹ΡˆΠ΅.

Но это ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ нашС восприятиС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. ВмСсто Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Car становится ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. А ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π°, Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° – ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ интСрфСйс со всСми рСализациями ΠΈ ΠΏΡƒΡΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ BusStation, HighWay, Driver ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ всС, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² (ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ часто примСнялся Π² старых прилоТСниях). ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Но Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: всС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ зависят ΠΎΡ‚ всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π Π°Π·Π²Π΅ BusStation Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ радиостанции, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Π» Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ, ΠΈΠ»ΠΈ ΠΎΡ‚ Ρ„Π°Ρ€ автобуса? НСт. Но Ρ‡Ρ‚ΠΎ, Ссли Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚? НуТно Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ обязанности. Если BusStation зависит ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ (ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…), Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Ссли измСнится ΠΎΠ΄Π½Π° ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. Π’Π°ΠΊΠΎΠ³ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ относятся ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ, Π° Π½Π΅ ΠΊ рСализациям, поэтому ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ Π² Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ… с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ интСрфСйсы Π½Π° кусочки Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ дубляТи, Π½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ интСрфСйсы – это простыС опрСдСлСния ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Π² Π½ΠΈΡ… Π½Π΅ рСализуСтся, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Π—Π΄Π΅ΡΡŒ Π΅ΡΡ‚ΡŒ прСимущСство ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сами ΠΏΠΎ сСбС. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½ΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… интСрфСйсах, ΠΈ это ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ всСх интСрфСйсов, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависят.

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

РСзюмС

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков дСмонстрируСт, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ нСльзя ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ программирования, ΠΈ ΡƒΡ‡ΠΈΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ± ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΡ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡƒΠΆΠΈΠ²Π°Π»ΠΈΡΡŒ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки дополняСт Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ интСрпрСтируСтся Π² ΠΈΡ… контСкстС.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса ΡƒΡ‡ΠΈΡ‚ нас ΡƒΠ²Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π΅Ρ‰Π΅ сильнСС, Ρ‡Π΅ΠΌ ΠΌΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅. Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊ ΠΈΡ… потрСбностям ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Π° Π½Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‚Ρƒ – ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ интСрСснСС.

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΒ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΠΎΠΉ обязанности, открытости-закрытости, подстановки, раздСлСния интСрфСйсов и инвСрсии зависимостСй – пятСрка ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ написании ΠΊΠΎΠ΄Π°.

Π₯отя Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€Π΅ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅ΠΉ ваТности ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Π²Π΅Ρ€Π½ΠΎ, Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ влияниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инвСрсии зависимостСй Π½Π° ΠΊΠΎΠ΄ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с этого, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ примСняйтС ΡƒΠΆΠ΅ ΠΊ ΠΊΠΎΠ΄Ρƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ DIP

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

  1. ΠœΠΎΠ΄ΡƒΠ»ΠΈ высокого уровня Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Оба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.
  2. Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π²Ρ‹Π΄Π΅Π»ΠΈΠ» Π ΠΎΠ±Π΅Ρ€Ρ‚ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½ Π² своСй ΠΊΠ½ΠΈΠ³Π΅ ΠΎ быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΈΠ·Π΄Π°Π» Π² вСрсии ΠΊΠ½ΠΈΠ³ΠΈ для языка C#. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй - послСдний ΠΈΠ· пятСрки ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID.

DIP Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅

Если Π²Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ, Π½Π΅ совсСм Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… программирования ΠΈ Π½Π΅ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚Π΅ ряд ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID, Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, придСтся ΠΏΡ€ΠΎΠΉΡ‚ΠΈ всС 7 ΠΊΡ€ΡƒΠ³ΠΎΠ² Π°Π΄Π°, ΠΎΡ‰ΡƒΡ‚ΠΈΡ‚ΡŒ всС Π½Π° собствСнном ΠΎΠΏΡ‹Ρ‚Π΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΊΠΎΠ΄ станСт Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID - это ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π ΠΎΠ±Π΅Ρ€Ρ‚Π° Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹, вСсь Ρ…ΠΎΠ΄ программирования. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ влияниС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ появились благодаря ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ DIP, ΠΈ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ повлияли Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя Ρ‚Ρ€ΠΈ основных Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ: HTML, PHP ΠΈ SQL. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ вСрсия ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· этих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, ΠΈΠ»ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ SQL Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ – всС это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния Π² нашСм случаС. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ информация ΠΈΠ· HTML Ρ„ΠΎΡ€ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ обСспСчит РНР.

Из этого слСдуСт ΡƒΡΡΠ½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π²Π°ΠΆΠ½ΡƒΡŽ Π²Π΅Ρ‰ΡŒ - Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ эти Ρ‚Ρ€ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… слоя:

  1. ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс,
  2. бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ,
  3. Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ сохранСниС Π΄Π°Π½Π½Ρ‹Ρ….

Π‘ΠΊΠΎΡ€ΠΎ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этих слоях. А сСйчас Π΄Π°Π²Π°ΠΉΡ‚Π΅ сосрСдоточимся Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… странных, Π½ΠΎ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ…, примСняСмых для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС.

Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ SQL ΠΊΠΎΠ΄ Π² Ρ‚Π΅Π³Π°Ρ… PHP Π²Π½ΡƒΡ‚Ρ€ΠΈ HTML-Ρ„Π°ΠΉΠ»Π°. Или PHP-ΠΊΠΎΠ΄ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈ страницы HTML, ΠΈ нСпосрСдствСнно ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ $_GET ΠΈΠ»ΠΈ $_POST. Казалось Π±Ρ‹, всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Но Π²Β Ρ‡Π΅ΠΌ ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°?

На ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° сырая вСрсия Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ описывали Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π°Π±Π·Π°Ρ†Π΅. Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ зависимости, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ всС базируСтся Π½Π° всСм, всС зависит ΠΎΡ‚ всСго. Если Π½Π°ΠΌ придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, скорСС всСго, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ HTML-Ρ„Π°ΠΉΠ»Π°. Или Ссли ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅ Π² HTML, Ρ‚ΠΎ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ столбца Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ SQL. Или, ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠΉ схСмы, Π½Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ придСтся сильно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ наш PHP, Ссли измСнится HTML. А Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС, Ссли ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ вСсь HTML-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΈΠ· PHP-Ρ„Π°ΠΉΠ»Π°, скорСС всСго, Π½Π°ΠΌ придСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ PHP, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ HTML-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… сомнСний Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ зависимости просто Π»Π°Π²ΠΈΡ€ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ нашими классами ΠΈ модулями. Но Π½Π° этом всС Π½Π΅ заканчиваСтся: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π½Π° PHP Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… SQL.

На схСмС Π²Ρ‹ΡˆΠ΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… SQL Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ PHP-ΠΊΠΎΠ΄, сгСнСрированный с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†. Π­Ρ‚ΠΈ PHP-Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ классы ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ SQL-запросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ PHP-ΠΊΠΎΠ΄. Π­Ρ‚ΠΎΡ‚ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° вся информация Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π°, вСроятно, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ интСрфСйсу.

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

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

Π’ этой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Π΅ΡΡ‚ΡŒ нСсколько интСрСсных ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  1. ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс (Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ MVC) ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ доставки Π² нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ. БизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° сама ΠΏΠΎ сСбС довольно абстрактна, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс – само Π²ΠΎΠΏΠ»ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠΊΠΈ. Он прСдставляСт собой ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ. Ничто Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° MVC;
  2. Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ интСрСсноС наблюдСниС, сдСланноС Π½Π°ΠΌΠΈ, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ сохранСниС, Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, наш MySQL ΠΈΠ»ΠΈ PostgreSQL Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅. Π­Ρ‚ΠΎ позволяСт ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ это Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΌ. Если Π·Π°Π²Ρ‚Ρ€Π° Π½Π°ΠΌ понадобится ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ MySQL вмСстС с PostgreSQL ΠΈΠ»ΠΈ просто тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹, ΠΌΡ‹ Π»Π΅Π³ΠΊΠΎ смоТСм это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Нам, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, придСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сохраняСмости для Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сохранСния состояния, Π½ΠΎ для этого Π½Π΅ придСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ строки ΠΊΠΎΠ΄Π° Π² нашСй бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅;
  3. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Π² ΠΏΡ€Π°Π²ΠΎΠΉ части нашСй бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Π²Π½Π΅ Π΅Π΅, Ρƒ нас Π΅ΡΡ‚ΡŒ всС классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ классы бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ. Π­Ρ‚ΠΈ классы созданы ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² наши прилоТСния. МногиС люди склонны Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅, Π½ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΎΠ½ΠΈ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ бизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Они – просто классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы. БизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚, Π½Π΅ зависят ΠΎΡ‚ Π½ΠΈΡ…. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ. Π­Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ бизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ созданы, ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊ ΠΊΠΎΠ΄Ρƒ

Π‘ΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (DIP) Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ довольно Π»Π΅Π³ΠΊΠΎ, Ссли Π²Ρ‹ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚Π΅ классичСскиС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ это Π²Π½ΡƒΡ‚Ρ€ΠΈ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ достаточно просто, Π° мСстами - Π΄Π°ΠΆΠ΅ вСсСло. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ сСбС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для чтСния элСктронных ΠΊΠ½ΠΈΠ³.

<?php

class Test extends PHPUnit_Framework_TestCase
{
    public function testItCanReadAPDFBook()
    {
        $book = new PDFBook();
        $reader = new PDFReader($book);
 
        $this->assertRegExp('/pdf book/', $reader->read());
    }
}
 
class PDFReader
{
    private $book;
 
    public function __construct(PDFBook $book)
    {
        $this->book = $book;
    }
 
    public function read()
    {
        return $this->book->read();
    }
 
}
 
class PDFBook
{
    public function read()
    {
        return "reading a pdf book.";
    }
}

ΠœΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ элСктронной Ρ‡ΠΈΡ‚Π°Π»ΠΊΠΈ ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Π»ΠΊΠΈ PDF. Пока Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π£ нас Π΅ΡΡ‚ΡŒ класс PDFReader, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ PDFBook. Ѐункция read() Π² Ρ‡ΠΈΡ‚Π°Π»ΠΊΠ΅ относится ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ read(). Π’ этом ΠΌΡ‹ убСдимся ΠΏΡƒΡ‚Π΅ΠΌ рСгулярной ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ элСмСнта строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ PDFBook's reader().

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это всСго лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠœΡ‹ Π½Π΅ станСм Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ чтСния PDF-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ². Наши тСсты – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… строках. Если Π±Ρ‹ ΠΌΡ‹ писали настоящСС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, СдинствСнная Ρ€Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π±Ρ‹ Π² способС тСстирования Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ². Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° зависимости Π±Ρ‹Π»Π° Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

ИспользованиС Ρ‡ΠΈΡ‚Π°Π»ΠΊΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° PDF, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ½ΠΈΠ³Ρƒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ PDF, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ Π·Π΄Ρ€Π°Π²Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π² рядС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… случаСв. Если наша Π·Π°Π΄Π°Ρ‡Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Π»ΠΊΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° PDF, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ фактичСски соотвСтствуСт Π·Π°Π΄Π°Ρ‡Π΅. Но ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ‡ΠΈΡ‚Π°Π»ΠΊΡƒ, которая использовала Π±Ρ‹ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС, ΠΈ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ PDF-Π²Π΅Ρ€ΡΠΈΡŽ. ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌ класс нашСй Ρ‡ΠΈΡ‚Π°Π»ΠΊΠΈ.

<?php

class Test extends PHPUnit_Framework_TestCase
{
    public function testItCanReadAPDFBook()
    {
        $b = new PDFBook();
        $r = new EBookReader($b);
 
        $this->assertRegExp('/pdf book/', $r->read());
    }
}
 
class EBookReader
{
    private $book;
 
    public function __construct(PDFBook $book)
    {
        $this->book = $book;
    }
 
    public function read()
    {
        return $this->book->read();
    }
}
 
class PDFBook
{
    public function read()
    {
        return "reading a pdf book.";
    }
}

ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π΄Π°Π»ΠΎ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… эффСктов. ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½ Π½Π° Β«ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΒ».

Testing started at 1:04 PM ...
PHPUnit 3.7.28
Time: 13 ms, Memory: 2.50Mb
OK (1 test, 1 assertion)
Process finished with exit code 0

Наша Ρ‡ΠΈΡ‚Π°Π»ΠΊΠ° ΡƒΠΆΠ΅ стала Π³ΠΎΡ€Π°Π·Π΄ΠΎ абстрактнСС. Намного ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π΅Π΅. БСйчас Ρƒ нас Π΅ΡΡ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ EBookReader, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ довольно спСцифичСский Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΊΠ½ΠΈΠ³ – PDFBook. Наша абстракция зависит ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π’ΠΎ, Ρ‡Ρ‚ΠΎ наша ΠΊΠ½ΠΈΠ³Π° находится Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ PDF – всС лишь Π΄Π΅Ρ‚Π°Π»ΡŒ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ.

<?php

class Test extends PHPUnit_Framework_TestCase
{
    public function testItCanReadAPDFBook()
    {
        $book = new PDFBook();
        $reader = new EBookReader($book);
 
        $this->assertRegExp('/pdf book/', $reader->read());
    }
 
}
 
interface EBook
{
    public function read();
}
 
class EBookReader
{
    private $book;
 
    public function __construct(EBook $book)
    {
        $this->book = $book;
    }
 
    public function read()
    {
        return $this->book->read();
    }
 
}
 
class PDFBook implements EBook
{
    public function read()
    {
        return "reading a pdf book.";
    }
}

НаиболСС популярным ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, являСтся Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ абстрактного модуля Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. НаиболСС абстрактным элСмСнтом Π² ООП являСтся интСрфСйс. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ интСрфСйса, ΠΈ всС Π΅Ρ‰Π΅ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ DIP.

ΠœΡ‹ создали интСрфСйс для нашСй Ρ‡ΠΈΡ‚Π°Π»ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π·Π²Π°Π»ΠΈ EBookReader, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ всС потрСбности EBook. Π­Ρ‚ΠΎ – прямой Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ соблюдСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° раздСлСния интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ основываСтся Π½Π° ΠΈΠ΄Π΅Π΅, Ρ‡Ρ‚ΠΎ интСрфСйсы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ потрСбности ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ относятся ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ хотят ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Для EBookReader Π²ΠΏΠΎΠ»Π½Π΅ СстСствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ EBook ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ read().

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вмСсто СдинствСнной зависимости, Ρƒ нас ΠΈΡ… становится Π΄Π²Π΅.

  1. ΠŸΠ΅Ρ€Π²Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ EBookReader ΠΊ интСрфСйсу EBook ΠΈ Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ. EBookReader ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ EBook.
  2. Вторая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΡƒΠΆΠ΅ нСсколько Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π°. Она ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ PDFBook ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ интСрфСйсу EBook, Π½ΠΎ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ. PDFBook – это просто особая Ρ„ΠΎΡ€ΠΌΠ° EBook, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ потрСбности ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

ΠΠ΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, вСдь Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π² нашСй Ρ‡ΠΈΡ‚Π°Π»ΠΊΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ элСктронных ΠΊΠ½ΠΈΠ³. ЕдинствСнноС условиС для всСх этих ΠΊΠ½ΠΈΠ³ – ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсу EBook ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

<?php

class Test extends PHPUnit_Framework_TestCase
{
    public function testItCanReadAPDFBook()
    {
        $book = new PDFBook();
        $reader = new EBookReader($book);
 
        $this->assertRegExp('/pdf book/', $reader->read());
    }
 
    public function testItCanReadAMobiBook()
    {
        $book = new MobiBook();
        $reader = new EBookReader($book);
 
        $this->assertRegExp('/mobi book/', $reader->read());
    }
 
}
 
interface EBook
{
    public function read();
}
 
class EBookReader
{
    private $book;
 
    public function __construct(EBook $book)
    {
        $this->book = $book;
    }
 
    public function read()
    {
        return $this->book->read();
    }
 
}
 
class PDFBook implements EBook
{
    public function read()
    {
        return "reading a pdf book.";
    }
}
 
class MobiBook implements EBook
{
    public function read()
    {
        return "reading a mobi book.";
    }
}

ВсС это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ открытости-закрытости, ΠΈ ΠΊΡ€ΡƒΠ³ замыкаСтся. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΌ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈΠ· пятСрки SOLID. Боблюдая ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ DIP, ΠΌΡ‹ практичСски Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ OCP, ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ обязанности, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ интСрфСйсы.

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ мысли

Ну, Π²ΠΎΡ‚ ΠΈ всС, ΠΌΡ‹ Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ всС ΠΌΠ°Π½ΡƒΠ°Π»Ρ‹ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… SOLID. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ваши прСдставлСния ΠΎΠ± Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ интСрСснСС. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ Π΄Π΅Π»Π°Ρ‚ΡŒ наш ΠΊΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту пятСрку.

Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ пятСрка ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID – ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… стСрТнСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅, Π° Тизнь программистов - ΠΏΡ€ΠΎΡ‰Π΅.

About

SOLID principles of Object Oriented Design (Ru)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published