ΠŸΠΈΡˆΡƒΠ²Π°ΡšΠ΅ флСксибилСн ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ SOLID

ΠŸΠΈΡˆΡƒΠ²Π°ΡšΠ΅ флСксибилСн ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ SOLID

Од ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡ΠΎΡ‚: објавСно Π·Π° вас напис ΠΎΠ΄ Π‘Π΅Π²Π΅Ρ€ΠΈΠ½ ΠŸΠ΅Ρ€Π΅Π· Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° SOLID ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΡ‚Π΅ ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π°Ρ‚ корисни ΠΈ Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈΡ†ΠΈ ΠΈ Π·Π° искусни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ.

Ако стС Π²ΠΎ Ρ€Π°Π·Π²ΠΎΡ˜, Π½Π°Ρ˜Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ стС ΡΠ»ΡƒΡˆΠ½Π°Π»Π΅ Π·Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ SOLID. Π’ΠΈΠ΅ ΠΌΡƒ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°Π°Ρ‚ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΎΡ‚ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π° чист, Π΄ΠΎΠ±Ρ€ΠΎ структуриран ΠΈ лСсно ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°Π½ ΠΊΠΎΠ΄. Π’Ρ€Π΅Π΄ΠΈ Π΄Π° сС Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ пристапи Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°. Π Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»ΠΈΡΡ‚ΠΈ ΠΈΠΌΠ°Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΈΠ΄Π΅ΠΈ ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ Π·Π° β€žΠ²ΠΈΡΡ‚ΠΈΠ½ΡΠΊΠΈΠΎΡ‚ ΠΏΠ°Ρ‚β€œ; сСто Ρ‚ΠΎΠ° зависи ΠΎΠ΄ искуството Π½Π° сСкоја личност. Π‘Π΅ΠΏΠ°ΠΊ, ΠΈΠ΄Π΅ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΊΠ»Π°ΠΌΠΈΡ€Π°Π½ΠΈ Π²ΠΎ SOLID сС ΠΏΡ€ΠΈΡ„Π°Ρ‚Π΅Π½ΠΈ ΠΎΠ΄ рСчиси ситС прСтставници Π½Π° ИВ Π·Π°Π΅Π΄Π½ΠΈΡ†Π°Ρ‚Π°. Π’ΠΈΠ΅ станаа ΠΏΠΎΡ‡Π΅Ρ‚Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° ΠΏΠΎΡ˜Π°Π²Π°Ρ‚Π° ΠΈ Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΌΠ½ΠΎΠ³Ρƒ Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚.

АјдС Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌΠ΅ ΠΊΠΎΠΈ сС Π‘ΠžΠ›Π˜Π” ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π½ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Π°Ρ‚.

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

ΠŸΠΎΡ‚ΡΠ΅Ρ‚ΡƒΠ²Π°ΠΌΠ΅: Π·Π° ситС Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° β€žΠ₯Π°Π±Ρ€β€œ - попуст ΠΎΠ΄ 10 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° кој Π±ΠΈΠ»ΠΎ курс Skillbox ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€ΠΎΠΌΠΎΡ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ β€žΠ₯Π°Π±Ρ€β€œ.

Π¨Ρ‚ΠΎ Π΅ Π¦Π’Π Π‘Π’?

Овој Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π΅ ΠΊΡ€Π°Ρ‚Π΅Π½ΠΊΠ°, сСкоја Π±ΡƒΠΊΠ²Π° ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΡ‚ Π΅ ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ:

  • Single ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° одговорност. ΠœΠΎΠ΄ΡƒΠ»ΠΎΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π΅Π΄Π½Π° ΠΈ само Π΅Π΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π°.
  • Π½Π° OΠΏΠ΅Π½ΠΊΠ°Π»ΠΎ/Π—Π°Ρ‚Π²ΠΎΡ€Π΅Π½ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΎ/Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΎ). ΠšΠ»Π°ΡΠΈΡ‚Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ Π·Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π°ΡšΠ΅, Π½ΠΎ Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ Π·Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.
  • β€ŠΠ½Π° LИсков ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° Π·Π°ΠΌΠ΅Π½Π° (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° Π·Π°ΠΌΠ΅Π½Π° Π½Π° Лисков). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ користат основСн Ρ‚ΠΈΠΏ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° користат ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΎΠ΄ основниот Ρ‚ΠΈΠΏ Π±Π΅Π· Π΄Π° Π³ΠΎ Π·Π½Π°Π°Ρ‚ Ρ‚ΠΎΠ°.
  • Π½Π° IΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΡΠ΅Π³Ρ€Π΅Π³Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρβ€Š (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΎΠ΄Π²ΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ). БофтвСрскитС Π΅Π½Ρ‚ΠΈΡ‚Π΅Ρ‚ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° зависат ΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΡˆΡ‚ΠΎ Π½Π΅ Π³ΠΈ користат.
  • Π½Π° DнСзависност ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΈΠ½Π²Π΅Ρ€Π·ΠΈΡ˜Π° (ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΈΠ½Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° зависност). ΠœΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ Π½Π° повисокитС Π½ΠΈΠ²ΠΎΠ° Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° зависат ΠΎΠ΄ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ Π½Π° понискитС Π½ΠΈΠ²ΠΎΠ°.

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

β€Š
ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΡ‚ Π½Π° СдинствСна одговорност (SRP) Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° сСкоја класа ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ» Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½Π° само Π·Π° Π΅Π΄Π΅Π½ Π΄Π΅Π» ΠΎΠ΄ функционалноста Π½Π° Ρ‚Π°Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ, Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° ΠΎΠ²Π°Π° одговорност Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π΄ΠΎΠ΄Π΅Π»Π°Ρ‚ Π½Π° Π½ΠΈΠ²Π½Π°Ρ‚Π° класа, намСсто Π΄Π° сС расфрлаат Π½ΠΈΠ· Π½Π΅ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ класи. Π Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΎΡ‚ ΠΈ Π³Π»Π°Π²Π΅Π½ СвангСлист Π½Π° SRP, Π ΠΎΠ±Π΅Ρ€Ρ‚ Π‘. ΠœΠ°Ρ€Ρ‚ΠΈΠ½, ја ΠΎΠΏΠΈΡˆΡƒΠ²Π° одговорноста ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π°. Вој ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ Π³ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ овој Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΊΠ°ΠΊΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° β€žΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Π΄ΠΈΠ·Π°Ρ˜Π½β€œ. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΡ‚ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° Π³ΠΎΠ»Π΅ΠΌ Π΄Π΅Π» ΠΎΠ΄ ΡˆΠ΅ΠΌΠ°Ρ‚Π° Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ ΡˆΡ‚ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ бСшС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π° ΠΎΠ΄ Π’ΠΎΠΌ Π”Π΅ΠΌΠ°Ρ€ΠΊΠΎ.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΡ‚ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡˆΠ΅ ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€Π°Π½ΠΈ ΠΎΠ΄ Π”Π΅Ρ˜Π²ΠΈΠ΄ ΠŸΠ°Ρ€Π½Π°Ρ. Π”Π²Π΅Ρ‚Π΅ Π³Π»Π°Π²Π½ΠΈ сС Π΅Π½ΠΊΠ°ΠΏΡΡƒΠ»Π°Ρ†ΠΈΡ˜Π° ΠΈ ΠΊΡ€ΠΈΠ΅ΡšΠ΅ Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ΠŸΠ°Ρ€Π½Π°Ρ Ρ‚Π²Ρ€Π΄Π΅ΡˆΠ΅ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΅Π»Π±Π°Ρ‚Π° Π½Π° систСмот Π½Π° посСбни ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС заснова Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π±Π»ΠΎΠΊ Π΄ΠΈΡ˜Π°Π³Ρ€Π°ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΠΎΠ²ΠΈ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅. Π‘ΠΈΠ»ΠΎ кој ΠΎΠ΄ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ ΠΌΠΎΡ€Π° Π΄Π° содрТи спСцифично Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅.

Π˜Π½Π°ΠΊΡƒ, ΠœΠ°Ρ€Ρ‚ΠΈΠ½ Π΄Π°Π΄Π΅ интСрСсСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ со високи ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€ΠΈ Π½Π° Π΅Π΄Π½Π° компанија (COO, CTO, CFO), ΠΎΠ΄ ΠΊΠΎΠΈ сСкој користи спСцифичСн Π΄Π΅Π»ΠΎΠ²Π΅Π½ софтвСр Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ†Π΅Π»ΠΈ. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, сСкој ΠΎΠ΄ Π½ΠΈΠ² ΠΌΠΎΠΆΠ΅ Π΄Π° спровСдС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ софтвСрот Π±Π΅Π· Π΄Π° влијаС Π½Π° интСрСситС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€ΠΈ.

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

Како ΠΈ сСкогаш, Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€ΠΈΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС Π½Π°ΡƒΡ‡ΠΈ SRP Π΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π½Π° Π΄Π΅Π»ΠΎ. АјдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΡˆΡ‚ΠΎ НЕ Π³ΠΎ слСди ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΡ‚ Π½Π° СдинствСна одговорност. Ова Π΅ ΠΊΠΎΠ΄ΠΎΡ‚ Π ΡƒΠ±ΠΈ кој Π³ΠΎ ΠΎΠΏΠΈΡˆΡƒΠ²Π° ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΡ‚Π΅ Π½Π° всСлСнската станица.

ΠŸΡ€Π΅Π³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ ΠΈ ΠΎΠ±ΠΈΠ΄Π΅Ρ‚Π΅ сС Π΄Π° Π³ΠΎ ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡ‚Π΅ слСдново:
ΠžΠ΄Π³ΠΎΠ²ΠΎΡ€Π½ΠΎΡΡ‚ΠΈ Π½Π° ΠΎΠ½ΠΈΠ΅ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ ΠΊΠΎΠΈ сС Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½ΠΈ Π²ΠΎ класата 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 ќС растС. Па, бидСјќи овој ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½ со Π΄Ρ€ΡƒΠ³ΠΈ, ΡΠ΅Ρ€Π²ΠΈΡΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ†Π΅Π»ΠΈΠΎΡ‚ комплСкс ќС станС ΡƒΡˆΡ‚Π΅ покомплСксно. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја Π½Π°Ρ€ΡƒΡˆΠΈΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π°, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΡ†Π΅Π»Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅. Ако истраТувачот ΠΏΠΎΠ±Π°Ρ€Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° сСнзоритС, Ρ‚ΠΎΠ° ΠΌΠΎΠΆΠ΅ ΠΌΠ½ΠΎΠ³Ρƒ Π΄ΠΎΠ±Ρ€ΠΎ Π΄Π° влијаС Π½Π° комуникацискитС систСми Π½Π° станицата.

ΠŸΡ€Π΅ΠΊΡ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΡ‚ БРП ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π°Π΄Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎΡ€ΠΎΡ‡Π½Π° Ρ‚Π°ΠΊΡ‚ΠΈΡ‡ΠΊΠ° ΠΏΠΎΠ±Π΅Π΄Π°, Π½ΠΎ Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ ќС ја β€žΠΈΠ·Π³ΡƒΠ±ΠΈΠΌΠ΅ Π²ΠΎΡ˜Π½Π°Ρ‚Π°β€œ ΠΈ ќС Π±ΠΈΠ΄Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Ρ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС ΠΎΠ΄Ρ€ΠΆΠΈ Ρ‚Π°ΠΊΠ²ΠΎ Ρ‡ΡƒΠ΄ΠΎΠ²ΠΈΡˆΡ‚Π΅ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°. ΠΠ°Ρ˜Π΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° сС ΠΏΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π° посСбни Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ‚, ΠΎΠ΄ ΠΊΠΎΠΈ сСкоја Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½Π° Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°. Π Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΎΠ²Π°, ајдС Π΄Π° ја смСнимС класата 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, ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½Π°Ρ‚. Π¨Ρ‚ΠΎ Π°ΠΊΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π°Ρ‡ΠΈΠ½ΠΎΡ‚ Π½Π° испорака Π½Π° Π³ΠΎΡ€ΠΈΠ²ΠΎ ΠΈ ΠΏΠΎΡ‚Ρ€ΠΎΡˆΠ΅Π½ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π»? Π’Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ ќС Ρ‚Ρ€Π΅Π±Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ситС исти часови. И ΠΎΠ²Π° Π΅ вСќС ΠΊΡ€ΡˆΠ΅ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΡ‚ 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 < 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€