SOLID เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเชตเชšเซ€เช• เช•เซ‹เชก เชฒเช–เซ‹

SOLID เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเชตเชšเซ€เช• เช•เซ‹เชก เชฒเช–เซ‹

เช…เชจเซเชตเชพเชฆเช• เชคเชฐเชซเชฅเซ€: เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เชธเซ‡เชตเซ‡เชฐเซ€เชจ เชชเซ‡เชฐเซ‡เช เชฆเซเชตเชพเชฐเชพ เชฒเซ‡เช– เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เชธเซ‹เชฒเชฟเชก เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชตเชฟเชถเซ‡. เชฒเซ‡เช–เชฎเชพเช‚เชฅเซ€ เชฎเชพเชนเชฟเชคเซ€ เชจเชตเชพ เชจเชฟเชถเชพเชณเซ€เชฏเชพ เช…เชจเซ‡ เช…เชจเซเชญเชตเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเซ‹ เชฌเช‚เชจเซ‡ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡.

เชœเซ‹ เชคเชฎเซ‡ เชตเชฟเช•เชพเชธเชฎเชพเช‚ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชฎเซ‹เชŸเชพ เชญเชพเช—เซ‡ SOLID เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹ เชตเชฟเชถเซ‡ เชธเชพเช‚เชญเชณเซเชฏเซเช‚ เชนเชถเซ‡. เชคเซ‡เช“ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเชจเซ‡ เชธเซเชตเชšเซเช›, เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เชฐเชšเชฟเชค เช…เชจเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชœเชพเชณเชตเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เช•เซ‹เชก เชฒเช–เชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เช•เซ‹เชˆ เชšเซ‹เช•เซเช•เชธ เช•เชพเชฐเซเชฏเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เช…เชญเชฟเช—เชฎเซ‹ เช›เซ‡. เชœเซเชฆเชพ เชœเซเชฆเชพ เชจเชฟเชทเซเชฃเชพเชคเซ‹เชจเชพ "เชธเชพเชšเชพ เชฎเชพเชฐเซเช—" เชตเชฟเชถเซ‡เชจเชพ เชœเซเชฆเชพ เชœเซเชฆเชพ เชตเชฟเชšเชพเชฐเซ‹ เช…เชจเซ‡ เชธเชฎเชœ เชนเซ‹เชฏ โ€‹โ€‹เช›เซ‡; เชคเซ‡ เชฌเชงเซเช‚ เชฆเชฐเซ‡เช• เชตเซเชฏเช•เซเชคเชฟเชจเชพ เช…เชจเซเชญเชต เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชœเซ‹ เช•เซ‡, SOLID เชฎเชพเช‚ เชœเชพเชนเซ‡เชฐ เช•เชฐเชพเชฏเซ‡เชฒเชพ เชตเชฟเชšเชพเชฐเซ‹ IT เชธเชฎเซเชฆเชพเชฏเชจเชพ เชฒเช—เชญเช— เชคเชฎเชพเชฎ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเช“ เชฆเซเชตเชพเชฐเชพ เชธเซเชตเซ€เช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เช“ เช˜เชฃเซ€ เชธเชพเชฐเซ€ เชตเชฟเช•เชพเชธ เชตเซเชฏเชตเชธเซเชฅเชพเชชเชจ เชชเชฆเซเชงเชคเชฟเช“เชจเชพ เช‰เชฆเชญเชต เช…เชจเซ‡ เชตเชฟเช•เชพเชธ เชฎเชพเชŸเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชฌเชฟเช‚เชฆเซ เชฌเชจเซเชฏเชพ.

เชšเชพเชฒเซ‹ เชธเชฎเชœเซ€เช เช•เซ‡ เชธเซ‹เชฒเชฟเชก เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹ เชถเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช†เชชเชฃเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡: เชชเซเชฐเซ‡เช•เซเชŸเชฟเช•เชฒ เช•เซ‹เชฐเซเชธ "เชฎเซ‹เชฌเชพเช‡เชฒ เชกเซ‡เชตเชฒเชชเชฐ เชชเซเชฐเซ‹".

เช…เชฎเซ‡ เชฏเชพเชฆ เช•เชฐเชพเชตเซ€เช เช›เซ€เช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ - Habr เชชเซเชฐเซ‹เชฎเซ‹ เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เช•เซ‹เชฐเซเชธเชฎเชพเช‚ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ 10 เชฐเซ‚เชฌเชฒ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ.

เชธเซ‹เชฒเชฟเชก เชถเซเช‚ เช›เซ‡?

เช† เชถเชฌเซเชฆ เชธเช‚เช•เซเชทเซ‡เชช เช›เซ‡, เชถเชฌเซเชฆเชจเซ‹ เชฆเชฐเซ‡เช• เช…เช•เซเชทเชฐ เชšเซ‹เช•เซเช•เชธ เชธเชฟเชฆเซเชงเชพเช‚เชคเชจเชพ เชจเชพเชฎเชจเซ€ เชถเชฐเซ‚เช†เชค เช›เซ‡:

  • Sเชเช•เชฒ เชœเชตเชพเชฌเชฆเชพเชฐเซ€ เชธเชฟเชฆเซเชงเชพเช‚เชค. เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเชจเซเช‚ เชเช• เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ เช•เชพเชฐเชฃ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡.
  • เช† Oเชชเซ‡เชจ/เชฌเช‚เชง เชธเชฟเชฆเซเชงเชพเช‚เชค (เช–เซเชฒเซเชฒเซ‹/เชฌเช‚เชง เชธเชฟเชฆเซเชงเชพเช‚เชค). เชตเชฐเซเช—เซ‹ เช…เชจเซ‡ เช…เชจเซเชฏ เช˜เชŸเช•เซ‹ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชฎเชพเชŸเซ‡ เช–เซเชฒเซเชฒเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช, เชชเชฐเช‚เชคเซ เชซเซ‡เชฐเชซเชพเชฐ เชฎเชพเชŸเซ‡ เชฌเช‚เชง เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.
  • โ€Šเช† Lเช‡เชธเซเช•เซ‹เชต เช…เชตเซ‡เชœเซ€ เชธเชฟเชฆเซเชงเชพเช‚เชค (เชฒเชฟเชธเซเช•เซ‹เชต เช…เชตเซ‡เชœเซ€ เชธเชฟเชฆเซเชงเชพเช‚เชค). เชซเช‚เช•เซเชถเชจ เช•เซ‡ เชœเซ‡ เชฌเซ‡เช เชŸเชพเชˆเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชœเชพเชฃเซเชฏเชพ เชตเช—เชฐ เชฌเซ‡เช เชŸเชพเชˆเชชเชจเชพ เชชเซ‡เชŸเชพเชชเซเชฐเช•เชพเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชธเช•เซเชทเชฎ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.
  • เช† Iเช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชธเซ‡เช—เซเชฐเชฟเช—เซ‡เชถเชจ เชธเชฟเชฆเซเชงเชพเช‚เชคโ€Š (เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชตเชฟเชญเชพเชœเชจ เชธเชฟเชฆเซเชงเชพเช‚เชค). เชธเซ‰เชซเซเชŸเชตเซ‡เชฐ เชธเช‚เชธเซเชฅเชพเช“เช เชคเซ‡ เชชเชฆเซเชงเชคเชฟเช“ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เชตเซ‹ เชœเซ‹เชˆเช เชจเชนเซ€เช‚ เชœเซ‡เชจเซ‹ เชคเซ‡เช“ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชจเชฅเซ€.
  • เช† Dเช…เชตเชฒเช‚เชฌเชจ เชตเซเชฏเซเชคเซเช•เซเชฐเชฎ เชธเชฟเชฆเซเชงเชพเช‚เชค (เชจเชฟเชฐเซเชญเชฐเชคเชพ เชตเซเชฏเซเชคเซเช•เซเชฐเชฎเชจเซ‹ เชธเชฟเชฆเซเชงเชพเช‚เชค). เช‰เชšเซเชš เชธเซเชคเชฐ เชชเชฐเชจเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชจเซ€เชšเชฒเชพ เชธเซเชคเชฐเชจเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชจ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.

เชเช• เชœเชตเชพเชฌเชฆเชพเชฐเซ€ เชธเชฟเชฆเซเชงเชพเช‚เชค

โ€Š
เชธเชฟเช‚เช—เชฒ เชฐเชฟเชธเซเชชเซ‹เชจเซเชธเชฟเชฌเชฟเชฒเชฟเชŸเซ€ เชชเซเชฐเชฟเชจเซเชธเชฟเชชเชฒ (SRP) เชœเชฃเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชฆเชฐเซ‡เช• เชตเชฐเซเช— เช…เชฅเชตเชพ เชฎเซ‹เชกเซเชฏเซเชฒ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเชพ เชฎเชพเชคเซเชฐ เชเช• เชญเชพเช— เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เชตเชงเซเชฎเชพเช‚, เช† เชœเชตเชพเชฌเชฆเชพเชฐเซ€เชจเชพ เช˜เชŸเช•เซ‹ เช…เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชฐเซเช—เซ‹เชฎเชพเช‚ เชตเชฟเช–เซ‡เชฐเชพเชˆ เชœเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เชคเซ‡เชฎเชจเชพ เชชเซ‹เชคเชพเชจเชพ เชตเชฐเซเช—เชจเซ‡ เชธเซ‹เช‚เชชเชตเชพ เชœเซ‹เชˆเช. SRP เชจเชพ เชกเซ‡เชตเชฒเชชเชฐ เช…เชจเซ‡ เชฎเซเช–เซเชฏ เชชเซเชฐเชšเชพเชฐเช•, เชฐเซ‹เชฌเชฐเซเชŸ เชเชธ. เชฎเชพเชฐเซเชŸเชฟเชจ, เชฌเชฆเชฒเชพเชตเชจเชพ เช•เชพเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชœเชตเชพเชฌเชฆเชพเชฐเซ€เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชฎเชฃเซ‡ เชฎเซ‚เชณเชฐเซ‚เชชเซ‡ เช† เชถเชฌเซเชฆเชจเซ‡ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏ "เช‘เชฌเซเชœเซ‡เช•เซเชŸ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชกเชฟเชเชพเช‡เชจเชจเชพ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹" เชจเชพ เช˜เชŸเช•เซ‹เชฎเชพเช‚เชจเชพ เชเช• เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเชธเซเชคเชพเชตเชฟเชค เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹. เช•เซ‹เชจเซเชธเซ‡เชชเซเชŸเชฎเชพเช‚ เช•เชจเซ‡เช•เซเชŸเชฟเชตเชฟเชŸเซ€ เชชเซ‡เชŸเชฐเซเชจเชจเซ‹ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡ เช…เช—เชพเช‰ เชŸเซ‹เชฎ เชกเซ€เชฎเชพเชฐเซเช•เซ‹ เชฆเซเชตเชพเชฐเชพ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

เช† เชตเชฟเชญเชพเชตเชจเชพเชฎเชพเช‚ เชกเซ‡เชตเชฟเชก เชชเชฐเซเชจเชพเชธ เชฆเซเชตเชพเชฐเชพ เช˜เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เช˜เชฃเชพ เช–เซเชฏเชพเชฒเซ‹เชจเซ‹ เชชเชฃ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชฌเซ‡ เชฎเซเช–เซเชฏ เช›เซ‡ เชเชจเซเช•เซ‡เชชเซเชธเซเชฏเซเชฒเซ‡เชถเชจ เช…เชจเซ‡ เชฎเชพเชนเชฟเชคเซ€ เช›เซเชชเชพเชตเชตเซ€. เชชเชฐเชจเชพเชธเซ‡ เชฆเชฒเซ€เชฒ เช•เชฐเซ€ เชนเชคเซ€ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เช…เชฒเช— เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เชตเชฟเชญเชพเชœเซ€เชค เช•เชฐเชตเซ€ เช เชฌเซเชฒเซ‹เช• เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ เช…เชฅเชตเชพ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชซเซเชฒเซ‹เชจเชพ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚. เช•เซ‹เชˆเชชเชฃ เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เชšเซ‹เช•เซเช•เชธ เชธเซ‹เชฒเซเชฏเซเชถเชจ เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชœเซ‡ เช—เซเชฐเชพเชนเช•เซ‹เชจเซ‡ เชจเซเชฏเซ‚เชจเชคเชฎ เชฎเชพเชนเชฟเชคเซ€ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชฎเชพเชฐเซเชŸเชฟเชจเซ‡ เช•เช‚เชชเชจเซ€เชจเชพ เชตเชฐเชฟเชทเซเช  เชธเช‚เชšเชพเชฒเช•เซ‹ (COO, CTO, CFO) เชธเชพเชฅเซ‡ เชเช• เชฐเชธเชชเซเชฐเชฆ เช‰เชฆเชพเชนเชฐเชฃ เช†เชชเซเชฏเซเช‚, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เช…เชฒเช—-เช…เชฒเช— เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เชšเซ‹เช•เซเช•เชธ เชฌเชฟเชเชจเซ‡เชธ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชคเซ‡เชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆเชชเชฃ เช…เชจเซเชฏ เชฎเซ‡เชจเซ‡เชœเชฐเซ‹เชจเชพ เชนเชฟเชคเซ‹เชจเซ‡ เช…เชธเชฐ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชฆเซˆเชตเซ€ เชชเชฆเชพเชฐเซเชฅ

เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, SRP เชถเซ€เช–เชตเชพเชจเซ€ เชถเซเชฐเซ‡เชทเซเช  เชฐเซ€เชค เชคเซ‡เชจเซ‡ เช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชœเซ‹เชตเชพเชจเซเช‚ เช›เซ‡. เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชเช• เชตเชฟเชญเชพเช—เชจเซ‡ เชœเซ‹เชˆเช เชœเซ‡ เชธเชฟเช‚เช—เชฒ เชฐเชฟเชธเซเชชเซ‹เชจเซเชธเชฟเชฌเชฟเชฒเชฟเชŸเซ€ เชธเชฟเชฆเซเชงเชพเช‚เชคเชจเซเช‚ เชชเชพเชฒเชจ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เช† เชฐเซ‚เชฌเซ€ เช•เซ‹เชก เช›เซ‡ เชœเซ‡ เชธเซเชชเซ‡เชธ เชธเซเชŸเซ‡เชถเชจเชจเชพ เชตเชฐเซเชคเชจ เช…เชจเซ‡ เชฒเช•เซเชทเชฃเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡.

เช‰เชฆเชพเชนเชฐเชฃเชจเซ€ เชธเชฎเซ€เช•เซเชทเชพ เช•เชฐเซ‹ เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพเชจเซ‡ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹:
เชคเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซ€ เชœเชตเชพเชฌเชฆเชพเชฐเซ€เช“ เชœเซ‡ เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เชตเชฐเซเช—เชฎเชพเช‚ เชœเชพเชนเซ‡เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.
เชœเซ‡เช“ เชธเซเชชเซ‡เชธ เชธเซเชŸเซ‡เชถเชจเชจเชพ เชธเช‚เชšเชพเชฒเชจเชฎเชพเช‚ เชฐเชธ เชงเชฐเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

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

เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เช…เชฎเชพเชฐเซเช‚ เชธเซเชชเซ‡เชธ เชธเซเชŸเซ‡เชถเชจ เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ เช›เซ‡ (เชฎเชจเซ‡ เชจเชฅเซ€ เชฒเชพเช—เชคเซเช‚ เช•เซ‡ เชฎเชจเซ‡ เชจเชพเชธเชพ เชคเชฐเชซเชฅเซ€ เชŸเซ‚เช‚เช• เชธเชฎเชฏเชฎเชพเช‚ เช•เซ‹เชˆ เช•เซ‰เชฒ เช†เชตเชถเซ‡), เชชเชฐเช‚เชคเซ เช…เชนเซ€เช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เช‚เชˆเช• เช›เซ‡.

เช†เชฎ, เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เชตเชฐเซเช—เชฎเชพเช‚ เช˜เชฃเซ€ เชœเซเชฆเซ€ เชœเซเชฆเซ€ เชœเชตเชพเชฌเชฆเชพเชฐเซ€เช“ (เช…เชฅเชตเชพ เช•เชพเชฐเซเชฏเซ‹) เช›เซ‡. เชคเซ‡ เชฌเชงเชพเชจเซ‡ เชชเซเชฐเช•เชพเชฐเซ‹เชฎเชพเช‚ เชตเชนเซ‡เช‚เชšเซ€ เชถเช•เชพเชฏ เช›เซ‡:

  • เชธเซ‡เชจเซเชธเชฐ;
  • เชชเซเชฐเชตเช เซ‹ (เช‰เชชเชญเซ‹เชœเซเชฏ เชตเชธเซเชคเซเช“);
  • เชฌเชณเชคเชฃ
  • เชชเซเชฐเชตเซ‡เช—เช•

เชธเซเชŸเซ‡เชถเชจเชจเชพ เช•เซ‹เชˆเชชเชฃ เช•เชฐเซเชฎเชšเชพเชฐเซ€เชจเซ‡ เชตเชฐเซเช— เชธเซ‹เช‚เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชจ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เช†เชชเชฃเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เช•เซ‹เชฃ เชถเซเช‚ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡. เชธเช‚เชญเชตเชคเชƒ, เชตเซˆเชœเซเชžเชพเชจเชฟเช• เชธเซ‡เชจเซเชธเชฐเซเชธเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชธเช‚เชธเชพเชงเชจเซ‹ เชชเซ‚เชฐเชพ เชชเชพเชกเชตเชพ เชฎเชพเชŸเซ‡ เชฒเซ‹เชœเชฟเชธเซเชŸเชฟเชฏเชจ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡, เชเชจเซเชœเชฟเชจเชฟเชฏเชฐ เช‡เช‚เชงเชฃ เชชเซเชฐเชตเช เชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡, เช…เชจเซ‡ เชชเชพเช‡เชฒเชŸ เชฌเซ‚เชธเซเชŸเชฐเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

เชถเซเช‚ เช†เชชเชฃเซ‡ เช•เชนเซ€ เชถเช•เซ€เช เช•เซ‡ เช† เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ SRP เช…เชจเซเชฐเซ‚เชช เชจเชฅเซ€? เชนเชพ เชชเชพเช•เซเช•เซ. เชชเชฐเช‚เชคเซ เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เชตเชฐเซเช— เช เชเช• เชฒเชพเช•เซเชทเชฃเชฟเช• "เชˆเชถเซเชตเชฐ เชชเชฆเชพเชฐเซเชฅ" เช›เซ‡ เชœเซ‡ เชฌเชงเซเช‚ เชœเชพเชฃเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเชงเซเช‚ เช•เชฐเซ‡ เช›เซ‡. เช‘เชฌเซเชœเซ‡เช•เซเชŸ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เช† เชเช• เชฎเซเช–เซเชฏ เชตเชฟเชฐเซ‹เชงเซ€ เชชเซ‡เชŸเชฐเซเชจ เช›เซ‡. เชถเชฟเช–เชพเช‰ เชฎเชพเชฃเชธ เชฎเชพเชŸเซ‡, เช†เชตเซ€ เชตเชธเซเชคเซเช“ เชœเชพเชณเชตเชตเซ€ เช…เชคเซเชฏเช‚เชค เชฎเซเชถเซเช•เซ‡เชฒ เช›เซ‡. เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€เชจเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เช›เซ‡, เชนเชพ, เชชเชฐเช‚เชคเซ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ เช•เซ‡ เชœเซ‹ เช†เชชเชฃเซ‡ เชจเชตเซ€ เชธเซเชตเชฟเชงเชพเช“ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚ เชคเซ‹ เชถเซเช‚ เชฅเชถเซ‡. เช•เชฆเชพเชš เช†เชชเชฃเชพ เชธเซเชชเซ‡เชธ เชธเซเชŸเซ‡เชถเชจเชจเซ‡ เชฎเซ‡เชกเชฟเช•เชฒ เชธเซเชŸเซ‡เชถเชจ เช…เชฅเชตเชพ เชฎเซ€เชŸเชฟเช‚เช— เชฐเซ‚เชฎเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เช…เชจเซ‡ เชœเซ‡เชŸเชฒเชพ เชตเชงเซ เช•เชพเชฐเซเชฏเซ‹ เชนเชถเซ‡, เชคเซ‡เชŸเชฒเซเช‚ เชตเชงเซ เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เชตเชงเชถเซ‡. เช เซ€เช• เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช† เชธเซเชตเชฟเชงเชพ เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เชนเชถเซ‡, เชธเชฎเช—เซเชฐ เชธเช‚เช•เซเชฒเชจเซ€ เชธเซ‡เชตเชพ เช•เชฐเชตเซ€ เชตเชงเซ เชœเชŸเชฟเชฒ เชฌเชจเชถเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเซ‡ เช‘เชชเชฐเซ‡เชถเชจเชฎเชพเช‚ เชตเชฟเช•เซเชทเซ‡เชช เชชเชพเชกเซ€ เชถเช•เซ€เช เช›เซ€เช, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเช•เซเชธเชฟเชฒเชฐเซ‡เชŸเชฐเซเชธ. เชœเซ‹ เช•เซ‹เชˆ เชธเช‚เชถเซ‹เชงเช• เชธเซ‡เชจเซเชธเชฐเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เช† เชธเซเชŸเซ‡เชถเชจเชจเซ€ เชธเช‚เชšเชพเชฐ เชชเซเชฐเชฃเชพเชฒเซ€เชจเซ‡ เช–เซ‚เชฌ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช…เชธเชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชเชธเช†เชฐเชชเซ€ เชธเชฟเชฆเซเชงเชพเช‚เชคเชจเซเช‚ เช‰เชฒเซเชฒเช‚เช˜เชจ เช•เชฐเชตเชพเชฅเซ€ เชŸเซ‚เช‚เช•เชพ เช—เชพเชณเชพเชจเซ€ เชตเซเชฏเซ‚เชนเชพเชคเซเชฎเช• เชœเซ€เชค เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เช‚เชคเซ‡ เช†เชชเชฃเซ‡ "เชฏเซเชฆเซเชง เชนเชพเชฐเซ€ เชœเชˆเชถเซเช‚", เช…เชจเซ‡ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เช†เชตเชพ เชฐเชพเช•เซเชทเชธเชจเซ‡ เชœเชพเชณเชตเซ€ เชฐเชพเช–เชตเซเช‚ เช–เซ‚เชฌ เชฎเซเชถเซเช•เซ‡เชฒ เชฌเชจเชถเซ‡. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช•เซ‹เชกเชจเชพ เช…เชฒเช— เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชฟเชญเชพเชœเซ€เชค เช•เชฐเชตเชพเชจเซเช‚ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เชšเซ‹เช•เซเช•เชธ เช•เชพเชฎเช—เซ€เชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡. เช†เชจเซ‡ เชธเชฎเชœเซ€เชจเซ‡, เชšเชพเชฒเซ‹ 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

เชคเซเชฏเชพเช‚ เช˜เชฃเชพ เชฌเชงเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช›เซ‡, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชนเชตเซ‡ เชตเชงเซ เชธเชพเชฐเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡. เชนเชตเซ‡ เช…เชฎเชพเชฐเซ‹ เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เชตเชฐเซเช— เชตเชงเซ เชเช• เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเซ€ เช—เชฏเซ‹ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชธเซ‡เชจเซเชธเชฐเชจเซ‹ เชธเชฎเซ‚เชน, เช‰เชชเชญเซ‹เชœเซเชฏ เชธเชชเซเชฒเชพเชฏ เชธเชฟเชธเซเชŸเชฎ, เช‡เช‚เชงเชฃ เชŸเชพเช‚เช•เซ€ เช…เชจเซ‡ เชฌเซ‚เชธเซเชŸเชฐ เชธเชนเชฟเชค เช†เชถเซเชฐเชฟเชค เชญเชพเช—เซ‹ เชฎเชพเชŸเซ‡ เช•เชพเชฎเช—เซ€เชฐเซ€ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช•เซ‹เชˆเชชเชฃ เชšเชฒเซ‹ เชฎเชพเชŸเซ‡ เชนเชตเซ‡ เช…เชจเซเชฐเซ‚เชช เชตเชฐเซเช— เช›เซ‡: เชธเซ‡เชจเซเชธเชฐเซเชธ; เชธเชชเซเชฒเชพเชฏ เชนเซ‹เชฒเซเชก; เชซเซเชฏเซเช…เชฒ เชŸเซ‡เชจเซเช•; เชฅเซเชฐเชธเซเชŸเชฐเซเชธ.

เช•เซ‹เชกเชจเชพ เช† เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช˜เชฃเชพ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช›เซ‡. เชฎเซเชฆเซเชฆเซ‹ เช เช›เซ‡ เช•เซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เช•เชพเชฐเซเชฏเซ‹ เชซเช•เซเชค เชคเซ‡เชฎเชจเชพ เชชเซ‹เชคเชพเชจเชพ เชตเชฐเซเช—เซ‹เชฎเชพเช‚ เชœ เชธเชฎเชพเชตเชฟเชทเซเชŸ เชจเชฅเซ€, เชคเซ‡ เชเชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เช…เชจเซเชฎเชพเชจเชฟเชค เช…เชจเซ‡ เชธเซเชธเช‚เช—เชค เชฌเชจเซ‡. เชธเซเชธเช‚เช—เชคเชคเชพเชจเชพ เชธเชฟเชฆเซเชงเชพเช‚เชคเชจเซ‡ เช…เชจเซเชธเชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชธเชฎเชพเชจ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชตเชพเชณเชพ เช˜เชŸเช•เซ‹เชจเซ‡ เชœเซ‚เชฅเชฌเชฆเซเชง เช•เชฐเซ€เช เช›เซ€เช. เชนเชตเซ‡, เชœเซ‹ เช†เชชเชฃเซ‡ เชนเซ‡เชถ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚เชฅเซ€ เชเชฐเซ‡เชฎเชพเช‚ เชœเชตเชพ เชฎเชพเชŸเซ‡, เชธเชฟเชธเซเชŸเชฎเชจเซ€ เช•เชพเชฐเซเชฏ เช•เชฐเชตเชพเชจเซ€ เชฐเซ€เชค เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชซเช•เซเชค เชธเชชเซเชฒเชพเชฏเชนเซ‹เชฒเซเชก เช•เซเชฒเชพเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹; เช†เชชเชฃเซ‡ เช…เชจเซเชฏ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹เชจเซ‡ เชธเซเชชเชฐเซเชถ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เช† เชฐเซ€เชคเซ‡, เชœเซ‹ เชฒเซ‹เชœเชฟเชธเซเชŸเชฟเช•เซเชธ เช…เชงเชฟเช•เชพเชฐเซ€ เชคเซ‡เชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช•เช‚เชˆเช• เชฌเชฆเชฒเชถเซ‡, เชคเซ‹ เชฌเชพเช•เซ€เชจเซเช‚ เชธเซเชŸเซ‡เชถเชจ เช…เช•เชฌเช‚เชง เชฐเชนเซ‡เชถเซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เชตเชฐเซเช— เชชเชฃ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชฅเซ€ เชตเชพเช•เซ‡เชซ เชฐเชนเซ‡เชถเซ‡ เชจเชนเซ€เช‚.

เชธเซเชชเซ‡เชธ เชธเซเชŸเซ‡เชถเชจ เชชเชฐ เช•เชพเชฎ เช•เชฐเชคเชพ เช…เชฎเชพเชฐเชพ เช…เชงเชฟเช•เชพเชฐเซ€เช“ เชธเช‚เชญเชตเชคเชƒ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชฅเซ€ เช–เซเชถ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เช“ เชคเซ‡เชฎเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชจเซ‹เช‚เชง เชฒเซ‹ เช•เซ‡ เช•เซ‹เชกเชฎเชพเช‚ เชธเชชเซเชฒเชพเชฏเชนเซ‹เชฒเซเชก เช…เชจเซ‡ เชซเซเชฏเซเช…เชฒ เชŸเซ‡เชจเซเช• เชตเชฐเซเช—เซ‹เชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒ เชฐเชฟเชชเซ‹เชฐเซเชŸ_เชธเชชเซเชฒเชพเชฏ เช…เชจเซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸ_เชซเซเชฏเซเช…เชฒ เชœเซ‡เชตเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช›เซ‡. เชœเซ‹ เชชเซƒเชฅเซเชตเซ€ เชคเซ‡เชจเซ€ เชฐเชฟเชชเซ‹เชฐเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชฐเซ€เชค เชฌเชฆเชฒเชตเชพเชจเซเช‚ เช•เชนเซ‡ เชคเซ‹ เชถเซเช‚ เชฅเชถเซ‡? เชธเชชเซเชฒเชพเชฏเชนเซ‹เชฒเซเชก เช…เชจเซ‡ เชซเซเชฏเซเช…เชฒ เชŸเซ‡เชจเซเช• เชฌเช‚เชจเซ‡ เชตเชฐเซเช—เซ‹ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เช‡เช‚เชงเชฃ เช…เชจเซ‡ เช‰เชชเชญเซ‹เชœเซเชฏ เชตเชธเซเชคเซเช“เชจเซ€ เชกเชฟเชฒเชฟเชตเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชฐเซ€เชค เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชถเซเช‚? เชคเชฎเชพเชฐเซ‡ เช•เชฆเชพเชš เชฌเชงเชพ เชœ เชตเชฐเซเช—เซ‹ เชซเชฐเซ€เชฅเซ€ เชฌเชฆเชฒเชตเชพ เชชเชกเชถเซ‡. เช…เชจเซ‡ เช† เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ 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. เชคเซ‡ เชฌเช‚เชจเซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸเชฐ เช•เซเชฒเชพเชธเชจเชพ เชฌเชพเชณเช•เซ‹ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, เช…เชฎเซ‡ เชธเซเชชเซ‡เชธเชธเซเชŸเซ‡เชถเชจ เช•เซเชฒเชพเชธเชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเชจเซเชธ เชตเซ‡เชฐเซ€เชเชฌเชฒเซเชธ เช‰เชฎเซ‡เชฐเซเชฏเชพ เช›เซ‡ เชœเซ‡เชฅเซ€ เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹ เช‡เชšเซเช›เชฟเชค เชธเชฌเช•เซเชฒเชพเชธ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เชพเชฏ. เชนเชตเซ‡, เชœเซ‹ เชชเซƒเชฅเซเชตเซ€ เช•เช‚เชˆเช• เชฌเซ€เชœเซเช‚ เชฌเชฆเชฒเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซ‡, เชคเซ‹ เช†เชชเชฃเซ‡ เชชเซ‡เชŸเชพ เชตเชฐเซเช—เซ‹เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ€เชถเซเช‚, เชฎเซเช–เซเชฏ เชตเชฐเซเช—เชฎเชพเช‚ เชจเชนเซ€เช‚.

เช…เชฒเชฌเชคเซเชค, เช…เชฎเชพเชฐเชพ เช•เซ‡เชŸเชฒเชพเช• เชตเชฐเซเช—เซ‹ เชนเชœเซ เชชเชฃ เชเช•เชฌเซ€เชœเชพ เชชเชฐ เชจเชฟเชฐเซเชญเชฐ เช›เซ‡. เช†เชฎ, เชธเชชเซเชฒเชพเชฏ เชฐเชฟเชชเซ‹เชฐเซเชŸเชฐ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชธเชชเซเชฒเชพเชฏเชนเซ‹เชฒเซเชก เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ เชซเซเชฏเซเช…เชฒ เชฐเชฟเชชเซ‹เชฐเซเชŸเชฐ เชซเซเชฏเซเช…เชฒ เชŸเซ‡เชจเซเช• เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เช…เชฒเชฌเชคเซเชค, เชฌเซ‚เชธเซเชŸเชฐ เชฌเชณเชคเชฃ เชŸเชพเช‚เช•เซ€ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เชชเชฐเช‚เชคเซ เช…เชนเซ€เช‚ เชฌเชงเซเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชคเชพเชฐเซเช•เชฟเช• เชฒเชพเช—เซ‡ เช›เซ‡, เช…เชจเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช•เชฐเชตเชพ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชนเซ€เช‚ เชนเซ‹เชฏ - เชเช• เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเชพ เช•เซ‹เชกเชจเซ‡ เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเชตเชพเชฅเซ€ เชฌเซ€เชœเชพเชจเซ‡ เช–เซ‚เชฌ เช…เชธเชฐ เชฅเชถเซ‡ เชจเชนเซ€เช‚.

เช†เชฎ, เช…เชฎเซ‡ เชเช• เชฎเซ‹เชกเซเชฏเซเชฒเชฐ เช•เซ‹เชก เชฌเชจเชพเชตเซเชฏเซ‹ เช›เซ‡ เชœเซเชฏเชพเช‚ เชฆเชฐเซ‡เช• เช‘เชฌเซเชœเซ‡เช•เซเชŸ/เชตเชฐเซเช—เชจเซ€ เชœเชตเชพเชฌเชฆเชพเชฐเซ€เช“ เชšเซ‹เช•เซเช•เชธ เชฐเซ€เชคเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เช†เชตเชพ เช•เซ‹เชก เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ€, เชคเซ‡เชจเซ‡ เชœเชพเชณเชตเชตเซเช‚ เชเช• เชธเชฐเชณ เช•เชพเชฐเซเชฏ เชนเชถเซ‡. เช…เชฎเซ‡ เชธเชฎเช—เซเชฐ "เชฆเซˆเชตเซ€ เชชเชฆเชพเชฐเซเชฅ" เชจเซ‡ SRP เชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซเชฏเซเช‚ เช›เซ‡.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹