แž€แžถแžšแžŸแžšแžŸแŸแžšแž€แžผแžŠแžŠแŸ‚แž›แžขแžถแž…แž”แžแŸ‹แž”แŸ‚แž“แž”แžถแž“แžŠแŸ„แž™แž”แŸ’แžšแžพ SOLID

แž€แžถแžšแžŸแžšแžŸแŸแžšแž€แžผแžŠแžŠแŸ‚แž›แžขแžถแž…แž”แžแŸ‹แž”แŸ‚แž“แž”แžถแž“แžŠแŸ„แž™แž”แŸ’แžšแžพ SOLID

แž–แžธแžขแŸ’แž“แž€แž”แž€แž”แŸ’แžšแŸ‚แŸ– แž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€ แžขแžแŸ’แžแž”แž‘แžŠแŸ„แž™ Severin Perez แžขแŸ†แž–แžธแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž‚แŸ„แž›แž€แžถแžšแžŽแŸ SOLID แž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแŸ” แž–แŸแžแŸŒแž˜แžถแž“แž–แžธแžขแžแŸ’แžแž”แž‘แž“แžนแž„แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ†แž”แžผแž„ แž“แžทแž„แžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ‚แž›แž˜แžถแž“แž”แž‘แž–แžทแžŸแŸ„แž’แž“แŸแŸ”

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แžขแŸ’แž“แž€แž‘แŸ†แž“แž„แž‡แžถแž”แžถแž“แžฎแžขแŸ†แž–แžธแž‚แŸ„แž›แž€แžถแžšแžŽแŸ SOLIDแŸ” แž–แžฝแž€แž‚แŸแžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŸแžšแžŸแŸแžšแž€แžผแžŠแžŸแŸ’แžขแžถแž แž˜แžถแž“แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž›แŸ’แžข แž“แžทแž„แž„แžถแž™แžŸแŸ’แžšแžฝแž›แžšแž€แŸ’แžŸแžถแŸ” แžœแžถแž‚แžฝแžšแžฑแŸ’แž™แž€แžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžแžถแž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž˜แžถแž“แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž‡แžถแž…แŸ’แžšแžพแž“แžขแŸ†แž–แžธแžšแž”แŸ€แž”แžขแž“แžปแžœแžแŸ’แžแž€แžถแžšแž„แžถแžšแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™แžฑแŸ’แž™แž”แžถแž“แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœแŸ” แžขแŸ’แž“แž€แžฏแž€แž‘แŸแžŸแž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถแž˜แžถแž“แž‚แŸ†แž“แžทแž แž“แžทแž„แž€แžถแžšแž™แž›แŸ‹แžŠแžนแž„แžแžปแžŸแŸ—แž‚แŸ’แž“แžถแžขแŸ†แž–แžธ "แž•แŸ’แž›แžผแžœแžแŸ’แžšแžผแžœ" แžœแžถแžขแžถแžŸแŸ’แžšแŸแž™แž‘แŸ…แž›แžพแž”แž‘แž–แžทแžŸแŸ„แž’แž“แŸแžšแž”แžŸแŸ‹แž˜แž“แžปแžŸแŸ’แžŸแž˜แŸ’แž“แžถแž€แŸ‹แŸ—แŸ” แž‘แŸ„แŸ‡แž‡แžถแž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แž‚แŸ†แž“แžทแžแžŠแŸ‚แž›แž”แžถแž“แž”แŸ’แžšแž€แžถแžŸแž“แŸ…แž€แŸ’แž“แžปแž„ SOLID แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž‘แžฝแž›แž™แž€แžŠแŸ„แž™แžขแŸ’แž“แž€แžแŸ†แžŽแžถแž„แžŸแŸ’แž‘แžพแžšแžแŸ‚แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸƒแžŸแž แž‚แž˜แž“แŸ IT แŸ” แž–แžฝแž€แž‚แŸแž”แžถแž“แž€แŸ’แž›แžถแž™แž‡แžถแž…แŸ†แžŽแžปแž…แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž›แŸแž…แžกแžพแž„ แž“แžทแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸƒแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžŠแŸแž›แŸ’แžขแž‡แžถแž…แŸ’แžšแžพแž“แŸ”

แž…แžผแžšแž™แžพแž„แž™แž›แŸ‹แž–แžธแž‚แŸ„แž›แž€แžถแžšแžŽแŸ SOLID แž“แžทแž„แžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแž‡แžฝแž™แž™แžพแž„แŸ”

Skillbox แžŽแŸ‚แž“แžถแŸ†แŸ– แžœแž‚แŸ’แž‚แžŸแžทแž€แŸ’แžŸแžถแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„ "แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž…แž›แŸแž PRO".

แž™แžพแž„แžšแŸ†แž›แžนแž€แŸ– แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แžขแžถแž“แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸƒ "Habr" - แž€แžถแžšแž”แž‰แŸ’แž…แžปแŸ‡แžแž˜แŸ’แž›แŸƒ 10 rubles แž“แŸ…แž–แŸแž›แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž€แŸ’แž“แžปแž„แžœแž‚แŸ’แž‚แžŸแžทแž€แŸ’แžŸแžถ Skillbox แžŽแžถแž˜แžฝแž™แžŠแŸ„แž™แž”แŸ’แžšแžพแž›แŸแžแž€แžผแžŠแž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™ "Habr" แŸ”

แžแžพ SOLID แž‡แžถแžขแŸ’แžœแžธ?

แž–แžถแž€แŸ’แž™แž“แŸแŸ‡แž‚แžบแž‡แžถแžขแž€แŸ’แžŸแžšแž€แžถแžแŸ‹ แžขแž€แŸ’แžŸแžšแž“แžธแž˜แžฝแž™แŸ—แž“แŸƒแž–แžถแž€แŸ’แž™แž‚แžบแž‡แžถแž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž“แŸƒแžˆแŸ’แž˜แŸ„แŸ‡แž“แŸƒแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™แŸ–

  • Sแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแŸ” แž˜แŸ‰แžผแžŒแžปแž›แžขแžถแž…แž˜แžถแž“แž แŸแžแžปแž•แž›แž˜แžฝแž™ แž“แžทแž„แžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแŸ”
  • แž“แŸแŸ‡ Oแž”แŸŠแžทแž… / แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แžทแž‘ (แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แžพแž€/แž”แžทแž‘)แŸ” แžแŸ’แž“แžถแž€แŸ‹ แž“แžทแž„แž’แžถแžแžปแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž‚แžฝแžšแžแŸ‚แž”แžพแž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แžแŸ‚แž˜ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž”แžทแž‘แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž€แŸ‚แž”แŸ’แžšแŸ‚แŸ”
  • โ€Šแž“แŸแŸ‡ Liskov แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‡แŸ†แž“แžฝแžŸ (แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‡แŸ†แž“แžฝแžŸ Liskov) แŸ” แžขแž“แžปแž‚แž˜แž“แŸแžŠแŸ‚แž›แž”แŸ’แžšแžพแž”แŸ’แžšแž—แŸแž‘แž‚แŸ„แž›แž‚แžฝแžšแžแŸ‚แžขแžถแž…แž”แŸ’แžšแžพแž”แŸ’แžšแž—แŸแž‘แžšแž„แž“แŸƒแž”แŸ’แžšแž—แŸแž‘แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แžŠแŸ„แž™แž˜แžทแž“แžŠแžนแž„แžแŸ’แž›แžฝแž“แŸ”
  • แž“แŸแŸ‡ Iแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แŸ‚แž„แž…แŸ‚แž€แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹โ€Š (แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แŸ†แž”แŸ‚แž€แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹) แŸ” แžขแž„แŸ’แž‚แž—แžถแž–แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž˜แžทแž“แž‚แžฝแžšแž–แžนแž„แž•แŸ’แžขแŸ‚แž€แž›แžพแžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแžŠแŸ‚แž›แž–แžฝแž€แž‚แŸแž˜แžทแž“แž”แŸ’แžšแžพแž‘แŸแŸ”
  • แž“แŸแŸ‡ Dแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แž‰แŸ’แž…แŸ’แžšแžถแžŸแž—แžถแž–แžฏแž€แžšแžถแž‡แŸ’แž™ (แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž“แŸƒแž€แžถแžšแž”แž‰แŸ’แž…แŸ’แžšแžถแžŸแž—แžถแž–แžขแžถแžŸแŸ’แžšแŸแž™) แŸ” แž˜แŸ‰แžผแžŒแžปแž›แž“แŸ…แž€แž˜แŸ’แžšแžทแžแžแŸ’แž–แžŸแŸ‹แž˜แžทแž“แž‚แžฝแžšแž–แžนแž„แž•แŸ’แžขแŸ‚แž€แž›แžพแž˜แŸ‰แžผแžŒแžปแž›แž“แŸ…แž€แž˜แŸ’แžšแžทแžแž‘แžถแž”แž‘แŸแŸ”

แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแžแŸ‚แž˜แžฝแž™

โ€Š
แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแžแŸ‚แž˜แžฝแž™ (SRP) แž…แŸ‚แž„แžแžถแžแŸ’แž“แžถแž€แŸ‹ แžฌแž˜แŸ‰แžผแžŒแžปแž›แž“แžธแž˜แžฝแž™แŸ—แž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‚แžฝแžšแžแŸ‚แž‘แž‘แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž…แŸ†แž–แŸ„แŸ‡แžแŸ‚แž•แŸ’แž“แŸ‚แž€แž˜แžฝแž™แž“แŸƒแž˜แžปแžแž„แžถแžšแžšแž”แžŸแŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž“แŸ„แŸ‡แŸ” แž›แžพแžŸแž–แžธแž“แŸแŸ‡ แž’แžถแžแžปแž“แŸƒแž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž“แŸแŸ‡แž‚แžฝแžšแžแŸ‚แžแŸ’แžšแžผแžœแž”แžถแž“แž…แžถแžแŸ‹แžแžถแŸ†แž„แž‘แŸ…แžแŸ’แž“แžถแž€แŸ‹แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแž•แŸ’แž‘แžถแž›แŸ‹ แž‡แžถแž‡แžถแž„แž€แžถแžšแžแŸ’แž…แžถแžแŸ‹แžแŸ’แž…แžถแž™แž“แŸ…แž‘แžผแž‘แžถแŸ†แž„แžแŸ’แž“แžถแž€แŸ‹แžŠแŸ‚แž›แž˜แžทแž“แž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’แŸ” แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แž“แžทแž„แž‡แžถแž”แŸ’แžšแž’แžถแž“แžขแŸ’แž“แž€แž•แŸ’แžŸแžถแž™แžŠแŸ†แžŽแžนแž„แž›แŸ’แžขแžšแž”แžŸแŸ‹ SRP แž›แŸ„แž€ Robert S. Martin แž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแž€แžถแžšแž‘แž‘แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž‡แžถแž แŸแžแžปแž•แž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแŸ” แžŠแžพแž˜แžกแžพแž™แž‚แžถแžแŸ‹แž”แžถแž“แžŸแŸ’แž“แžพแž–แžถแž€แŸ’แž™แž“แŸแŸ‡แž‡แžถแž’แžถแžแžปแž˜แžฝแž™แž“แŸƒแž€แžถแžšแž„แžถแžšแžšแž”แžŸแŸ‹แž‚แžถแžแŸ‹ "แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž“แŸƒแž€แžถแžšแžšแž…แž“แžถแžแž˜แŸ’แžšแž„แŸ‹แž‘แžทแžŸแžœแžแŸ’แžแžป" แŸ” แž‚แŸ†แž“แžทแžแž“แŸแŸ‡แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž“แžผแžœแž‚แŸ†แžšแžผแž“แŸƒแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž‡แžถแž…แŸ’แžšแžพแž“ แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž–แžธแž˜แžปแž“แžŠแŸ„แž™ Tom DeMarco แŸ”

แž‚แŸ„แž›โ€‹แž‚แŸ†แž“แžทแžโ€‹แž“แŸแŸ‡โ€‹แž€แŸโ€‹แžšแžฝแž˜โ€‹แž”แž‰แŸ’แž…แžผแž›โ€‹แž‚แŸ†แž“แžทแžโ€‹แž‡แžถโ€‹แž…แŸ’แžšแžพแž“โ€‹แžŠแŸ‚แž›โ€‹แž”แž„แŸ’แž€แžพแžโ€‹แžกแžพแž„โ€‹แžŠแŸ„แž™โ€‹แž›แŸ„แž€ David ParnasแŸ” แž…แŸ†แžŽแžปแž…แžŸแŸ†แžแžถแž“แŸ‹แž–แžธแžšแž‚แžบแž€แžถแžšแž”แžทแž‘แž”แžถแŸ†แž„ แž“แžทแž„แž€แžถแžšแž›แžถแž€แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แŸ” Parnas แž”แžถแž“แžขแŸ‡แžขแžถแž„แžแžถ แž€แžถแžšแž”แŸ‚แž„แž…แŸ‚แž€แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‘แŸ…แž‡แžถแž˜แŸ‰แžผแžŒแžปแž›แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€ แž˜แžทแž“แž‚แžฝแžšแž•แŸ’แžขแŸ‚แž€แž›แžพแž€แžถแžšแžœแžทแž—แžถแž‚แž“แŸƒแžŠแŸ’แž™แžถแž€แŸ’แžšแžถแž˜แž”แŸ’แž›แžปแž€ แžฌแž›แŸ†แž แžผแžšแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž“แŸ„แŸ‡แž‘แŸแŸ” แž˜แŸ‰แžผแžŒแžปแž›แžŽแžถแž˜แžฝแž™แžแŸ’แžšแžผแžœแžแŸ‚แž˜แžถแž“แžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™แžŠแŸ‚แž›แž•แŸ’แžแž›แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžขแž”แŸ’แž”แž”แžšแž˜แžถแžŠแž›แŸ‹แžขแžแžทแžแžทแž‡แž“แŸ”

แžŠแŸ„แž™แžœแžทแž’แžธแž“แŸแŸ‡ แž˜แŸ‰แžถแž‘แžธแž“แž”แžถแž“แž•แŸ’แžแž›แŸ‹แžงแž‘แžถแž แžšแžŽแŸแžŠแŸแž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž˜แžฝแž™แž‡แžถแž˜แžฝแž™แžขแŸ’แž“แž€แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž‡แžถแž“แŸ‹แžแŸ’แž–แžŸแŸ‹แž“แŸƒแž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แž˜แžฝแž™ (COO, CTO, CFO) แžŠแŸ‚แž›แž˜แŸ’แž“แžถแž€แŸ‹แŸ—แž”แŸ’แžšแžพแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžขแžถแž‡แžธแžœแž€แž˜แŸ’แž˜แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸ„แž›แž”แŸ†แžŽแž„แž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถแŸ” แž‡แžถแž›แž‘แŸ’แž’แž•แž› แž–แžฝแž€แž‚แŸแžขแžถแž…แžขแž“แžปแžœแžแŸ’แžแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ„แž™แž˜แžทแž“แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แžŠแž›แŸ‹แž•แž›แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแŸ”

แžœแžแŸ’แžแžปแžŠแŸแž‘แŸแžœแž—แžถแž–

แžŠแžผแž…แžŸแž–แŸ’แžœแžŠแž„ แžœแžทแž’แžธแž›แŸ’แžขแž”แŸ†แž•แžปแžแžŠแžพแž˜แŸ’แž”แžธแžšแŸ€แž“ แžŸแž˜ แžšแž„แŸ’แžŸแŸŠแžธ แž‚แžบแžแŸ’แžšแžผแžœแž˜แžพแž›แžœแžถแž“แŸ…แž€แŸ’แž“แžปแž„แžŸแž€แž˜แŸ’แž˜แž—แžถแž–แŸ” แžŸแžผแž˜แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แž•แŸ’แž“แŸ‚แž€แž˜แžฝแž™แž“แŸƒแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ‚แž›แž˜แžทแž“แžขแž“แžปแžœแžแŸ’แžแžแžถแž˜แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแžแŸ‚แž˜แžฝแž™แŸ” แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แžผแžŠ 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

แžแžถแž˜แž–แžทแžแžŸแŸ’แžแžถแž“แžธแž™แŸแžขแžœแž€แžถแžŸแžšแž”แžŸแŸ‹แž™แžพแž„แž˜แžทแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‘แŸ (แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž‚แžทแžแžแžถแžแŸ’แž‰แžปแŸ†แž“แžนแž„แž‘แž‘แžฝแž›แž”แžถแž“แž€แžถแžšแž แŸ…แž‘แžผแžšแžŸแŸแž–แŸ’แž‘แž–แžธ NASA แž‚แŸ’แžšแž”แŸ‹แž–แŸแž›แž“แŸ„แŸ‡แž‘แŸ) แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž˜แžถแž“แžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแžœแžทแž—แžถแž‚แž“แŸ…แž‘แžธแž“แŸแŸ‡แŸ”

แžŠแžผแž…แŸ’แž“แŸแŸ‡ แžแŸ’แž“แžถแž€แŸ‹ SpaceStation แž˜แžถแž“แž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถแž‡แžถแž…แŸ’แžšแžพแž“ (แžฌแž—แžถแžšแž€แžทแž…แŸ’แž…)แŸ” แž–แžฝแž€แžœแžถแž‘แžถแŸ†แž„แžขแžŸแŸ‹แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ‚แž„แž…แŸ‚แž€แž‡แžถแž”แŸ’แžšแž—แŸแž‘แŸ–

  • แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แžŸแž‰แŸ’แž‰แžถ;
  • แž€แžถแžšแž•แŸ’แž‚แžแŸ‹แž•แŸ’แž‚แž„แŸ‹ (แžŸแž˜แŸ’แž—แžถแžšแŸˆแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹);
  • แžฅแž“แŸ’แž’แž“แŸˆ;
  • แžงแž”แž€แžšแžŽแŸแž”แž„แŸ’แž€แžพแž“แž›แŸ’แž”แžฟแž“แŸ”

แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž‚แŸ’แž˜แžถแž“แž“แžทแž™แŸ„แž‡แžทแžแžšแž”แžŸแŸ‹แžŸแŸ’แžแžถแž“แžธแž™แŸแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž…แžถแžแŸ‹แžแŸ’แž“แžถแž€แŸ‹แž˜แžฝแž™แž€แŸแžŠแŸ„แž™ แž™แžพแž„แžขแžถแž…แžŸแŸ’แžšแž˜แŸƒแž”แžถแž“แž™แŸ‰แžถแž„แž„แžถแž™แžแžถแžขแŸ’แž“แž€แžŽแžถแž‡แžถแžขแŸ’แž“แž€แž‘แž‘แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž…แŸ†แž–แŸ„แŸ‡แžขแŸ’แžœแžธแŸ” แž—แžถแž‚แž…แŸ’แžšแžพแž“แž‘แŸ†แž“แž„แž‡แžถแžขแŸ’แž“แž€แžœแžทแž‘แŸ’แž™แžถแžŸแžถแžŸแŸ’แžแŸ’แžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แžŸแž‰แŸ’แž‰แžถ แž—แžŸแŸ’แžแžปแž—แžถแžšแž‘แž‘แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž€แŸ’แž“แžปแž„แž€แžถแžšแž•แŸ’แž‚แžแŸ‹แž•แŸ’แž‚แž„แŸ‹แž’แž“แž’แžถแž“ แžœแžทแžŸแŸ’แžœแž€แžšแž‘แž‘แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแž›แžพแž€แžถแžšแž•แŸ’แž‚แžแŸ‹แž•แŸ’แž‚แž„แŸ‹แž”แŸ’แžšแŸแž„แžฅแž“แŸ’แž’แž“แŸˆ แž แžพแž™แžขแŸ’แž“แž€แž”แžพแž€แž”แžšแž‡แžถแžขแŸ’แž“แž€แžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžงแž”แž€แžšแžŽแŸแž‡แŸ†แžšแžปแž‰แŸ”

แžแžพโ€‹แž™แžพแž„โ€‹แžขแžถแž…โ€‹แž“แžทแž™แžถแž™โ€‹แžแžถโ€‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธโ€‹แž“แŸแŸ‡โ€‹แž˜แžทแž“โ€‹แžŸแŸ’แžšแž”โ€‹แžแžถแž˜โ€‹แž‚แžŽแž”แž€แŸ’แžŸ แžŸแž˜ แžšแž„แŸ’แžŸแŸŠแžธ แž‘แŸ? แž”แŸ’แžšแžถแž€แžŠแž แžพแž™แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžแŸ’แž“แžถแž€แŸ‹ 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; แž’แžปแž„แžŸแžถแŸ†แž„; แžขแŸ’แž“แž€แžšแžปแž‰แž…แŸ’แžšแžถแž“แŸ”

แž˜แžถแž“แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžŸแŸ†แžแžถแž“แŸ‹แŸ—แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแŸ‚แž“แŸƒแž€แžผแžŠแž“แŸแŸ‡แŸ” แž…แŸ†แž“แžปแž…แž“แŸ„แŸ‡แž‚แžบแžแžถแž˜แžปแžแž„แžถแžšแž“แžธแž˜แžฝแž™แŸ—แž˜แžทแž“แžแŸ’แžšแžนแž˜แžแŸ‚แžแŸ’แžšแžผแžœแž”แžถแž“แžšแžปแŸ†แž–แŸแž‘แŸ’แž’แž“แŸ…แž€แŸ’แž“แžปแž„แžแŸ’แž“แžถแž€แŸ‹แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แž‘แŸ แž–แžฝแž€แž‚แŸแžแŸ’แžšแžผแžœแž”แžถแž“แžšแŸ€แž”แž…แŸ†แžแžถแž˜แžšแž”แŸ€แž”แžŠแŸ‚แž›แžขแžถแž…แž–แŸ’แž™แžถแž€แžšแžŽแŸแž”แžถแž“ แž“แžทแž„แžŸแŸ’แžšแž”แŸ” แž™แžพแž„แžŠแžถแž€แŸ‹แž‡แžถแž€แŸ’แžšแžปแž˜แž’แžถแžแžปแžŠแŸ‚แž›แž˜แžถแž“แž˜แžปแžแž„แžถแžšแžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถ แžŠแžพแž˜แŸ’แž”แžธแžขแž“แžปแžœแžแŸ’แžแžแžถแž˜แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž“แŸƒแž—แžถแž–แžŸแŸŠแžธแžŸแž„แŸ’แžœแžถแž€แŸ‹แž‚แŸ’แž“แžถแŸ” แžฅแžกแžผแžœแž“แŸแŸ‡ แž”แŸ’แžšแžŸแžทแž“แž”แžพแž™แžพแž„แžแŸ’แžšแžผแžœแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžšแž”แŸ€แž”แžŠแŸ‚แž›แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ†แžŽแžพแžšแž€แžถแžš แžŠแŸ„แž™แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž–แžธแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ hash แž‘แŸ… array แž“แŸ„แŸ‡แž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แž”แŸ’แžšแžพ SupplyHold class แž™แžพแž„แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แž”แŸ‰แŸ‡แž˜แŸ‰แžผแžŒแžปแž›แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž‘แŸแŸ” แžœแžทแž’แžธแž“แŸแŸ‡ แž”แŸ’แžšแžŸแžทแž“แž”แžพแž˜แž“แŸ’แžแŸ’แžšแžธแž—แžŸแŸ’แžแžปแž—แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžขแŸ’แžœแžธแž˜แžฝแž™แž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž“แŸ‚แž€แžšแž”แžŸแŸ‹แž‚แžถแžแŸ‹ แžŸแŸ’แžแžถแž“แžธแž™แžŠแŸ‚แž›แž“แŸ…แžŸแž›แŸ‹แž“แžนแž„แž“แŸ…แžŠแžŠแŸ‚แž›แŸ” แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž“แŸแŸ‡ แžแŸ’แž“แžถแž€แŸ‹ SpaceStation แž“แžนแž„แž˜แžทแž“แžŠแžนแž„แžขแŸ†แž–แžธแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‘แŸแŸ”

แž˜แž“แŸ’แžแŸ’แžšแžธแžšแž”แžŸแŸ‹แž™แžพแž„แžŠแŸ‚แž›แž’แŸ’แžœแžพแž€แžถแžšแž“แŸ…แžŸแŸ’แžแžถแž“แžธแž™แŸแžขแžœแž€แžถแžŸแž”แŸ’แžšแž แŸ‚แž›แž‡แžถแžŸแž”แŸ’แž”แžถแž™แž…แžทแžแŸ’แžแž…แŸ†แž–แŸ„แŸ‡แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž“แŸแŸ‡ แž–แžธแž–แŸ’แžšแŸ„แŸ‡แž–แžฝแž€แž‚แŸแžขแžถแž…แžŸแŸ’แž“แžพแžŸแžปแŸ†แžขแŸ’แžœแžธแžŠแŸ‚แž›แž–แžฝแž€แž‚แŸแžแŸ’แžšแžผแžœแž€แžถแžšแŸ” แžŸแžผแž˜แž€แžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžแžถแž€แžผแžŠแž˜แžถแž“แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแžŠแžผแž…แž‡แžถ report_supplies แž“แžทแž„ report_fuel แžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„แžแŸ’แž“แžถแž€แŸ‹ SupplyHold แž“แžทแž„ FuelTank แŸ” แžแžพโ€‹แž“แžนแž„โ€‹แž˜แžถแž“โ€‹แžขแŸ’แžœแžธโ€‹แž€แžพแžโ€‹แžกแžพแž„โ€‹แž”แŸ’แžšแžŸแžทแž“โ€‹แž”แžพ Earth แžŸแžปแŸ†โ€‹แžฑแŸ’แž™โ€‹แž•แŸ’แž›แžถแžŸแŸ‹โ€‹แž”แŸ’แžแžผแžšโ€‹แžšแž”แŸ€แž”โ€‹แžšแžถแž™แž€แžถแžšแžŽแŸ? แžแŸ’แž“แžถแž€แŸ‹แž‘แžถแŸ†แž„แž–แžธแžšแž‚แžบ 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 แŸ” แž–แžฝแž€แž‚แŸโ€‹แž‘แžถแŸ†แž„โ€‹แž–แžธแžšโ€‹แž“แžถแž€แŸ‹โ€‹แž‡แžถโ€‹แž€แžผแž“โ€‹แž€แŸ’แžšแžปแž˜โ€‹แžขแŸ’แž“แž€โ€‹แžšแžถแž™แž€แžถแžšแžŽแŸแŸ” แž›แžพแžŸแž–แžธแž“แŸแŸ‡แž‘แŸ€แž แž™แžพแž„แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แžขแžแŸแžš instance แž‘แŸ…แžแŸ’แž“แžถแž€แŸ‹ SpaceStation แžŠแžผแž…แŸ’แž“แŸแŸ‡แžแŸ’แž“แžถแž€แŸ‹แžšแž„แžŠแŸ‚แž›แž…แž„แŸ‹แž”แžถแž“แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž”แŸ’แžšแžŸแžทแž“แž”แžพแž…แžถแŸ†แž”แžถแž…แŸ‹แŸ” แžฅแžกแžผแžœแž“แŸแŸ‡ แž”แŸ’แžšแžŸแžทแž“แž”แžพแž•แŸ‚แž“แžŠแžธแžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžขแŸ’แžœแžธแž•แŸ’แžŸแŸแž„แž‘แŸ€แž แž“แŸ„แŸ‡แž™แžพแž„แž“แžนแž„แž’แŸ’แžœแžพแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‘แŸ…แž›แžพแžแŸ’แž“แžถแž€แŸ‹แžšแž„ แž แžพแž™แž˜แžทแž“แž˜แŸ‚แž“แž‘แŸ…แž›แžพแžแŸ’แž“แžถแž€แŸ‹แž˜แŸแž“แŸ„แŸ‡แž‘แŸแŸ”

แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹ แžแŸ’แž“แžถแž€แŸ‹แžแŸ’แž›แŸ‡แžšแž”แžŸแŸ‹แž™แžพแž„แž“แŸ…แžแŸ‚แžขแžถแžŸแŸ’แžšแŸแž™แž‚แŸ’แž“แžถแž‘แŸ…แžœแžทแž‰แž‘แŸ…แž˜แž€แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แžœแžแŸ’แžแžป SupplyReporter แžขแžถแžŸแŸ’แžšแŸแž™แž›แžพ SupplyHold แž แžพแž™ FuelReporter แžขแžถแžŸแŸ’แžšแŸแž™แž›แžพ FuelTank แŸ” แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹ แž”แŸŠแžผแžŸแŸแžšแžแŸ’แžšแžผแžœแžแŸ‚แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž“แžนแž„แž’แžปแž„แžŸแžถแŸ†แž„แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸ…แž‘แžธแž“แŸแŸ‡แžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แž˜แžพแž›แž‘แŸ…แžŸแž˜แž แŸแžแžปแžŸแž˜แž•แž›แžšแžฝแž…แž แžพแž™ แž แžพแž™แž€แžถแžšแž’แŸ’แžœแžพแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž“แžนแž„แž˜แžทแž“แž–แžทแž”แžถแž€แž‡แžถแž–แžทแžŸแŸแžŸแž“แŸ„แŸ‡แž‘แŸ - แž€แžถแžšแž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž›แž€แžผแžŠแž“แŸƒแžœแžแŸ’แžแžปแž˜แžฝแž™แž“แžนแž„แž˜แžทแž“แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แž™แŸ‰แžถแž„แžแŸ’แž›แžถแŸ†แž„แžŠแž›แŸ‹แžœแžแŸ’แžแžปแž˜แžฝแž™แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž“แŸ„แŸ‡แž‘แŸแŸ”

แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™ แž™แžพแž„แž”แžถแž“แž”แž„แŸ’แž€แžพแžแž€แžผแžŠแž˜แŸ‰แžผแžŒแžปแž› แžŠแŸ‚แž›แž‘แŸ†แž“แžฝแž›แžแžปแžŸแžแŸ’แžšแžผแžœแžšแž”แžŸแŸ‹แžœแžแŸ’แžแžป/แžแŸ’แž“แžถแž€แŸ‹แž“แžธแž˜แžฝแž™แŸ—แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž™แŸ‰แžถแž„แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แŸ” แž€แžถแžšแž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž€แžผแžŠแž”แŸ‚แž”แž“แŸแŸ‡แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž”แž‰แŸ’แž แžถแž‘แŸ แž€แžถแžšแžแŸ‚แžšแž€แŸ’แžŸแžถแžœแžถแž“แžนแž„แž‡แžถแž€แžทแž…แŸ’แž…แž€แžถแžšแžŸแžถแž˜แž‰แŸ’แž‰แŸ” แž™แžพแž„แž”แžถแž“แž”แŸ†แž”แŸ’แž›แŸ‚แž„ โ€œแžœแžแŸ’แžแžปแžŠแŸแž‘แŸแžœแž—แžถแž–โ€ แž‘แžถแŸ†แž„แž˜แžผแž›แž‘แŸ…แž‡แžถ SRP แŸ”

Skillbox แžŽแŸ‚แž“แžถแŸ†แŸ–

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹