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

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

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

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

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

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ курс «МобилСн Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ПРО».

НапомнямС: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° Β«Π₯Π°Π±Ρ€Π°Β» β€” ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС Π½Π° всСки курс Skillbox с ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄ Β«Π₯Π°Π±Ρ€Β».

Какво С SOLID?

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° СдинствСната отговорност

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

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

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

БоТСствСн ΠΎΠ±Π΅ΠΊΡ‚

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

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

клас SpaceStation
  Π΄Π΅Ρ„ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅
    @снабдяванС = {}
    @Π³ΠΎΡ€ΠΈΠ²ΠΎ = 0
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ Ρ€Π°Π±ΠΎΡ‚ΠΈ_сСнзори
    постави "----- ДСйствиС Π½Π° сСнзора -----"
    постави "Изпълнявам сСнзоритС!"
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ Π·Π°Ρ€Π΅Π΄ΠΈ_снабдяванС(Ρ‚ΠΈΠΏ, количСство)
    постави "----- ДСйствиС Π½Π° снабдяванСто -----"
    постави "Π—Π°Ρ€Π΅ΠΆΠ΄Π°ΠΌ #{количСство} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ ΠΎΡ‚ #{Ρ‚ΠΈΠΏ} Π² склада Π·Π° снабдяванС."
    
    Π°ΠΊΠΎ @снабдяванС[Ρ‚ΠΈΠΏ]
      @снабдяванС[Ρ‚ΠΈΠΏ] += количСство
    ΠΈΠ½Π°Ρ‡Π΅
      @снабдяванС[Ρ‚ΠΈΠΏ] = количСство
    ΠΊΡ€Π°ΠΉ
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉ_снабдяванС(Ρ‚ΠΈΠΏ, количСство)
    постави "----- ДСйствиС Π½Π° снабдяванСто -----"
    Π°ΠΊΠΎ @снабдяванС[Ρ‚ΠΈΠΏ] != nil && @снабдяванС[Ρ‚ΠΈΠΏ] > количСство
      постави "Използвам #{количСство} ΠΎΡ‚ #{Ρ‚ΠΈΠΏ} ΠΎΡ‚ склада Π·Π° снабдяванС."
      @снабдяванС[Ρ‚ΠΈΠΏ] -= количСство
    ΠΈΠ½Π°Ρ‡Π΅
      постави "Π“Ρ€Π΅ΡˆΠΊΠ° Π² снабдяванСто: ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ #{Ρ‚ΠΈΠΏ} Π² склада Π·Π° снабдяванС."
    ΠΊΡ€Π°ΠΉ
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°ΠΉ_снабдяванС
    постави "----- Π‘ΠΏΡ€Π°Π²ΠΊΠ° Π·Π° снабдяванСто -----"
    Π°ΠΊΠΎ @снабдяванС.ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅.дълТина > 0
      @снабдяванС.всяко Π½Π°ΠΏΡ€Π°Π²ΠΈ |Ρ‚ΠΈΠΏ, количСство|
        постави "#{Ρ‚ΠΈΠΏ} Π½Π°Π»ΠΈΡ‡Π½ΠΈ: #{количСството} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ"
      ΠΊΡ€Π°ΠΉ
    ΠΈΠ½Π°Ρ‡Π΅
      постави "Π‘ΠΊΠ»Π°Π΄ΡŠΡ‚ Π·Π° снабдяванС Π΅ ΠΏΡ€Π°Π·Π΅Π½."
    ΠΊΡ€Π°ΠΉ
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ Π·Π°Ρ€Π΅Π΄ΠΈ_Π³ΠΎΡ€ΠΈΠ²ΠΎ(количСство)
    постави "----- ДСйствиС Π·Π° Π³ΠΎΡ€ΠΈΠ²ΠΎΡ‚ΠΎ -----"
    постави "Π—Π°Ρ€Π΅ΠΆΠ΄Π°ΠΌ #{количСство} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π³ΠΎΡ€ΠΈΠ²ΠΎ Π² Ρ€Π΅Π·Π΅Ρ€Π²ΠΎΠ°Ρ€Π°."
    @Π³ΠΎΡ€ΠΈΠ²ΠΎ += количСство
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°ΠΉ_Π³ΠΎΡ€ΠΈΠ²ΠΎ
    постави "----- Π‘ΠΏΡ€Π°Π²ΠΊΠ° Π·Π° Π³ΠΎΡ€ΠΈΠ²ΠΎΡ‚ΠΎ -----"
    постави "#{@Π³ΠΎΡ€ΠΈΠ²ΠΎ} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π³ΠΎΡ€ΠΈΠ²ΠΎ Π½Π°Π»ΠΈΡ‡Π½ΠΈ."
  ΠΊΡ€Π°ΠΉ
 
  Π΄Π΅Ρ„ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΉ_ускоритСлитС
    постави "----- ДСйствиС Π½Π° ускоритСлитС -----"
    Π°ΠΊΠΎ @Π³ΠΎΡ€ΠΈΠ²ΠΎ >= 10
      постави "ДСйствиСто Π½Π° тласканСто Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ."
      @Π³ΠΎΡ€ΠΈΠ²ΠΎ -= 10
    ΠΈΠ½Π°Ρ‡Π΅
      постави "Π“Ρ€Π΅ΡˆΠΊΠ° Π½Π° ускоритСлитС: ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π³ΠΎΡ€ΠΈΠ²ΠΎ Π½Π°Π»ΠΈΡ‡Π½ΠΎ."
    ΠΊΡ€Π°ΠΉ
  ΠΊΡ€Π°ΠΉ
ΠΊΡ€Π°ΠΉ

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

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

  • сСнзори;
  • снабдяванС (Ρ€Π°Π·Ρ…ΠΎΠ΄Π½ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈ);
  • Π³ΠΎΡ€ΠΈΠ²ΠΎ;
  • ускоритСли.

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

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

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

РазпрСдСлямС отговорноститС

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

клас 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
 
клас Sensors
  def run_sensors
    puts "----- ДСйствиС Π½Π° сСнзора -----"
    puts "Π‘Π΅Π½Π·ΠΎΡ€ΠΈΡ‚Π΅ работят!"
  end
end
 
клас SupplyHold
  attr_accessor :supplies
 
  def initialize
    @supplies = {}
  end
 
  def load_supplies(type, quantity)
    puts "----- ДСйствиС Π½Π° запаситС -----"
    puts "Π—Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° #{quantity} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ ΠΎΡ‚ #{type} Π² Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° част."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- ДСйствиС Π½Π° запаситС -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "ИзползванС Π½Π° #{quantity} ΠΎΡ‚ #{type} ΠΎΡ‚ Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° част."
      @supplies[type] -= quantity
    else
      puts "Π“Ρ€Π΅ΡˆΠΊΠ° Π² запаса: ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ #{type} Π² Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° част."
    end
  end
 
  def report_supplies
    puts "----- Π”ΠΎΠΊΠ»Π°Π΄ Π·Π° запаситС -----"
    if @supplies.keys.length > 0
      @supplies.each do |type, quantity|
        puts "#{type} Π½Π°Π»ΠΈΡ‡Π½ΠΎ: #{quantity} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ"
      end
    else
      puts "Π Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° част Π΅ ΠΏΡ€Π°Π·Π½Π°."
    end
  end
end
 
клас FuelTank
  attr_accessor :fuel
 
  def initialize
    @fuel = 0
  end
 
  def get_fuel_levels
    @fuel
  end
 
  def load_fuel(quantity)
    puts "----- ДСйствиС Π½Π° Π³ΠΎΡ€ΠΈΠ²ΠΎΡ‚ΠΎ -----"
    puts "Π—Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° #{quantity} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π³ΠΎΡ€ΠΈΠ²ΠΎ Π² Ρ€Π΅Π·Π΅Ρ€Π²ΠΎΠ°Ρ€Π°."
    @fuel += quantity
  end
 
  def use_fuel(quantity)
    puts "----- ДСйствиС Π½Π° Π³ΠΎΡ€ΠΈΠ²ΠΎΡ‚ΠΎ -----"
    puts "ИзползванС Π½Π° #{quantity} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π³ΠΎΡ€ΠΈΠ²ΠΎ ΠΎΡ‚ Ρ€Π΅Π·Π΅Ρ€Π²ΠΎΠ°Ρ€Π°."
    @fuel -= quantity
  end
 
  def report_fuel
    puts "----- Π”ΠΎΠΊΠ»Π°Π΄ Π·Π° Π³ΠΎΡ€ΠΈΠ²ΠΎΡ‚ΠΎ -----"
    puts "#{@fuel} Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π³ΠΎΡ€ΠΈΠ²ΠΎ Π½Π°Π»ΠΈΡ‡Π½ΠΎ."
  end
end
 
клас Thrusters
  def initialize(fuel_tank)
    @linked_fuel_tank = fuel_tank
  end
 
  def activate_thrusters
    puts "----- ДСйствиС Π½Π° ускоритСлитС -----"
    if @linked_fuel_tank.get_fuel_levels >= 10
      puts "ДСйствиСто Π½Π° усилванС Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ."
      @linked_fuel_tank.use_fuel(10)
    else
      puts "Π“Ρ€Π΅ΡˆΠΊΠ° Π² ускоритСля: ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π³ΠΎΡ€ΠΈΠ²ΠΎ Π½Π°Π»ΠΈΡ‡Π½ΠΎ."
    end
  end
end

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

Π—Π° всяка ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ сСга ΠΈΠΌΠ° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π΅Π½ клас: Sensors; SupplyHold; FuelTank; Thrusters.

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

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

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  0
      @linked_item.get_supplies.each do |type, quantity|
        puts "#{type} available: #{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 available: 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. И Π΄Π²Π°Ρ‚Π° са наслСдници Π½Π° класа Reporter. ОсвСн Ρ‚ΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ…ΠΌΠ΅ СкзСмплярни ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ към класа SpaceStation, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈ Π½ΡƒΠΆΠ΄Π° Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ нСобходимия подклас. Π‘Π΅Π³Π°, Π°ΠΊΠΎ ЗСмята Ρ€Π΅ΡˆΠΈ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‰ΠΎ, Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ Π² подкласовСтС, Π° Π½Π΅ Π² основния клас.

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

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅Π½ ΠΊΠΎΠ΄, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π·Π°Π΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΡΡ‚Π° Π½Π° всСки ΠΎΡ‚ ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅/класовСтС са Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Ρ‚Π°ΠΊΡŠΠ² ΠΊΠΎΠ΄ Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° ΠΌΡƒ Ρ‰Π΅ бъдС проста Π·Π°Π΄Π°Ρ‡Π°. ЦСлият 'боТСствСн ΠΎΠ±Π΅ΠΊΡ‚' ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ…ΠΌΠ΅ Π² SRP.

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

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster