ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ объяснСниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID β€” это стандарт программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ создания ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. Π­Ρ‚ΠΎΡ‚ стандарт ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ООП. Если ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΌ, Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Когда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ создаёт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΡƒΡΡΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ, ΠΊΠΎΠ΄ получаСтся Π½Π΅Π³ΠΈΠ±ΠΊΠΈΠΌ, Π΄Π°ΠΆΠ΅ нСбольшиС измСнСния Π² Π½Ρ‘ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Π±Π°Π³Π°ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ SOLID.

На ΠΈΡ… освоСниС потрСбуСтся ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя, Π½ΠΎ Ссли Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² соотвСтствии с этими ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ, Ρ‚ΠΎ Π΅Π³ΠΎ качСство повысится, Π° Π²Ρ‹ освоитС созданиС Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ПО.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID, Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‘Ρ‚ΠΊΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсы. Если Ρƒ вас Ρ‚Π°ΠΊΠΎΠ³ΠΎ понимания Π½Π΅Ρ‚, Ρ‚ΠΎ сначала ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

Π― Π±ΡƒΠ΄Ρƒ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ SOLID самым простым способом, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ Π»Π΅Π³Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ. Π‘ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ.

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

БущСствуСт лишь ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, приводящая ΠΊ измСнСнию класса.

Один класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΎΠ΄Π½Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ лишь для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ. Если класс ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ классы.

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ здСсь класс Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π±Π°Π·Ρ‹? Π­Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° для уровня хранСния Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…). Π­Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π΅ этого класса.

Π’Π°ΠΊΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ класс Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, XML, JSON, HTML ΠΈ Ρ‚.Π΄.

Код послС Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ сущности Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

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

Как ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ? Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅:

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

ΠŸΡƒΡΡ‚ΡŒ Ο†(x) β€” Π΄ΠΎΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΠ΅ свойство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° x Ρ‚ΠΈΠΏΠ° T. Π’ΠΎΠ³Π΄Π° Ο†(y) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Π΅Ρ€Π½Ρ‹ΠΌ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² y Ρ‚ΠΈΠΏΠ° S, Π³Π΄Π΅ S β€” ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ T.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ссылок Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов, Π΄Π°ΠΆΠ΅ Π½Π΅ зная ΠΎΠ± этом.

ΠŸΠΎΠΏΡ€ΠΎΡΡ‚Ρƒ говоря: подкласс/ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ взаимозамСняСм с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ/Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ классом.

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

Π’ этом ΠΊΠΎΠ΄Π΅ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ обсуТдаСмый ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ способ исправлСния:

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

НСльзя Π·Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ интСрфСйсы Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅, Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ потрСбностям ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

Как ΠΈ Π² случаС с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ СдинствСнной отвСтствСнности, Ρ†Π΅Π»ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° раздСлСния интСрфСйса Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ² Π·Π° счёт раздСлСния ПО Π½Π° нСзависимыС части.

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

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

Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ подробностСй. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

ΠŸΡ€ΠΎΡ‰Π΅ говоря: Π·Π°Π²ΠΈΡΡŒΡ‚Π΅ ΠΎΡ‚ абстракций, Π° Π½Π΅ ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΎΠ΄Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, всСго лишь мСняя ΠΌΠΎΠ΄ΡƒΠ»ΡŒ зависимости, ΠΈ Ρ‚ΠΎΠ³Π΄Π° Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‹ Π² Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΡŽΡ‚ Π½Π° высокоуровнСвый.

Π•ΡΡ‚ΡŒ распространённоС Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ «инвСрсия зависимостСй» являСтся синонимом «внСдрСния зависимостСй». Но это Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ.

Класс PasswordReminder Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций, Π° Π½Π΅ ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ. Но ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ SOLID β€” открытости/закрытости. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° эту Ρ‚Π΅ΠΌΡƒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» сайт webdevblog.ru.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости:

β€œΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚. Π΄.) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для модификации”

Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚? Как ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ!

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ рассмотрСниС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ сцСнарий, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ ΠΈ тСхничСским дСталям.

Допустим Π²Ρ‹ написали свой класс для просмотра Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ PhotoViewer ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JPEG. ПозТС Π²Ρ‹ поняли, Ρ‡Ρ‚ΠΎ ваши ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ постоянно ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ PNG-Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка. Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ стал ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ PNG.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊΠΎΠ²Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ вашСго ΠΊΠΎΠ΄Π° послС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ?

Π§Ρ‚ΠΎ, Ссли Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ? Π§Ρ‚ΠΎ Π½Π° 100% ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сСйчас ΠΈΠ»ΠΈ Ρ‚ΠΎΠ³Π΄Π°?

Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ else if. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ openPhoto слишком большой. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Ρ‚ΠΈΠΏΡ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… строк ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ сбою Π΄Ρ€ΡƒΠ³ΠΈΡ….

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ функциями. Но Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ добавляСтС Ρ‚ΠΈΠΏ, Π²Ρ‹ измСняСтС строки ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ openPhoto. МногиС измСнСния Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, ΠΊΠ°ΠΊ Π½Π°ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ JPEG ΠΈ PNG Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² классС просмотра Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ? Ну Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ваш ΠΊΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, добавляя Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° всС Π΅Ρ‰Π΅ сущСствуСт. РСшСниС Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ Π½Π° 100% для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ измСнСния коснутся всСх строк ΠΊΠΎΠ΄Π° класса. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΊ классу PhotoViewer сдСлаСт Π΅Π³ΠΎ большС ΠΈ Π²ΠΎΠ·Π»ΠΎΠΆΠΈΡ‚ Π½Π° Π½Π΅Π³ΠΎ большС обязанностСй. Π­Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности.

РСшСниС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования с использованиСм ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса для прСдставлСния ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строчки исходного ΠΊΠΎΠ΄Π°. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ с Π½ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ просмотра Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ.

РСшСниС Π½Π° 100% ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ примСняСтся ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Open-Closed ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния измСнСния исходного ΠΊΠΎΠ΄Π°.

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ SOLID: ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости β€” The Open Closed Principle ΠΈΠ»ΠΈ OCP β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· пяти основных ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования ΠΈ проСктирования, сформулированных Π ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΌ ΠœΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΌ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ сущности (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚. ΠΏ.) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для измСнСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ эти сущности ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ своС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Π΅Π· измСнСния ΠΈΡ… исходного ΠΊΠΎΠ΄Π°.

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

Π‘Π»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ OCP Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС измСняСтся Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Π° Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ созданный ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ΄ остаётся Β«Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΌΒ» ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, Π° новая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ внСдряСтся Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· наслСдованиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· использованиС абстрактных интСрфСйсов ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ.

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

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

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости

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

Как Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π² сСти для этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°: классы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. А?? Π§Ρ‚ΠΎΠΎ?? Π’Ρ‹ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ поняли? Π”Π°, я Ρ‚ΠΎΠΆΠ΅ Π½Π΅ особо, ΠΊΠΎΠ³Π΄Π° Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ столкнулся с этим, Π½ΠΎ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ я ΠΏΡ€ΠΈΡˆΠ΅Π» ΠΊ пониманию: ΠΊΠΎΠ΄, написанный ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмыЧто Π²Ρ‹ мСня Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅.

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

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

β€œΠ Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅β€ здСсь ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, происходит Π»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… классов, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы хранят экзСмпляры класса ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

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

ИмСя это Π² Π²ΠΈΠ΄Ρƒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΎΠ΄Π½Ρƒ Ρ‚Π°ΠΊΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для прСобразования Π΄Π°Π½Π½ΠΎΠ³ΠΎ HTML-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, счСта-Ρ„Π°ΠΊΡ‚ΡƒΡ€Ρ‹?) Π² PDF-Ρ„Π°ΠΉΠ», Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ платная подписка Π½Π° гипотСтичСский сСрвис ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ MilkyWay, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ PDF. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΡ‚:

Π― пропустил ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ запроса ΠΈ Ρ‚. Π΄., Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΌ вопросС. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ воспользовались совСтами ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΡƒΡ€ΠΎΠΊΠ° ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности: SOLID ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Laravel. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π° сСрвис MilkyWay. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ входящСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π° гСнСрируСтся ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ гСнСрируСтся. Π’ отвСтствСнности ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° лишь ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ сСрвису ΠΈ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Но Π΅ΡΡ‚ΡŒ нСбольшая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы

Наш ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° слишком зависит ΠΎΡ‚ класса MilkyWay. Если ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ вСрсия API MilkyWay ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ интСрфСйс, наш ΠΌΠ΅Ρ‚ΠΎΠ΄ пСрСстанСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. И Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСрвис, Π½Π°ΠΌ придСтся Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ поиск Π² нашСм Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΊΠΎΠ΄Π° ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ MilkyWay. И ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΏΠ»ΠΎΡ…ΠΎ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ошибки ΠΈ являСтся Π±Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ для бизнСса (врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° тратится Π½Π° Ρ€Π°Π·Π±ΠΎΡ€ΠΊΡƒ Π±Π°Ρ€Π΄Π°ΠΊΠ°).

ВсС это напрасно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создали ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±Ρ‹Π» Π·Π°ΠΊΡ€Ρ‹Ρ‚ для измСнСния.

МоТСм Π»ΠΈ ΠΌΡ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅?

Π’ этом случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ, которая ΠΈΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ – ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ интСрфСйсы, Π° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

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

Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ этого Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС наши классы PDF содСрТали:

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ здСсь?

Π§Π΅Ρ€Π΅Π· этот интСрфСйс ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС наши классы PDF Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ эти Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (MilkyWay, Π² нашСм случаС), Π½Π΅ слСдуСт этому интСрфСйсу, наша Π·Π°Π΄Π°Ρ‡Π° – Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ класс (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ АдаптСр), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ это Π΄Π΅Π»Π°Π΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ набросок Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ класс – Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ для нашСго MilkyWay сСрвиса, выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ всС это связано с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ β€œΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ-закрыто” ΠΈ Laravel?

А ΠΏΠΎΠΊΠ° просто Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± этом ΠΊΠ°ΠΊ ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для нас Π½ΠΎΠ²Ρ‹Π΅ экзСмпляры классов. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

Π’ сСрвисном ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

Π’ΠΎΠΎΡ€ΡƒΠΆΠΈΠ²ΡˆΠΈΡΡŒ всСми этими знаниями, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ наш ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ PDF ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Бамая большая Π²Ρ‹Π³ΠΎΠ΄Π° ΠΈΠ· всСх

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ устойчив ΠΊ измСнСниям. ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π·Π°Π²Ρ‚Ρ€Π° ΠΌΡ‹ почувствуСм, Ρ‡Ρ‚ΠΎ сСрвис MilkyWay слишком Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ (ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ это часто Π±Ρ‹Π²Π°Π΅Ρ‚, ΠΈΡ… клиСнтская ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° стала Π΄Π΅Ρ€ΡŒΠΌΠΎΠ²ΠΎΠΉ); Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСрвис, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ SilkyWay ΠΈ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π½Π΅ΠΌΡƒ. ВсС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ PDFGenerator класс-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ SilkyWay ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ привязку Π² нашСм ΠΊΠΎΠ΄Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° слуТбы:

Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ написано Π½Π° интСрфСйсах (интСрфСйс PDFGenerator), Π° Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… рСализациях. БизнСс-Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ измСнилось, Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ (класс ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ), ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° строка ΠΊΠΎΠ΄Π° Π±Ρ‹Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° β€” всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ΠΌ, ΠΈ вся ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ спокойно ΠΈΠ΄Ρ‚ΠΈ Π΄ΠΎΠΌΠΎΠΉ ΠΈ ΡΠΏΠ°Ρ‚ΡŒ спокойно.

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΏΠ°Ρ‚ΡŒ спокойно? Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ β€œΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ-закрыто”! 🤭😆

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€! ΠŸΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π° Open-Closed Principle, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» Π² январС 1996 Π³ΠΎΠ΄Π°. Π‘Ρ‚Π°Ρ‚ΡŒΡ, мягко говоря, Π½Π΅ самая свСТая. Но Π² Ρ€ΡƒΠ½Π΅Ρ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ дяди Π‘ΠΎΠ±Π° ΠΏΡ€ΠΎ SOLID ΠΏΠ΅Ρ€Π΅ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡƒΡ€Π΅Π·Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, поэтому я ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ лишним Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы

Π― Ρ€Π΅ΡˆΠΈΠ» Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π±ΡƒΠΊΠ²Ρ‹ O, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости, ΠΏΠΎ сути, являСтся Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌ. Π‘Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Ρ‹Ρ… тонкостСй, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

Π­Ρ‚ΠΎ пСрвая ΡΡ‚Π°Ρ‚ΡŒΡ Π² ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ Π˜Π½ΠΆΠ΅Π½Π΅Ρ€Π° для The C++ Report. Π‘Ρ‚Π°Ρ‚ΡŒΠΈ, ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌΡ‹Π΅ Π² этой ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅, Π±ΡƒΠ΄ΡƒΡ‚ Ρ„ΠΎΠΊΡƒΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° использовании C++ ΠΈ ООП ΠΈ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Ρ‚ΡŒ слоТности Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ПО. Π― ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΡ€Π°Π³ΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΡŽΡ‰ΠΈΡ… ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ². Для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π² этих ΡΡ‚Π°Ρ‚ΡŒΡΡ… я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π‘ΡƒΡ‡Π°.

Π‘ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ связано ΠΌΠ½ΠΎΠ³ΠΎ эвристик. НапримСр, «всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ (member variables) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ (private)Β», ΠΈΠ»ΠΈ «слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…Β», ΠΈΠ»ΠΈ Β«ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя исполнСния опасно». Π’ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚Π°ΠΊΠΈΡ… эвристик? ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ ΠΏΡ€Π°Π²Π΄ΠΈΠ²Ρ‹? ВсСгда Π»ΠΈ ΠΎΠ½ΠΈ ΠΏΡ€Π°Π²Π΄ΠΈΠ²Ρ‹? Π’ этой ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ исслСдуСтся ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ проСктирования, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Π² основС этих эвристик, β€” ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости.
Π˜Π²Π°Ρ€ Якобсон сказал: «ВсС систСмы ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² процСссС ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ систСмы, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ оТидаСтся большС ΠΎΠ΄Π½ΠΎΠΉ вСрсии». Как ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСму, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° устойчива ΠΏΠ΅Ρ€Π΅Π΄ Π»ΠΈΡ†ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ оТидаСтся большС Ρ‡Π΅ΠΌ ΠΎΠ΄Π½Π° вСрсия? Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ ΠœΠ΅ΠΉΠ΅Ρ€ рассказал Π½Π°ΠΌ ΠΎΠ± этом Π΅Ρ‰Π΅ Π² Π΄Π°Π»Π΅ΠΊΠΎΠΌ 1988 Π³ΠΎΠ΄Ρƒ, ΠΊΠΎΠ³Π΄Π° сформулирован Π·Π½Π°ΠΌΠ΅Π½ΠΈΡ‚Ρ‹ΠΉ Π½Ρ‹Π½Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости:

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½Ρ‹Π΅ сущности (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.Π΄.) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Если ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой каскад ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² зависимых модулях, Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ Β«ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎΒ» Π΄ΠΈΠ·Π°ΠΉΠ½Π°.

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

ОписаниС

ΠœΠΎΠ΄ΡƒΠ»ΠΈ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ открытости-закрытости, ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π²Π° Π³Π»Π°Π²Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°:

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° этих ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π΅ вяТутся. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ способ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ модуля β€” внСсти Π² Π½Π΅Π³ΠΎ измСнСния. ΠœΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ мыслится ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с фиксированным ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Как ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ эти Π΄Π²Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Ρ… условия?

ΠšΠ»ΡŽΡ‡ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ β€” абстракция

Π’ Π‘++, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ проСктирования, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ фиксированныС абстракции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΉ.

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы
Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы
ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚

Абстракция Shape

Рассмотрим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠ³ΠΈ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ Π² стандартном GUI. ΠšΡ€ΡƒΠ³ΠΈ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ нарисованы Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС. Π’ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ порядкС Π±ΡƒΠ΄Π΅Ρ‚ составлСн список ΠΊΡ€ΡƒΠ³ΠΎΠ² ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ², ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ Π² этом порядкС ΠΏΠΎ списку ΠΈ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³ ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

На C, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ программирования, Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ открытости-закрытости, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° листингС 1. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ мноТСство структур Π΄Π°Π½Π½Ρ‹Ρ… с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом. Π­Ρ‚ΠΎΡ‚ элСмСнт β€” ΠΊΠΎΠ΄ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ ΠΊΡ€ΡƒΠ³ ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚. Ѐункция DrawAllShapes ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ массиву ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° эти структуры Π΄Π°Π½Π½Ρ‹Ρ…, узнавая ΠΊΠΎΠ΄ Ρ‚ΠΈΠΏΠ° ΠΈ Π·Π°Ρ‚Π΅ΠΌ вызывая ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ( DrawCircle ΠΈΠ»ΠΈ DrawSquare ).

Ѐункция DrawAllShapes Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ открытости-закрытости, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Β«Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°Β» ΠΎΡ‚ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€. Если Π±Ρ‹ я Π·Π°Ρ…ΠΎΡ‚Π΅Π» Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΈΠ· списка, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, Ρ‚ΠΎ ΠΌΠ½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ЀактичСски я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ.

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ класс Shape содСрТал Π±Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². И всС ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всС Π΅Ρ‰Π΅ ΠΎΡ‡Π΅Π½ΡŒ просто, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” это ввСсти Π½ΠΎΠ²ΠΎΠ³ΠΎ наслСдника ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НС Π½ΡƒΠΆΠ½ΠΎ Ρ€Ρ‹ΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎ всСму ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π² поисках мСст, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

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

БтратСгия Π²Π²ΠΎΠ΄Π° закрытости

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π° 100% Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°. НапримСр, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ DrawAllShapes ΠΈΠ· листинга 2, Ссли ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠΌ, Ρ‡Ρ‚ΠΎ сначала Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ нарисованы ΠΊΡ€ΡƒΠ³ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹? Ѐункция DrawAllShapes Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’ Ρ†Π΅Π»ΠΎΠΌ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, насколько Β«Π·Π°ΠΊΡ€Ρ‹Ρ‚Β» ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, всСгда Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ‚ΠΈΠΏ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚.

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

ИспользованиС абстракции для Π΄ΠΎcтиТСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ закрытости

Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DrawAllShapes ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² порядкС рисования? Помним, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ базируСтся Π½Π° абстракции. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ DrawAllShapes ΠΎΡ‚ упорядочивания, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° нСкая «абстракция упорядочивания». Частный случай упорядочивания, прСдставлСнный Π²Ρ‹ΡˆΠ΅, β€” это рисованиС Ρ„ΠΈΠ³ΡƒΡ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅Π΄ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π’ C++ эта функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСна ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Β« Shape с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ сортировки.

ИспользованиС Data Driven ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° для достиТСния закрытости

Закрытости наслСдников класса Shape ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ измСнСния Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ наслСдуСмом классС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΌΡ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DrawAllShapes ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, связанных с упорядочиваниСм, ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ наслСдника класса Shape β€” ΠΎΡ‚ ввСдСния Π½ΠΎΠ²ΠΎΠ³ΠΎ наслСдника ΠΈΠ»ΠΈ ΠΎΡ‚ измСнСния Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ упорядочивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Shape Π² зависимости ΠΎΡ‚ ΠΈΡ… Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Squares Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ).

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

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

Эвристики ΠΈ ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΈ

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости-закрытости являСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠ΅ΠΉ, которая стоит Π·Π° ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ эвристиками ΠΈ конвСнциями, появившимися Π·Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π³ΠΎΠ΄Ρ‹ развития ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ООП. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ….

Π”Π΅Π»Π°ΠΉΡ‚Π΅ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌΠΈ

Π’ ООП ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” Ρ‡Π»Π΅Π½ΠΎΠ² этого класса. Однако ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ подклассы, Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ называСтся инкапсуляциСй.

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

Никаких Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… пСрСмСнных… Π²ΠΎΠΎΠ±Ρ‰Π΅!

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

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

RTTI β€” это опасно

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

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

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

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

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

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

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