เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ SOLID

เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ SOLID

เบˆเบฒเบเบ™เบฑเบเปเบ›: เบˆเบฑเบ”เบžเบตเบกเบกเบฒเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™ เบšเบปเบ”เบ„เบงเบฒเบกเป‚เบ”เบ Severin Perez เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบผเบฑเบเบเบฒเบ™ SOLID เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเบฒเบโ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบ›เบฐโ€‹เป‚เบซเบเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ—เบฑเบ‡โ€‹เบœเบนเป‰โ€‹เป€เบฅเบตเปˆเบกโ€‹เปเบฅเบฐโ€‹เบœเบนเป‰โ€‹เบ‚เบฝเบ™โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ›เบฐโ€‹เบชเบปเบšโ€‹เบเบฒเบ™โ€‹.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ—เปˆเบฒเบ™เบกเบฑเบเบˆเบฐเป„เบ”เป‰เบเบดเบ™เบเปˆเบฝเบงเบเบฑเบšเบซเบผเบฑเบเบเบฒเบ™ SOLID. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบฎเบฑเบ”เปƒเบซเป‰เบœเบนเป‰เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฐเบญเบฒเบ”, เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบ”เบตเปเบฅเบฐเบชเบฒเบกเบฒเบ”เบฎเบฑเบเบชเบฒเป„เบ”เป‰เบ‡เปˆเบฒเบ. เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบกเบตเบซเบฅเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เปเบฅเบฐเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบเปˆเบฝเบงเบเบฑเบš "เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡", เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ„เบปเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ›เบฐเบเบฒเบ”เปƒเบ™ SOLID เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบšเป‚เบ”เบเบœเบนเป‰เบ•เบฒเบ‡เบซเบ™เป‰เบฒเป€เบเบทเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบŠเบธเบกเบŠเบปเบ™ IT. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบตเบ”เปƒเบซเบกเปˆเปเบฅเบฐเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเบ”เบตเบซเบผเบฒเบ.

เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบซเบผเบฑเบเบเบฒเบ™ SOLID เปเบกเปˆเบ™เบซเบเบฑเบ‡ เปเบฅเบฐเบกเบฑเบ™เบŠเปˆเบงเบเบžเบงเบเป€เบฎเบปเบฒเปเบ™เบงเปƒเบ”.

Skillbox เปเบ™เบฐเบ™เปเบฒ: เบซเบผเบฑเบเบชเบนเบ”เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ” "เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบกเบทเบ–เบท PRO".

เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™: เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "Habr" - เบชเปˆเบงเบ™เบซเบผเบธเบ” 10 rubles เป€เบกเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบซเบผเบฑเบเบชเบนเบ” Skillbox เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบก "Habr".

SOLID เปเบกเปˆเบ™เบซเบเบฑเบ‡?

เบ„เปเบฒเบชเบฑเบšเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบซเบเปเป‰, เปเบ•เปˆเบฅเบฐเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเบšเปเบกเปˆเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบŠเบทเปˆเบ‚เบญเบ‡เบซเบผเบฑเบเบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐ:

  • Sเบซเบผเบฑเบเบเบฒเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบš. เป‚เบกเบ”เบนเบ™เบชเบฒเบกเบฒเบ”เบกเบตเป€เบซเบ”เบœเบปเบ™เบญเบฑเบ™เบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.
  • เป„เบ”เป‰ Oเบ›เบฒเบเบเบฒ/เบซเบผเบฑเบเบเบฒเบ™เบ›เบดเบ” (เบซเบผเบฑเบเบเบฒเบ™เป€เบ›เบตเบ”/เบ›เบดเบ”). เบซเป‰เบญเบ‡เบฎเบฝเบ™เปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบญเบทเปˆเบ™เป†เบ„เบงเบ™เบˆเบฐเป€เบ›เบตเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ, เปเบ•เปˆเบ›เบดเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบฑเบ”เปเบเป‰.
  • โ€Šเป„เบ”เป‰ Liskov เบซเบผเบฑเบเบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™ (เบซเบผเบฑเบเบเบฒเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™ Liskov). เบซเบ™เป‰เบฒเบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบ›เบฐเป€เบžเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เบ„เบงเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ subtypes เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ”เบเบšเปเปˆเบฎเบนเป‰เบ•เบปเบง.
  • เป„เบ”เป‰ Iเบซเบผเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšโ€Š (เบซเบผเบฑเบเบเบฒเบ™เปเบเบเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš). เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบŠเบญเบšเปเบงเบšเปเปˆเบ„เบงเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰.
  • เป„เบ”เป‰ Dเบซเบผเบฑเบเบเบฒเบ™เบเบฒเบ™เบ›เบตเป‰เบ™เบเบฑเบš ependency (เบซเบผเบฑเบโ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบตเป‰เบ™โ€‹เบเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป€เบžเบดเปˆเบ‡โ€‹เบžเบฒโ€‹เบญเบฒโ€‹เป„เบชโ€‹)โ€‹. เป‚เบกเบ”เบนเบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบเบงเปˆเบฒเบšเปเปˆเบ„เบงเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเป‚เบกเบ”เบนเบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ.

เบซเบผเบฑเบเบเบฒเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ”เบฝเบง

โ€Š
เบซเบผเบฑเบเบเบฒเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ”เบฝเบง (SRP) เบฅเบฐเบšเบธเบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบซเป‰เบญเบ‡เบฎเบฝเบ™เบซเบผเบทเป‚เบกเบ”เบนเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ„เบงเบ™เบˆเบฐเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบžเบฝเบ‡เปเบ•เปˆเบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ™เบฑเป‰เบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบเบฐเปเบˆเบเบเบฐเบˆเบฒเบเป„เบ›เบ—เบปเปˆเบงเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ—เบตเปˆเบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡. เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเบœเบนเป‰เบ›เบฐเบเบฒเบ”เบ‚เปˆเบฒเบงเบ›เบฐเป€เบชเบตเบ”เบ‚เบญเบ‡ SRP, Robert S. Martin, เบญเบฐเบ—เบดเบšเบฒเบเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเป€เบ›เบฑเบ™เป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบฅเบฒเบงเป„เบ”เป‰เบชเบฐเป€เบซเบ™เบตเบ„เปเบฒเบ™เบตเป‰เป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบฅเบฒเบง "เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡". เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบฅเบงเบกเป€เบญเบปเบฒเบซเบผเบฒเบเบฎเบนเบšเปเบšเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เป‚เบ”เบ Tom DeMarco.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบเบฑเบ‡เบฅเบงเบกเป€เบญเบปเบฒเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบ David Parnas. เบชเบญเบ‡เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™ encapsulation เปเบฅเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™. Parnas เป‚เบ•เป‰เบ–เบฝเบ‡เบงเปˆเบฒเบเบฒเบ™เปเบšเปˆเบ‡เบฅเบฐเบšเบปเบšเป€เบ›เบฑเบ™เป‚เบกเบ”เบนเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบšเปเปˆเบ„เบงเบ™เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบœเบ™เบงเบฒเบ”เบ•เบฑเบ™เบซเบผเบทเบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบ—เบธเบเป†เป‚เบกเบ”เบนเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบชเบฐเป€เบžเบฒเบฐเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเปƒเบซเป‰เปเบเปˆเบฅเบนเบเบ„เป‰เบฒ.

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, Martin เป„เบ”เป‰เปƒเบซเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบเบฑเบšเบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบญเบฒเบงเบธเป‚เบชเบ‚เบญเบ‡เบšเปเบฅเบดเบชเบฑเบ” (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

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบชเบฐเบ–เบฒเบ™เบตเบญเบฒเบงเบฐเบเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบ›เบปเบเบเบฐเบ•เบด (เบ‚เป‰เบญเบเบšเปเปˆเบ„เบดเบ”เบงเปˆเบฒเบ‚เป‰เบญเบเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป‚เบ—เบซเบฒเบˆเบฒเบเบญเบปเบ‡เบเบฒเบ™ NASA เบ—เบฑเบ™เบ—เบต), เปเบ•เปˆเบกเบตเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเบงเบดเป€เบ„เบฒเบฐเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบซเป‰เบญเบ‡เบฎเบฝเบ™ SpaceStation เบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ (เบซเบผเบทเบงเบฝเบเบ‡เบฒเบ™). เบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เปเบปเบ”เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบ›เบฐเป€เบžเบ”:

  • เป€เบŠเบฑเบ™เป€เบŠเบต;
  • เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™ (เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹เบญเบธโ€‹เบ›เบฐโ€‹เป‚เบžเบโ€‹)โ€‹;
  • เบ™เปเป‰เบฒเบกเบฑเบ™;
  • เป€เบ„เบทเปˆเบญเบ‡เป€เบฅเบฑเปˆเบ‡.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเปเปˆเบกเบตเบžเบฐเบ™เบฑเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบตเป„เบ”เป‰เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบซเป‰เบญเบ‡เบฎเบฝเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เป„เบ”เป‰เบ‡เปˆเบฒเบเบงเปˆเบฒเปƒเบœเป€เบ›เบฑเบ™เบœเบนเป‰เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆ. เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐ, เบ™เบฑเบเบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”เบ„เบงเบšเบ„เบธเบก sensors, logistician เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™, เบงเบดเบชเบฐเบงเบฐเบเบญเบ™เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบ™เปเป‰เบฒเบกเบฑเบ™เป€เบŠเบทเป‰เบญเป„เบŸ, เปเบฅเบฐเบ™เบฑเบเบšเบดเบ™เบ„เบงเบšเบ„เบธเบก boosters.

เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเบงเปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เบšเปเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบš SRP? เป€เบˆเบปเป‰เบฒโ€‹เปเบ™เปˆโ€‹เบ™เบญเบ™. เปเบ•เปˆเบซเป‰เบญเบ‡เบฎเบฝเบ™ SpaceStation เปเบกเปˆเบ™ "เบงเบฑเบ”เบ–เบธเบ‚เบญเบ‡เบžเบฃเบฐเป€เบˆเบปเป‰เบฒ" เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเบฎเบนเป‰เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบฅเบฐเป€เบฎเบฑเบ”เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ•เปเปˆเบ•เป‰เบฒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเปเบšเบšเบงเบฑเบ”เบ–เบธ. เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบงเบฑเบ”เบ–เบธเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบกเปˆเบ™เบเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒ. เบกเบฒเบฎเบญเบ”เบ›เบฐเบˆเบธ, เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ, เปเบกเปˆเบ™เปเบฅเป‰เบง, เปเบ•เปˆเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบซเบกเปˆ. เบšเบฒเบ‡เบ—เบตเบชเบฐเบ–เบฒเบ™เบตเบญเบฒเบงเบฐเบเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบกเบตเบชเบฐเบ–เบฒเบ™เบตเบเบฒเบ™เปเบžเบ” เบซเบผเบทเบซเป‰เบญเบ‡เบ›เบฐเบŠเบธเบก. เปเบฅเบฐเบซเบผเบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบกเบต, SpaceStation เบซเบผเบฒเบเบˆเบฐเบ‚เบฐเบซเบเบฒเบเบ•เบปเบง. เบ”เบต, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ™เบตเป‰เบˆเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบœเบนเป‰เบญเบทเปˆเบ™, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบฅเบปเบšเบเบงเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบฅเบฑเปˆเบ‡. เบ–เป‰เบฒเบ™เบฑเบเบ„เบปเป‰เบ™เบ„เบงเป‰เบฒเบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบŠเบฑเบ™เป€เบŠเบต, เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบฅเบฐเบšเบปเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบตเป„เบ”เป‰เบ”เบตเบซเบผเบฒเบ.

เบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡ SRP เบญเบฒเบ”เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป„เบŠเบŠเบฐเบ™เบฐเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบเบธเบ”เบ—เบฐเบงเบดเบ—เบตเปƒเบ™เป„เบฅเบเบฐเบชเบฑเป‰เบ™, เปเบ•เปˆเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐ "เบชเบนเบ™เป€เบชเบเบชเบปเบ‡เบ„เบฒเบก", เปเบฅเบฐเบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒ monster เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”. เบกเบฑเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเปเบšเปˆเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบญเบญเบเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบชเบฐเป€เบžเบฒเบฐ. เป€เบ‚เบปเป‰เบฒเปƒเบˆเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เปƒเบซเป‰เบ›เปˆเบฝเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ SpaceStation.

เปเบšเปˆเบ‡เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบš

เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบชเบตเปˆเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ„เบงเบšเบ„เบธเบกเป‚เบ”เบเบŠเบฑเป‰เบ™ SpaceStation. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบฎเบฑเบเบชเบฒเบžเบงเบเป€เบ‚เบปเบฒเบขเบนเปˆเปƒเบ™เปƒเบˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ refactoring. เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เปƒเบซเป‰เบเบปเบ‡เบเบฑเบš 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 เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบžเบฒเบŠเบฐเบ™เบฐเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบตเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบ‚เบถเป‰เบ™เบเบฑเบš, เบฅเบงเบกเบ—เบฑเบ‡เบŠเบธเบ”เบ‚เบญเบ‡เป€เบŠเบฑเบ™เป€เบŠเบต, เบฅเบฐเบšเบปเบšเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบ, เบ–เบฑเบ‡เบ™เปเป‰เบฒเบกเบฑเบ™, เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบเบฐเบ•เบธเป‰เบ™.

เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ•เบปเบงโ€‹เปเบ›โ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบกเบตโ€‹เบŠเบฑเป‰เบ™โ€‹เบ—เบตเปˆโ€‹เบชเบญเบ”โ€‹เบ„เป‰เบญเบ‡โ€‹เบเบฑเบ™โ€‹: Sensorsโ€‹; SupplyHold; FuelTank; เปเบฎเบ‡เบ”เบฑเบ™.

เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบฅเบฐเบซเบฑเบ”เบชเบฐเบšเบฑเบšเบ™เบตเป‰. เบˆเบธเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบšเบธเบเบ„เบปเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบ–เบทเบเบซเบธเป‰เบกเบซเปเปˆเบขเบนเปˆเปƒเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบ•เบฑเป‰เบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบเบฒเบ™เบ„เบฒเบ”เป€เบ”เบปเบฒเปเบฅเบฐเบชเบญเบ”เบ„เปˆเบญเบ‡. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฑเบ”เบเบธเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบ”เบ„เปˆเบญเบ‡. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš, เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบˆเบฒเบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ hash เป„เบ›เบซเบฒ array, เบžเบฝเบ‡เปเบ•เปˆเปƒเบŠเป‰เบซเป‰เบญเบ‡เบฎเบฝเบ™ 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. เบžเบงเบเป€เบ‚เบปเบฒเบ—เบฑเบ‡เบชเบญเบ‡เป€เบ›เบฑเบ™เป€เบ”เบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบฑเบเบ‚เปˆเบฒเบง. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบ•เบปเบงเปเบ› instance เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™ SpaceStation เป€เบžเบทเปˆเบญเปƒเบซเป‰ subclass เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป„เบ”เป‰เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบ–เป‰เบฒเปเบœเปˆเบ™เบ”เบดเบ™เป‚เบฅเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™เปเบ›เบ‡เบชเบดเปˆเบ‡เบญเบทเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบŠเบฑเป‰เบ™เบเปˆเบญเบ, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบŠเบฑเป‰เบ™เบ•เบปเป‰เบ™เบ•เป.

เปเบ™เปˆเบ™เบญเบ™, เบšเบฒเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบฑเบ”เบ–เบธ SupplyReporter เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบš SupplyHold, เปเบฅเบฐ FuelReporter เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบš FuelTank. เปเบ™เปˆเบ™เบญเบ™, เป€เบ„เบทเปˆเบญเบ‡เบเบฐเบ•เบธเป‰เบ™เบ•เป‰เบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฑเบ‡เบ™เปเป‰เบฒเบกเบฑเบ™. เปเบ•เปˆเปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบกเบตเป€เบซเบ”เบœเบปเบ™, เปเบฅเบฐเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบˆเบฐเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ - เบเบฒเบ™เปเบเป‰เป„เบ‚เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเบซเบ™เบถเปˆเบ‡เบˆเบฐเบšเปเปˆเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเบ•เปเปˆเบชเบดเปˆเบ‡เบญเบทเปˆเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ” modular เบ—เบตเปˆเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบงเบฑเบ”เบ–เบธ / เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เบขเปˆเบฒเบ‡เปเบ™เปˆเบ™เบญเบ™. เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบšเปเปˆเปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒ, เบเบฒเบ™เบฎเบฑเบเบชเบฒเบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบงเบฝเบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เปˆเบฝเบ™ โ€œเบงเบฑเบ”เบ–เบธเบญเบฑเบ™เบชเบนเบ‡เบชเบปเปˆเบ‡โ€ เบ—เบฑเบ‡เปเบปเบ”เป€เบ›เบฑเบ™ SRP.

Skillbox เปเบ™เบฐเบ™เปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™