πŸš€ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – самая большая ошибка ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π½Π°ΡƒΠΊ

РассказываСм, ΠΊΠ°ΠΊ ООП наносит ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΡƒΡ‰Π΅Ρ€Π± экономикС ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ€Π° ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ программирования. ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΊ Π½Π°Π΄Π²ΠΈΠ³Π°ΡŽΡ‰Π΅ΠΉΡΡ Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΈ!

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

К Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, соврСмСнноС ООП ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π»ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π΅ΠΌΡƒ нанСсти ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΡƒΡ‰Π΅Ρ€Π± экономикС – Ρ‚Ρ€ΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ² – ΠΈ Π΄Π°ΠΆΠ΅ ΡƒΠ±ΠΈΡ‚ΡŒ (Π² Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠΌ смыслС) тысячи Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ!

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ ООП Ρ‚Π°ΠΊ опасСн?

***

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡΠ°Π΄ΠΈΡ‚Π΅ΡΡŒ Π² свою Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈ Π΅Π΄Π΅Ρ‚Π΅ ΠΏΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΌΡƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ. И Π²Π΄Ρ€ΡƒΠ³ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ всСгда. Π’Ρ‹ отпускаСтС пСдаль Π³Π°Π·Π°, Π½ΠΎ машина ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΡΡ‚ΡŒΡΡ! Π”Π°Π²ΠΈΡ‚Π΅ Π½Π° Ρ‚ΠΎΡ€ΠΌΠΎΠ· – Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚!

Π‘Ρ‚Ρ€Π°ΡˆΠ½ΠΎ? ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π² 2007 Π³ΠΎΠ΄Ρƒ с Π”ΠΆΠΈΠ½ Π‘ΡƒΠΊΠ°ΡƒΡ‚ – ΠΈ Π΅Ρ‰Π΅ с сотнями Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Toyota Camry. ДСсятки Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΠΎΠ³ΠΈΠ±Π»ΠΈ.

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ссылался Π½Π° Π·Π°Π»ΠΈΠΏΠ°Π½ΠΈΠ΅ ΠΏΠ΅Π΄Π°Π»Π΅ΠΉ, чСловСчСский Ρ„Π°ΠΊΡ‚ΠΎΡ€ ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ»ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ²Ρ€ΠΈΠΊΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ истинным Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠΎΠΌ оказалось ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ.

Команда экспСртов 18 мСсяцСв Ρ€Π°Π·Π±ΠΈΡ€Π°Π»Π° ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Toyota – ΠΈ нашла сотни ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ возникновСния Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ ускорСния. Код Π² Ρ†Π΅Π»ΠΎΠΌ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ ΠΈ бСспорядочным – Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° слСнгС называСтся «спагСтти». Из-Π·Π° этого Toyota ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡ‚ΠΎΠ·Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 9 ΠΌΠ»Π½ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ ΠΈ Π²Ρ‹ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 3 ΠΌΠ»Ρ€Π΄ Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ².

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° спагСтти

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Ρ‹ Π½Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ – ΠΈ это ΠΏΡƒΠ³Π°Π΅Ρ‚. НапримСр, Π΄Π²Π° самолСта Boeing 737 Max ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈ ΠΊΡ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° ошибки, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ спагСтти-ΠΊΠΎΠ΄ΠΎΠΌ (346 ΠΆΠ΅Ρ€Ρ‚Π², 60 ΠΌΠ»Ρ€Π΄ Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ² ΡƒΡ‰Π΅Ρ€Π±Π°). Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Π°Ρ‚ΠΎΠΌΠ½ΠΎΠΉ элСктростанции ΠΈΠ»ΠΈ Π² Ρ€Π΅Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π»Π°Ρ‚Π΅.

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

Π‘ΠΏΠ°Π³Π΅Ρ‚Ρ‚ΠΈ-ΠΊΠΎΠ΄ нСпонятСн, связи ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅Π³ΠΎ частями Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹. Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ. На Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ тСсты, Π΅Π³ΠΎ слоТно Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΈ больно ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ.

ΠžΡ‚ΠΊΡƒΠ΄Π° бСрСтся спагСтти-ΠΊΠΎΠ΄?

Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ любой ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² спагСтти. По ΠΌΠ΅Ρ€Π΅ услоТнСния ΠΎΠ½ становится всС Π±ΠΎΠ»Π΅Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ, энтропия растСт – ΠΈ Π² ΠΎΠ΄ΠΈΠ½ прСкрасный ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π΄Π΅Π»ΠΎ с ΠΊΠ»ΡƒΠ±ΠΊΠΎΠΌ зависимостСй.

Π§Ρ‚ΠΎΠ±Ρ‹ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с этим Π½ΡƒΠΆΠ½Ρ‹ строгиС ограничСния, Π²Ρ€ΠΎΠ΄Π΅ ограничСния скорости Π½Π° Π΄ΠΎΡ€ΠΎΠ³Π°Ρ…. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠ΅ ограничСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ максимально Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ чСловСчСского Ρ„Π°ΠΊΡ‚ΠΎΡ€Π°. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ сама ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° программирования.

ООП – ΠΊΠΎΡ€Π΅Π½ΡŒ Π·Π»Π°

ООП Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠΎΠ΄ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅. БСзусловно, Π΅ΡΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ – Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, TDD, Domain Driven Design, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚. Однако ΠΎΠ½ΠΈ Π½Π΅ Π²Π½Π΅Π΄Ρ€Π΅Π½Ρ‹ Π² ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ, Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΅ΠΉ, ΠΈ Π½Π΅Ρ‚ инструмСнтария, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ Π±Ρ‹ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΈΡ… соблюдСниСм.

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

БсылочныС Ρ‚ΠΈΠΏΡ‹

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ участки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ структурой Π΄Π°Π½Π½Ρ‹Ρ… – ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅.

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

Но Π² соврСмСнном ООП ΠΎΠ΄Π½ΠΈ Β«ΠΊΠ»Π΅Ρ‚ΠΊΠΈΒ» ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ°ΡŽΡ‚ Π²Π½ΡƒΡ‚Ρ€ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΡ… состояниС. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ большой связанности ΠΊΠΎΠ΄Π°. ИзмСнСния Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ послСдствиям Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ

Π‘ΠΊΠ»ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΊ спагСттификации – Π½Π΅ СдинствСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ООП-ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹.

Работая с ПО ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΈ прСдсказуСмым. 2 + 2 всСгда Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ 4, Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° пСдаль Ρ‚ΠΎΡ€ΠΌΠΎΠ·Π° всСгда Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ замСдлСнию автомобиля. Π­Ρ‚ΠΎ называСтся Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒΡŽ.

Если 2+2 Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 5 хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈΠ· ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ уТасным послСдствиям.

Π’ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅, Β«Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΒ» – это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ нСсколько ΠΏΡƒΡ‚Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, – Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ уточнСния, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½.

Если эта Ρ†ΠΈΡ‚Π°Ρ‚Π° Π²Π°ΠΌ Π½Π΅ нравится, Ρ‚ΠΎ это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π² Ρ†Π΅Π»ΠΎΠΌ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ годится.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

nondet-det-func.js
console.log( 'result', computea(2) );
console.log( 'result', computea(2) );
console.log( 'result', computea(2) );

// result 4
// result 4
// result 4

ΠœΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ эта функция, Π½ΠΎ каТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

А Π²ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄:

nondet-nondet-func.js
console.log( 'result', computeb(2) );
console.log( 'result', computeb(2) );
console.log( 'result', computeb(2) );

// result 4
// result 4
// result 4
// result 2    <=  ΠΏΠ»ΠΎΡ…ΠΎ!

Π­Ρ‚Π° функция Π²Π΅Ρ€Π½ΡƒΠ»Π° Ρ€Π°Π·Π½Ρ‹Π΅ значСния для ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Ѐункция computeb Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°. Она ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ это Π½Π΅ гарантируСтся.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ?

  • Ѐункция, Π½Π΅ зависящая ΠΎΡ‚ внСшнСго состояния, Π½Π° 100% Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°.
  • Ѐункция, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΆΠ΅ являСтся Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ.
nondet-func-impl.js
function computea(x) {
  return x * x;
}

function computeb(x) {
  return Math.random() < 0.9
          ? x * x
          : x;
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ computea зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° x ΠΈ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ² для ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ x. Π­Ρ‚Π° функция Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°.

Ѐункция computeb Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Math.random. Π‘ Ρ‡Π΅ΠΌ ΠΌΡ‹ взяли, Ρ‡Ρ‚ΠΎ Math.random Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°? Она Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° вычислСниС случайной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ основываСтся Π½Π° систСмном Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ зависит ΠΎΡ‚ внСшнСго состояния.

Π”Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ прСдсказуСм, Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ – Π½Π΅Ρ‚.

ΠΠ΅ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ слоТСния:

nondet-simple-add.js
function add(a, b) {
  return a + b;
};

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ языков программирования опСрация слоТСния рСализуСтся Π½Π° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΌ обСспСчСнии, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π° Π½Π΅Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ процСссор. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ всСгда ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ функция add Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ услоТним Π·Π°Π΄Π°Ρ‡Ρƒ – Π²Π²Π΅Π΄Π΅ΠΌ Π² Π±ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:

nondet-add-boxed.js
const box = value => ({ value });

const two = box(2);
const twoPrime = box(2);

function add(a, b) {
  return a.value + b.value;
}

console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));

// output:
// 2 + 2' == 4
// 2 + 2' == 4
// 2 + 2' == 4

Пока всС ΠΈΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ внСсСм нСбольшоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add:

nondet-add-mutation.js
function add(a, b) {
  a.value += b.value;
  return a.value;
}

console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));

// output:
// 2 + 2' == 4
// 2 + 2' == 6
// 2 + 2' == 8

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

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, функция большС Π½Π΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π°.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π΄Ρ€ΡƒΠ³ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ функция Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ своСй области дСйствия.

***

ДСтСрминированная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ 2+2 == 4 . Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами для Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (2, 2) функция add всСгда Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 4. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько Ρ€Π°Π· Π²Ρ‹ Π΅Π΅ Π²Ρ‹Π·Π²Π°Π»ΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΎΠ½Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΈ Ρ‡Ρ‚ΠΎ происходит Π·Π° Π΅Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ.

НСдСтСрминированныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ – это полная ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π²Ρ‹Π·ΠΎΠ² add(2, 2) Π²Π΅Ρ€Π½Π΅Ρ‚ 4 . Но врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 3, 5 ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ 1004. НСдСтСрминизм ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»Π΅Π½, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

ΠšΠ°ΠΊΠΎΠ²Ρ‹ послСдствия Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°? Π’ Π½Π΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅Ρ„Π΅ΠΊΡ‚Ρ‹ – Π±Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄Ρ€Π°Π³ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ врСмя Π½Π° ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡ…ΡƒΠ΄ΡˆΠ°ΡŽΡ‚ качСство Ρ€Π°Π±ΠΎΡ‚Ρ‹ ПО.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°Π½ΡΡ‚ΡŒΡΡ ΠΈΡ… Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΠ·ΠΌΠΎΠΌ.

ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты

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

ВСрнСмся ΠΊ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слоТСния:

nondet-add-func-only.js
function add(a, b) {
  a.value += b.value;
  return a.value;
}
add(two, twoPrime)

Ѐункция add выполняСт ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΎΠ½Π° добавляСт a ΠΊ b . Однако это Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠΌΡƒ эффСкту – измСнСнию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° a.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС, Ρ‚ΠΎ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ two Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ измСнился. two.value Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π²Π½ΠΎ 4. ПослС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° станСт 6 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Чистота

Π Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ с Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΠ·ΠΌΠΎΠΌ ΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами, ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ чистотС.

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

ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ мноТСство прСимущСств:

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

И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠŸΡ€ΠΎΡ‰Π΅ говоря, чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π°Π΄ΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

Насколько чисто ООП?

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π΄Π²ΡƒΡ… Ρ„ΠΈΡ‡Π°Ρ… ООП β€” Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π°Ρ… ΠΈ сСттСрах.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π° зависит ΠΎΡ‚ внСшнСго состояния β€” состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠœΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ, Π² зависимости ΠΎΡ‚ состояния систСмы. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ.

Π‘Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для измСнСния состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… ΠΏΠΎ своСй сути ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² ООП (ΠΊΡ€ΠΎΠΌΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, статичСских) Π»ΠΈΠ±ΠΎ Π½Π΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π»ΠΈΠ±ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ООП – это Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ чистоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

ЧистоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

Π•ΡΡ‚ΡŒ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ спасти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – Π»ΡƒΡ‡ Π½Π°Π΄Π΅ΠΆΠ΄Ρ‹ Π² ΠΌΡ€Π°Ρ‡Π½ΠΎΠΌ ΠΌΠΈΡ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… сбоСв? Π§Ρ‚ΠΎ-Ρ‚ΠΎ достаточно Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ ΠΈ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ качСствСнноС ПО? Π­Ρ‚ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°.

Π’ computer science ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° Π²ΠΎΠΏΠ»ΠΎΡ‚ΠΈΠ»Π°ΡΡŒ Π² ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, основанного Π½Π° систСмС лямбда-исчислСния.

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

Основной ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования – функция Π² Π΅Π΅ матСматичСском ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв – чистая функция, дСтСрминированная ΠΈ прСдсказуСмая. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, составлСнная ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎΠΆΠ΅ становится прСдсказуСмой.

Π—Π½Π°Ρ‡ΠΈΡ‚ Π»ΠΈ это, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅Ρ‚ Π±Π°Π³ΠΎΠ²? ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π΅Ρ‚. Однако ΠΈ Π±Π°Π³ΠΈ Π² Π½Π΅ΠΉ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Для ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ ошибка, Ρ‡Ρ‚ΠΎ сущСствСнно ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π΅Π΅ исправлСниС.

Как я Ρ‚ΡƒΡ‚ оказался?

Π”ΠΎ появлСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ использовался ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ goto. Он позволял ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ любой части ΠΊΠΎΠ΄Π° Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹. Из-Π·Π° этого Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΈ Π² слоТныС ситуации, ΠΊΠΎΠ³Π΄Π° Π±Ρ‹Π»ΠΎ нСпонятно, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ оказались Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠžΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ процСсс происходит сСйчас с ООП. Волько вмСсто вопроса Β«ΠΊΠ°ΠΊ я ΠΏΠΎΠΏΠ°Π» Π² эту Ρ‚ΠΎΡ‡ΠΊΡƒ исполнСния», ΠΌΡ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Β«ΠΊΠ°ΠΊ я ΠΏΠΎΠΏΠ°Π» Π² это состояниС».

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ нас ΠΎΡ‚ слоТных вопросов. Когда состояниС остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΎΠ½ΠΎ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

РаньшС ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΠΎΠΏΡ€ΠΎΡ‚ΠΈΠ²Π»ΡΠ»ΠΈΡΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ goto. К соТалСнию, сСйчас ситуация повторяСтся с идСями Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования.

А ΠΊΠ°ΠΊ ΠΆΠ΅ спагСтти-ΠΊΠΎΠ΄?

Π’ ООП Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тСорСтичСски Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ со спагСттификациСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ наслСдованию. Однако сама ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° ООП Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΈ Π½Π΅ слСдит Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ этих ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΏΠΎΡ€ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π΄ΠΆΡƒΠ½ΠΈΠΎΡ€Ρ‹ Π² вашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡ… ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ?

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

Но ООП ΠΈ ЀП Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°!

Π–Π°Π»ΡŒ вас Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – полная ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ. Оно Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹:

  • ΠŸΠΎΠΎΡ‰Ρ€ΡΠ΅Ρ‚ нСчистоту ΠΊΠΎΠ΄Π°.
  • По своСй сути Π½Π΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈ поэтому нСпрСдсказуСмо.
  • ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ для ООП Ρ‡ΡƒΠΆΠ΅Ρ€ΠΎΠ΄Π½Ρ‹ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ лишь ΠΏΡ€ΠΈΠ²Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΈΠ·Π²Π½Π΅.
  • БпособствуСт спагСттификации ΠΊΠΎΠ΄Π°.
  • УслоТняСт ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ написаниС тСстов.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ ООП тратят Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ своСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° исправлСниС ошибок. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ ЀП – Π½Π° написаниС Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

ДСйствуйтС, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ·Π΄Π½ΠΎ

ООП Π±Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π½ΡŒ большой ΠΈ уТасно Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ ошибкой. Π”Π°Π²Π°ΠΉΡ‚Π΅ всС, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΏΡ€ΠΈΠ·Π½Π°Π΅ΠΌ это. Если ваш Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ПО, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ‹Ρ‚ΡŒ спокойны.

ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΌΠ΅Ρ€Ρ‹. ΠœΡ‹ всС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ООП ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ малСнькиС шаги Π² сторону Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования. Π­Ρ‚ΠΎ Π½Π΅ быстрый процСсс, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ сдвига ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π½Π΅ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· 10 Π»Π΅Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ.

Π’ блиТайшСм Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ООП-программисты станут Β«Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Π°ΠΌΠΈΒ», ΠΊΠ°ΠΊ сСйчас Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π° COBOL. C++, Java, C# ΡƒΠΌΡ€ΡƒΡ‚. TypeScript Ρ‚ΠΎΠΆΠ΅ ΡƒΠΌΡ€Π΅Ρ‚.

НачнитС ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ прямо сСйчас! F#, ReasonML ΠΈ Elixir – всС это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ для Π½Π°Ρ‡Π°Π»Π°.

ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΊ Π½Π°Π΄Π²ΠΈΠ³Π°ΡŽΡ‰Π΅ΠΉΡΡ Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΈ!

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° Π½Π°ΡˆΠΈΡ… Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π°Ρ… Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста» ΠΈ «Книги для программистов».

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

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
04 октября 2018

ΠŸΠΎΠΌΠ½ΠΈΡ‚ΡŒ всС: дСлимся Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠΎΠΉ ΠΏΠΎ Python

ΠœΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎ ΠΏΡ€Π°Π²Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
22 апрСля 2017

Английский язык для IT-спСциалистов

ВсСм людям, Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ связанным с IT сфСрой, прСкрасно извСстно, Ρ‡Ρ‚ΠΎ Ρ€Π°...
admin
29 января 2017

Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹: ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΠ½ΠΈΠ³ΠΈ, Π²Π΅Π±-сайты, ΠΎΠ½Π»Π°ΠΉΠ½-курсы ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

Π’ этой ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠ΅ прСдставлСн список ΠΊΠ½ΠΈΠ³, Π²Π΅Π±-сайтов ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½-курсов, Π΄Π°ΡŽΡ‰ΠΈΡ…...