НиС пишСм гъвкав код, използвайки SOLID

НиС пишСм гъвкав код, използвайки SOLID

ΠžΡ‚ ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡Π°: ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ΠΈ Π·Π° вас статия Π½Π° Π‘Π΅Π²Π΅Ρ€ΠΈΠ½ ΠŸΠ΅Ρ€Π΅Ρ относно ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ Π½Π° SOLID Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡΡ‚Π° ΠΎΡ‚ статията Ρ‰Π΅ бъдС ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΊΠ°ΠΊΡ‚ΠΎ Π·Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‰ΠΈ, Ρ‚Π°ΠΊΠ° ΠΈ Π·Π° ΠΎΠΏΠΈΡ‚Π½ΠΈ програмисти.

Ако сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°Ρ‚Π΅ с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π½Π°ΠΉ-вСроятно стС Ρ‡ΡƒΠ²Π°Π»ΠΈ Π·Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ Π½Π° SOLID. Π’Π΅ позволяват Π½Π° програмиста Π΄Π° напишС чист, Π΄ΠΎΠ±Ρ€Π΅ структуриран ΠΈ лСсно ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π΅ΠΌ ΠΊΠΎΠ΄. Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌΠ° няколко ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°. Π Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ спСциалисти ΠΈΠΌΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ прСдстави ΠΈ разбирания Π·Π° β€žΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈΡ ΠΏΡŠΡ‚β€œ, всичко зависи ΠΎΡ‚ ΠΎΠΏΠΈΡ‚Π° Π½Π° всСки Ρ‡ΠΎΠ²Π΅ΠΊ. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° ΠΈΠ΄Π΅ΠΈΡ‚Π΅, ΠΏΡ€ΠΎΠΊΠ»Π°ΠΌΠΈΡ€Π°Π½ΠΈ Π² SOLID, сС ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ‚ ΠΎΡ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ всички прСдставитСли Π½Π° ИВ общността. Π’Π΅ станаха ΠΎΡ‚ΠΏΡ€Π°Π²Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° появата ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ.

НСка Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ прСдставляват ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ Π½Π° SOLID ΠΈ ΠΊΠ°ΠΊ Ρ‚Π΅ Π½ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Ρ‚.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ курс β€žΠœΠΎΠ±ΠΈΠ»Π΅Π½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ PROβ€œ.

НапомнямС Π²ΠΈ: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС във всСки курс Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ промоционалния ΠΊΠΎΠ΄ Π½Π° "Habr".

Какво С SOLID?

Π’ΠΎΠ·ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π΅ ΡΡŠΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅, всяка Π±ΡƒΠΊΠ²Π° ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° Π΅ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ:

  • SΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° отговорност. Π•Π΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ» ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π΅Π΄Π½Π° ΠΈ само Π΅Π΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° промяна.
  • - Oписалка/Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½/Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½). ΠšΠ»Π°ΡΠΎΠ²Π΅Ρ‚Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ трябва Π΄Π° са ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ Π·Π° Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅, Π½ΠΎ Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ Π·Π° модификация.
  • β€Š- Liskov ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° замСстванС (ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° замСстванС Π½Π° Лисков). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π±Π°Π·ΠΎΠ² Ρ‚ΠΈΠΏ, трябва Π΄Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π½Π° базовия Ρ‚ΠΈΠΏ, Π±Π΅Π· Π΄Π° Π³ΠΎ знаят.
  • - IΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° раздСлянС Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ°β€Š (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° раздСлянС Π½Π° интСрфСйса). Π‘ΠΎΡ„Ρ‚ΡƒΠ΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π½Π΅ трябва Π΄Π° зависят ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚.
  • - DΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° инвСрсия Π½Π° зависимостта (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° инвСрсия Π½Π° зависимостта). ΠœΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎ-високи Π½ΠΈΠ²Π° Π½Π΅ трябва Π΄Π° зависят ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π° ΠΏΠΎ-ниски Π½ΠΈΠ²Π°.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° Π΅Π΄ΠΈΠ½Π½Π°Ρ‚Π° отговорност

β€Š
ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡŠΡ‚ Π½Π° Π΅Π΄ΠΈΠ½Π½Π°Ρ‚Π° отговорност (SRP) гласи, Ρ‡Π΅ всСки клас ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ» Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° трябва Π΄Π° отговаря само Π·Π° Π΅Π΄Π½Π° част ΠΎΡ‚ функционалността Π½Π° Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. ОсвСн Ρ‚ΠΎΠ²Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ отговорност трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ присвоСни Π½Π° тСхния собствСн клас, Π° Π½Π΅ Ρ€Π°Π·ΠΏΡ€ΡŠΡΠ½Π°Ρ‚ΠΈ Π² Π½Π΅ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ класовС. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π½Π° SRP ΠΈ Π³Π»Π°Π²Π΅Π½ СвангСлист, Π ΠΎΠ±ΡŠΡ€Ρ‚ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½, описва отчСтността ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° промяната. ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ Ρ‚ΠΎΠ·ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΊΠ°Ρ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° своята Ρ€Π°Π±ΠΎΡ‚Π° "ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎ-ориСнтирания Π΄ΠΈΠ·Π°ΠΉΠ½". ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡΡ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° голяма част ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈ бСшС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ ΠΎΡ‚ Π’ΠΎΠΌ Π”Π΅ΠœΠ°Ρ€ΠΊΠΎ.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡΡ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΈ няколко ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ Π”Π΅ΠΉΠ²ΠΈΠ΄ ΠŸΠ°Ρ€Π½Π°Ρ. Π”Π²Π΅Ρ‚Π΅ основни са капсулиранС ΠΈ скриванС Π½Π° информация. ΠŸΠ°Ρ€Π½Π°Ρ Ρ‚Π²ΡŠΡ€Π΄ΠΈ, Ρ‡Π΅ раздСлянСто Π½Π° систСма Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ трябва Π΄Π° сС основава Π½Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π½Π° изпълнСниС. ВсСки ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ трябва Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ прСдоставя ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ информация Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, ΠœΠ°Ρ€Ρ‚ΠΈΠ½ Π΄Π°Π΄Π΅ интСрСсСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с висши ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ΠΈ Π½Π° компания (COO, CTO, CFO), всСки ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° спСцифичСн бизнСс софтуСр Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ†Π΅Π»ΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° всСки ΠΎΡ‚ тях ΠΌΠΎΠΆΠ΅ Π΄Π° въвСдС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² софтуСра, Π±Π΅Π· Π΄Π° засяга интСрСситС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ΠΈ.

БоТСствСн ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ, Π½Π°ΠΉ-добрият Π½Π°Ρ‡ΠΈΠ½ Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ SRP Π΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π² дСйствиС. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ част ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, която НЕ слСдва ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° Π΅Π΄ΠΈΠ½Π½Π°Ρ‚Π° отговорност. Π’ΠΎΠ²Π° Π΅ Ruby ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ описва ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΡ‚Π΅ Π½Π° космичСската станция.

ΠŸΡ€Π΅Π³Π»Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈ сС ΠΎΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ слСдното:
ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€Π½ΠΎΡΡ‚ΠΈ Π½Π° ΠΎΠ½Π΅Π·ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½ΠΈ Π² класа SpaceStation.
Π’Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС интСрСсуват ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° космичСската станция.

class SpaceStation
  def initialize
    @supplies = {}
    @fuel = 0
  end
 
  def run_sensors
    puts "----- Sensor Action -----"
    puts "Running sensors!"
  end
 
  def load_supplies(type, quantity)
    puts "----- Supply Action -----"
    puts "Loading #{quantity} units of #{type} in the supply hold."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- Supply Action -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "Using #{quantity} of #{type} from the supply hold."
      @supplies[type] -= quantity
    else
      puts "Supply Error: Insufficient #{type} in the supply hold."
    end
  end
 
  def report_supplies
    puts "----- Supply Report -----"
    if @supplies.keys.length > 0
      @supplies.each do |type, quantity|
        puts "#{type} avalilable: #{quantity} units"
      end
    else
      puts "Supply hold is empty."
    end
  end
 
  def load_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Loading #{quantity} units of fuel in the tank."
    @fuel += quantity
  end
 
  def report_fuel
    puts "----- Fuel Report -----"
    puts "#{@fuel} units of fuel available."
  end
 
  def activate_thrusters
    puts "----- Thruster Action -----"
    if @fuel >= 10
      puts "Thrusting action successful."
      @fuel -= 10
    else
      puts "Thruster Error: Insufficient fuel available."
    end
  end
end

Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π½Π°ΡˆΠ°Ρ‚Π° космичСска станция Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° (Π½Π΅ мисля, Ρ‡Π΅ скоро Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΠΎΡ‚ НАБА), Π½ΠΎ Ρ‚ΡƒΠΊ ΠΈΠΌΠ° ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅.

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΠΊΠ»Π°ΡΡŠΡ‚ SpaceStation ΠΈΠΌΠ° няколко Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ отговорности (ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ). Всички Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° Π²ΠΈΠ΄ΠΎΠ²Π΅:

  • сСнзори;
  • консумативи (консумативи);
  • Π³ΠΎΡ€ΠΈΠ²ΠΎ;
  • ускоритСли.

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Π½ΠΈΠΊΠΎΠΉ ΠΎΡ‚ слуТитСлитС Π½Π° станцията Π½Π΅ Π΅ класиран, лСсно ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° си прСдставим ΠΊΠΎΠΉ Π·Π° ΠΊΠ°ΠΊΠ²ΠΎ отговаря. Най-вСроятно учСният ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° сСнзоритС, Π»ΠΎΠ³ΠΈΡΡ‚ΠΈΠΊΡŠΡ‚ Π΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° доставката Π½Π° рСсурси, ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΡŠΡ‚ Π΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° доставкитС Π½Π° Π³ΠΎΡ€ΠΈΠ²ΠΎ, Π° ΠΏΠΈΠ»ΠΎΡ‚ΡŠΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° ускоритСлитС.

МоТСм Π»ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π΅ Π΅ ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠ° с SRP? Π”Π°, Ρ€Π°Π·Π±ΠΈΡ€Π° сС. Но ΠΊΠ»Π°ΡΡŠΡ‚ SpaceStation Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π΅Π½ β€žΠ±ΠΎΠ³ΠΎΠΎΠ±Π΅ΠΊΡ‚β€œ, ΠΊΠΎΠΉΡ‚ΠΎ Π·Π½Π°Π΅ всичко ΠΈ ΠΏΡ€Π°Π²ΠΈ всичко. Π’ΠΎΠ²Π° Π΅ основСн Π°Π½Ρ‚ΠΈ-шаблон Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅. Π—Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‰ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ са ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΈ Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°. ЗасСга ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ проста, Π΄Π°, Π½ΠΎ прСдставСтС си ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ станС, Π°ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. МоТС Π±ΠΈ Π½Π°ΡˆΠ°Ρ‚Π° космичСска станция Ρ‰Π΅ сС Π½ΡƒΠΆΠ΄Π°Π΅ ΠΎΡ‚ мСдицинска станция ΠΈΠ»ΠΈ Π·Π°Π»Π° Π·Π° срСщи. И ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ°, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ‰Π΅ растС SpaceStation. Π•, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° ΡΡŠΠΎΡ€ΡŠΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈ, обслуТванСто Π½Π° цСлия комплСкс Ρ‰Π΅ станС ΠΎΡ‰Π΅ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°Ρ€ΡƒΡˆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° ускоритСли. Ако изслСдоватСл поиска ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² сСнзоритС, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° повлияС Π½Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ систСми Π½Π° станцията.

ΠΠ°Ρ€ΡƒΡˆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° SRP ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π°Π΄Π΅ краткосрочна тактичСска ΠΏΠΎΠ±Π΅Π΄Π°, Π½ΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка Ρ‰Π΅ β€žΠ·Π°Π³ΡƒΠ±ΠΈΠΌ Π²ΠΎΠΉΠ½Π°Ρ‚Π°β€œ ΠΈ Ρ‰Π΅ станС ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΌΠ΅ Ρ‚Π°ΠΊΠΎΠ²Π° Ρ‡ΡƒΠ΄ΠΎΠ²ΠΈΡ‰Π΅ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅. Най-Π΄ΠΎΠ±Ρ€Π΅ Π΅ Π΄Π° Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ части ΠΎΡ‚ ΠΊΠΎΠ΄, всСки ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ отговаря Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° опСрация. Π Π°Π·Π±ΠΈΡ€Π°ΠΉΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π½Π΅ΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ класа SpaceStation.

Π”Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ отговорността

По-Π³ΠΎΡ€Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ…ΠΌΠ΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Ρ‚ΠΈΠΏΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Ρ‚ ΠΎΡ‚ класа SpaceStation. Π©Π΅ Π³ΠΈ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ€Π°ΠΌΠ΅. Актуализираният ΠΊΠΎΠ΄ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π½Π° SRP.

class SpaceStation
  attr_reader :sensors, :supply_hold, :fuel_tank, :thrusters
 
  def initialize
    @supply_hold = SupplyHold.new
    @sensors = Sensors.new
    @fuel_tank = FuelTank.new
    @thrusters = Thrusters.new(@fuel_tank)
  end
end
 
class Sensors
  def run_sensors
    puts "----- Sensor Action -----"
    puts "Running sensors!"
  end
end
 
class SupplyHold
  attr_accessor :supplies
 
  def initialize
    @supplies = {}
  end
 
  def load_supplies(type, quantity)
    puts "----- Supply Action -----"
    puts "Loading #{quantity} units of #{type} in the supply hold."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- Supply Action -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "Using #{quantity} of #{type} from the supply hold."
      @supplies[type] -= quantity
    else
      puts "Supply Error: Insufficient #{type} in the supply hold."
    end
  end
 
  def report_supplies
    puts "----- Supply Report -----"
    if @supplies.keys.length > 0
      @supplies.each do |type, quantity|
        puts "#{type} avalilable: #{quantity} units"
      end
    else
      puts "Supply hold is empty."
    end
  end
end
 
class FuelTank
  attr_accessor :fuel
 
  def initialize
    @fuel = 0
  end
 
  def get_fuel_levels
    @fuel
  end
 
  def load_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Loading #{quantity} units of fuel in the tank."
    @fuel += quantity
  end
 
  def use_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Using #{quantity} units of fuel from the tank."
    @fuel -= quantity
  end
 
  def report_fuel
    puts "----- Fuel Report -----"
    puts "#{@fuel} units of fuel available."
  end
end
 
class Thrusters
  def initialize(fuel_tank)
    @linked_fuel_tank = fuel_tank
  end
 
  def activate_thrusters
    puts "----- Thruster Action -----"
    if @linked_fuel_tank.get_fuel_levels >= 10
      puts "Thrusting action successful."
      @linked_fuel_tank.use_fuel(10)
    else
      puts "Thruster Error: Insufficient fuel available."
    end
  end
end

Има ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ сСга. Π‘Π΅Π³Π° Π½Π°ΡˆΠΈΡΡ‚ клас SpaceStation сС ΠΏΡ€Π΅Π²ΡŠΡ€Π½Π° ΠΏΠΎ-скоро Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π² ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° зависими части, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ сСнзори, систСма Π·Π° Π·Π°Ρ…Ρ€Π°Π½Π²Π°Π½Π΅ с консумативи, Ρ€Π΅Π·Π΅Ρ€Π²ΠΎΠ°Ρ€ Π·Π° Π³ΠΎΡ€ΠΈΠ²ΠΎ ΠΈ бустСри.

Π—Π° всяка ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π΅Π½ клас: Π‘Π΅Π½Π·ΠΎΡ€ΠΈ; SupplyHold; Π Π΅Π·Π΅Ρ€Π²ΠΎΠ°Ρ€ Π·Π° Π³ΠΎΡ€ΠΈΠ²ΠΎ; Власкачи.

Има няколко Π²Π°ΠΆΠ½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² Ρ‚Π°Π·ΠΈ вСрсия Π½Π° ΠΊΠΎΠ΄Π°. Π’ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π΅, Ρ‡Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ само са капсулирани Π² собствСнитС си класовС, Ρ‚Π΅ са ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ Ρ‚Π°ΠΊΡŠΠ² Π½Π°Ρ‡ΠΈΠ½, Ρ‡Π΅ Π΄Π° станат ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈΠΌΠΈ ΠΈ послСдоватСлни. Π“Ρ€ΡƒΠΏΠΈΡ€Π°ΠΌΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ с ΠΏΠΎΠ΄ΠΎΠ±Π½Π° функционалност, Π·Π° Π΄Π° слСдвамС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° ΡΡŠΠ³Π»Π°ΡΡƒΠ²Π°Π½ΠΎΡΡ‚. Π‘Π΅Π³Π°, Π°ΠΊΠΎ трябва Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата, ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°ΠΉΠΊΠΈ ΠΎΡ‚ Ρ…Π΅Ρˆ структура към масив, просто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ класа SupplyHold; Π½Π΅ Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π° докосвамС Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½, Π°ΠΊΠΎ Π»ΠΎΠ³ΠΈΡΡ‚ΠΈΠΊΡŠΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‰ΠΎ Π² своята сСкция, останалата част ΠΎΡ‚ станцията Ρ‰Π΅ останС Π½Π΅ΠΏΠΎΠΊΡŠΡ‚Π½Π°Ρ‚Π°. Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΊΠ»Π°ΡΡŠΡ‚ SpaceStation Π΄ΠΎΡ€ΠΈ няма Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅.

ΠΠ°ΡˆΠΈΡ‚Π΅ слуТитСли, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ Π½Π° космичСската станция, вСроятно са Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° поискат Ρ‚Π΅Π·ΠΈ, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС нуТдаят. Π—Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅, Ρ‡Π΅ ΠΊΠΎΠ΄ΡŠΡ‚ ΠΈΠΌΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΊΠ°Ρ‚ΠΎ report_supplies ΠΈ report_fuel, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈ сС Π² класовСтС SupplyHold ΠΈ FuelTank. Какво Ρ‰Π΅ сС случи, Π°ΠΊΠΎ ЗСмята поиска Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°? И Π΄Π²Π°Ρ‚Π° класа, SupplyHold ΠΈ FuelTank, Ρ‰Π΅ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ. Ами Π°ΠΊΠΎ трябва Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π°Ρ‡ΠΈΠ½Π° Π½Π° доставка Π½Π° Π³ΠΎΡ€ΠΈΠ²ΠΎ ΠΈ консумативи? ВСроятно Ρ‰Π΅ трябва Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ всички ΡΡŠΡ‰ΠΈΡ‚Π΅ класовС ΠΎΡ‚Π½ΠΎΠ²ΠΎ. А Ρ‚ΠΎΠ²Π° Π²Π΅Ρ‡Π΅ Π΅ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° КРП. НСка ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°.

class SpaceStation
  attr_reader :sensors, :supply_hold, :supply_reporter,
              :fuel_tank, :fuel_reporter, :thrusters
 
  def initialize
    @sensors = Sensors.new
    @supply_hold = SupplyHold.new
    @supply_reporter = SupplyReporter.new(@supply_hold)
    @fuel_tank = FuelTank.new
    @fuel_reporter = FuelReporter.new(@fuel_tank)
    @thrusters = Thrusters.new(@fuel_tank)
  end
end
 
class Sensors
  def run_sensors
    puts "----- Sensor Action -----"
    puts "Running sensors!"
  end
end
 
class SupplyHold
  attr_accessor :supplies
  attr_reader :reporter
 
  def initialize
    @supplies = {}
  end
 
  def get_supplies
    @supplies
  end
 
  def load_supplies(type, quantity)
    puts "----- Supply Action -----"
    puts "Loading #{quantity} units of #{type} in the supply hold."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- Supply Action -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "Using #{quantity} of #{type} from the supply hold."
      @supplies[type] -= quantity
    else
      puts "Supply Error: Insufficient #{type} in the supply hold."
    end
  end
end
 
class FuelTank
  attr_accessor :fuel
  attr_reader :reporter
 
  def initialize
    @fuel = 0
  end
 
  def get_fuel_levels
    @fuel
  end
 
  def load_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Loading #{quantity} units of fuel in the tank."
    @fuel += quantity
  end
 
  def use_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Using #{quantity} units of fuel from the tank."
    @fuel -= quantity
  end
end
 
class Thrusters
  FUEL_PER_THRUST = 10
 
  def initialize(fuel_tank)
    @linked_fuel_tank = fuel_tank
  end
 
  def activate_thrusters
    puts "----- Thruster Action -----"
    
    if @linked_fuel_tank.get_fuel_levels >= FUEL_PER_THRUST
      puts "Thrusting action successful."
      @linked_fuel_tank.use_fuel(FUEL_PER_THRUST)
    else
      puts "Thruster Error: Insufficient fuel available."
    end
  end
end
 
class Reporter
  def initialize(item, type)
    @linked_item = item
    @type = type
  end
 
  def report
    puts "----- #{@type.capitalize} Report -----"
  end
end
 
class FuelReporter < Reporter
  def initialize(item)
    super(item, "fuel")
  end
 
  def report
    super
    puts "#{@linked_item.get_fuel_levels} units of fuel available."
  end
end
 
class SupplyReporter < Reporter
  def initialize(item)
    super(item, "supply")
  end
 
  def report
    super
    if @linked_item.get_supplies.keys.length > 0
      @linked_item.get_supplies.each do |type, quantity|
        puts "#{type} avalilable: #{quantity} units"
      end
    else
      puts "Supply hold is empty."
    end
  end
end
 
iss = SpaceStation.new
 
iss.sensors.run_sensors
  # ----- Sensor Action -----
  # Running sensors!
 
iss.supply_hold.use_supplies("parts", 2)
  # ----- Supply Action -----
  # Supply Error: Insufficient parts in the supply hold.
iss.supply_hold.load_supplies("parts", 10)
  # ----- Supply Action -----
  # Loading 10 units of parts in the supply hold.
iss.supply_hold.use_supplies("parts", 2)
  # ----- Supply Action -----
  # Using 2 of parts from the supply hold.
iss.supply_reporter.report
  # ----- Supply Report -----
  # parts avalilable: 8 units
 
iss.thrusters.activate_thrusters
  # ----- Thruster Action -----
  # Thruster Error: Insufficient fuel available.
iss.fuel_tank.load_fuel(100)
  # ----- Fuel Action -----
  # Loading 100 units of fuel in the tank.
iss.thrusters.activate_thrusters
  # ----- Thruster Action -----
  # Thrusting action successful.
  # ----- Fuel Action -----
  # Using 10 units of fuel from the tank.
iss.fuel_reporter.report
  # ----- Fuel Report -----
# 90 units of fuel available.

Π’ Ρ‚Π°Π·ΠΈ послСдна вСрсия Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, отговорноститС са Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° Π΄Π²Π° Π½ΠΎΠ²ΠΈ класа, FuelReporter ΠΈ SupplyReporter. И Π΄Π²Π°ΠΌΠ°Ρ‚Π° са Π΄Π΅Ρ†Π° ΠΎΡ‚ клас β€žΠ Π΅ΠΏΠΎΡ€Ρ‚Π΅Ρ€β€œ. ОсвСн Ρ‚ΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° СкзСмпляр към класа SpaceStation, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ТСланият подклас Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π‘Π΅Π³Π°, Π°ΠΊΠΎ ЗСмята Ρ€Π΅ΡˆΠΈ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ, Ρ‚ΠΎΠ³Π°Π²Π° Π½ΠΈΠ΅ Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² подкласовСтС, Π° Π½Π΅ Π² основния клас.

Π Π°Π·Π±ΠΈΡ€Π° сС, някои ΠΎΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅ класовС всС ΠΎΡ‰Π΅ зависят Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΠΎΠ±Π΅ΠΊΡ‚ΡŠΡ‚ SupplyReporter зависи ΠΎΡ‚ SupplyHold, Π° FuelReporter зависи ΠΎΡ‚ FuelTank. Π Π°Π·Π±ΠΈΡ€Π° сС, бустСритС трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ към Ρ€Π΅Π·Π΅Ρ€Π²ΠΎΠ°Ρ€Π° Π·Π° Π³ΠΎΡ€ΠΈΠ²ΠΎ. Но Ρ‚ΡƒΠΊ всичко Π²Π΅Ρ‡Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ няма Π΄Π° бъдС особСно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ - Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΠ±Π΅ΠΊΡ‚ няма Π΄Π° засСгнС Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Ρ€ΡƒΠ³.

Π’Π°ΠΊΠ° ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅Π½ ΠΊΠΎΠ΄, Π² ΠΊΠΎΠΉΡ‚ΠΎ отговорноститС Π½Π° всСки ΠΎΡ‚ ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅/класовСтС са Ρ‚ΠΎΡ‡Π½ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Ρ‚Π°ΠΊΡŠΠ² ΠΊΠΎΠ΄ Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ Ρ‰Π΅ бъдС проста Π·Π°Π΄Π°Ρ‡Π°. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ…ΠΌΠ΅ цСлия β€žΠ±ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚β€œ Π² SRP.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€