SOLID เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดซเตเดฒเต†เด•เตเดธเดฟเดฌเดฟเตพ เด•เต‹เดกเต เดŽเดดเตเดคเตเดจเตเดจเต

SOLID เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดซเตเดฒเต†เด•เตเดธเดฟเดฌเดฟเตพ เด•เต‹เดกเต เดŽเดดเตเดคเตเดจเตเดจเต

เดตเดฟเดตเตผเดคเตเดคเด•เดจเดฟเตฝ เดจเดฟเดจเตเดจเต: เดจเดฟเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเดšเตเดšเดคเต เดธเต†เดตเต†เดฑเดฟเตป เดชเต†เดฐเดธเดฟเดจเตเดฑเต† เดฒเต‡เด–เดจเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เดฟเตฝ SOLID เดคเดคเตเดตเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต. เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดตเดฟเดตเดฐเด™เตเด™เตพ เดคเตเดŸเด•เตเด•เด•เตเด•เดพเตผเด•เตเด•เตเด‚ เดชเดฐเดฟเดšเดฏเดธเดฎเตเดชเดจเตเดจเดฐเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตผเดฎเดพเตผเด•เตเด•เตเด‚ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚.

เดจเดฟเด™เตเด™เตพ เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดฒเดพเดฃเต†เด™เตเด•เดฟเตฝ, SOLID เดคเดคเตเดตเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพ เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เด•เต‡เดŸเตเดŸเดฟเดŸเตเดŸเตเดฃเตเดŸเดพเด•เตเด‚. เดตเตƒเดคเตเดคเดฟเดฏเตเดณเตเดณเดคเตเด‚ เดจเดจเตเดจเดพเดฏเดฟ เดšเดฟเดŸเตเดŸเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดคเตเด‚ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเตเดฎเดพเดฏ เด•เต‹เดกเต เดŽเดดเตเดคเดพเตป เด…เดต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฑเต† เดชเตเดฐเดพเดชเตเดคเดจเดพเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เดฟเตฝ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดœเต‹เดฒเดฟ เดŽเด™เตเด™เดจเต† เดถเดฐเดฟเดฏเดพเดฏเดฟ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดธเดฎเต€เดชเดจเด™เตเด™เดณเตเดฃเตเดŸเต เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต. เดตเตเดฏเดคเตเดฏเดธเตเดค เดธเตเดชเต†เดทเตเดฏเดฒเดฟเดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เต เดตเตเดฏเดคเตเดฏเดธเตเดค เด†เดถเดฏเด™เตเด™เดณเตเด‚ "เดถเดฐเดฟเดฏเดพเดฏ เดชเดพเดค" เดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดงเดพเดฐเดฃเดฏเตเด‚ เด‰เดฃเตเดŸเต; เด‡เดคเต†เดฒเตเดฒเดพเด‚ เด“เดฐเต‹ เดตเตเดฏเด•เตเดคเดฟเดฏเตเดŸเต†เดฏเตเด‚ เด…เดจเตเดญเดตเดคเตเดคเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, SOLID-เตฝ เดชเตเดฐเด–เตเดฏเดพเดชเดฟเดšเตเดš เด†เดถเดฏเด™เตเด™เตพ เดเดŸเดฟ เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเดฑเตเดฑเดฟเดฏเดฟเดฒเต† เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพ เดชเตเดฐเดคเดฟเดจเดฟเดงเดฟเด•เดณเตเด‚ เด…เด‚เด—เต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดต เดชเดฒ เดจเดฒเตเดฒ เดตเดฟเด•เดธเดจ เดฎเดพเดจเต‡เดœเตโ€Œเดฎเต†เดจเตเดฑเต เดฐเต€เดคเดฟเด•เดณเตเดŸเต† เด†เดตเดฟเตผเดญเดพเดตเดคเตเดคเดฟเดจเตเด‚ เดตเดฟเด•เดพเดธเดคเตเดคเดฟเดจเตเด‚ เดคเตเดŸเด•เตเด•เดฎเดฟเดŸเตเดŸเต.

SOLID เดคเดคเตเดคเตเดตเด™เตเด™เตพ เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเตเด‚ เด…เดต เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เดจเดฎเตเดฎเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเตเด‚ เดจเดฎเตเด•เตเด•เต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเด‚.

เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต: เดชเตเดฐเดพเดฏเต‹เด—เดฟเด• เด•เต‹เดดเตเดธเต "เดฎเตŠเดฌเตˆเตฝ เดกเต†เดตเดฒเดชเตเดชเตผ PRO".

เดžเด™เตเด™เตพ เด“เตผเดฎเตเดฎเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต: "Habr"-เดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เตเด‚ - "Habr" เดชเตเดฐเตŠเดฎเต‹เดทเดฃเตฝ เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เด•เต‹เดดเตเดธเดฟเตฝ เดšเต‡เดฐเตเดฎเตเดชเต‹เตพ 10 เดฑเต‚เดฌเดฟเตพเดธเต เด•เดฟเดดเดฟเดตเต.

เดŽเดจเตเดคเดพเดฃเต SOLID?

เดˆ เดชเดฆเด‚ เด’เดฐเต เดšเตเดฐเตเด•เตเด•เต†เดดเตเดคเตเดคเดพเดฃเต, เดชเดฆเดคเตเดคเดฟเดจเตเดฑเต† เด“เดฐเต‹ เด…เด•เตเดทเดฐเดตเตเด‚ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดคเดคเตเดตเดคเตเดคเดฟเดจเตเดฑเต† เดชเต‡เดฐเดฟเดจเตเดฑเต† เดคเตเดŸเด•เตเด•เดฎเดพเดฃเต:

  • Sเด’เดฑเตเดฑ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดค เดคเดคเตเดตเด‚. เด’เดฐเต เดฎเตŠเดกเตเดฏเต‚เดณเดฟเดจเต เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเต เด’เดฐเต‡เดฏเตŠเดฐเต เด•เดพเดฐเดฃเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดฃเตเดŸเดพเด•เต‚.
  • เดฆเดฟ Oเดชเต‡เดจ/เด…เดŸเดžเตเดž เดคเดคเตเดตเด‚ (เดคเตเดฑเดจเตเดจ/เด…เดŸเดžเตเดž เดคเดคเตเดตเด‚). เด•เตเดฒเดพเดธเตเด•เดณเตเด‚ เดฎเดฑเตเดฑเต เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดคเตเดฑเดจเตเดจเดฟเดฐเดฟเด•เตเด•เดฃเด‚, เดŽเดจเตเดจเดพเตฝ เดชเดฐเดฟเดทเตเด•เตเด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เด…เดŸเดšเตเดšเดฟเดฐเดฟเด•เตเด•เดฃเด‚.
  • โ€Šเดฆเดฟ Liskov เดธเดฌเตเดธเตเดฑเตเดฑเดฟเดฑเตเดฑเตเดฏเต‚เดทเตป เดคเดคเตเดตเด‚ (เดฒเดฟเดธเตเด•เต‹เดตเต เดธเดฌเตเดธเตเดฑเตเดฑเดฟเดฑเตเดฑเตเดฏเต‚เดทเตป เดคเดคเตเดตเด‚). เด…เดŸเดฟเดธเตเดฅเดพเดจ เดคเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพเด•เตเด•เต เด…เดŸเดฟเดธเตเดฅเดพเดจ เดคเดฐเดคเตเดคเดฟเดจเตเดฑเต† เด‰เดชเดตเดฟเดญเดพเด—เด™เตเด™เตพ เด…เดฑเดฟเดฏเดพเดคเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฃเด‚.
  • เดฆเดฟ Iเด‡เดจเตเดฑเตผเดซเต‡เดธเต เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เตฝ เดคเดคเตเดตเด‚โ€Š (เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เตฝ เดคเดคเตเดตเด‚). เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดธเตเดฅเดพเดชเดจเด™เตเด™เตพ เด…เดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเตเดค เดฐเต€เดคเดฟเด•เดณเต† เด†เดถเตเดฐเดฏเดฟเด•เตเด•เดฐเตเดคเต.
  • เดฆเดฟ Dependency เดตเดฟเดชเดฐเต€เดค เดคเดคเตเดตเด‚ (เด†เดถเตเดฐเดฟเดคเดคเตเดต เดตเดฟเดชเดฐเต€เดค เดคเดคเตเดตเด‚). เด‰เดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เดคเดพเดดเตเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเต† เด†เดถเตเดฐเดฏเดฟเด•เตเด•เดฐเตเดคเต.

เดเด• เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดค เดคเดคเตเดตเด‚

โ€Š
เดธเดฟเด‚เด—เดฟเตพ เดฑเต†เดธเตโ€Œเดชเต‹เตบเดธเดฟเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟ เดชเตเดฐเดฟเตปเดธเดฟเดชเตเดชเดฟเตพ (เดŽเดธเตโ€Œเด†เตผโ€Œเดชเดฟ) เดชเดฑเดฏเตเดจเตเดจเดคเต, เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต† เด“เดฐเต‹ เด•เตเดฒเดพเดธเตเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตŠเดกเตเดฏเต‚เดณเตเด‚ เด† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เดคเตเดคเดฟเดจเต เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เต‚ เดŽเดจเตเดจเดพเดฃเต. เด•เต‚เดŸเดพเดคเต†, เดˆ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเดคเตเดคเดฟเดจเตเดฑเต† เด˜เดŸเด•เด™เตเด™เตพ เดฌเดจเตเดงเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เด•เตเดฒเดพเดธเตเด•เดณเดฟเตฝ เดšเดฟเดคเดฑเดฟเด•เตเด•เดฟเดŸเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚ เด…เดตเดฐเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เด•เตเดฒเดพเดธเดฟเดจเต เดจเตฝเด•เดฃเด‚. เดŽเดธเตเด†เตผเดชเดฟเดฏเตเดŸเต† เดกเต†เดตเดฒเดชเตเดชเดฑเตเด‚ เดฎเตเด–เตเดฏ เดธเตเดตเดฟเดถเต‡เดทเด•เดจเตเดฎเดพเดฏ เดฑเต‹เดฌเตผเดŸเตเดŸเต เดŽเดธเต. เดฎเดพเตผเดŸเตเดŸเดฟเตป, เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเดฎเดพเดฃเต เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดณเตเดณ เด•เดพเดฐเดฃเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต. "เด’เดฌเตเดœเด•เตเดฑเตเดฑเต-เด“เดฑเดฟเดฏเดจเตเดฑเดกเต เดกเดฟเดธเตˆเดจเดฟเดจเตเดฑเต† เดคเดคเตเดตเด™เตเด™เตพ" เดŽเดจเตเดจ เดคเดจเตเดฑเต† เด•เตƒเดคเดฟเดฏเตเดŸเต† เด˜เดŸเด•เด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเดพเดฏเดฟ เด…เดฆเตเดฆเต‡เดนเด‚ เดˆ เดชเดฆเด‚ เด†เดฆเตเดฏเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเดšเตเดšเต. เดŸเต‹เด‚ เดกเดฟเดฎเดพเตผเด•เตเด•เต‹ เดฎเตเดฎเตเดชเต เดจเดฟเตผเดตเดšเดฟเดšเตเดš เด•เดฃเด•เตเดฑเตเดฑเดฟเดตเดฟเดฑเตเดฑเดฟ เดชเดพเดฑเตเดฑเต‡เดฃเดฟเดจเตเดฑเต† เดญเต‚เดฐเดฟเดญเดพเด—เดตเตเด‚ เดˆ เด†เดถเดฏเด‚ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต.

เดกเต‡เดตเดฟเดกเต เดชเตผเดฃเดพเดธเต เดฐเต‚เดชเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏ เดจเดฟเดฐเดตเดงเดฟ เด†เดถเดฏเด™เตเด™เดณเตเด‚ เดˆ เด†เดถเดฏเดคเตเดคเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต. เดŽเตปเด•เตเดฏเดพเดชเตโ€Œเดธเตเดฒเต‡เดทเตป, เดตเดฟเดตเดฐเด™เตเด™เตพ เดฎเดฑเดฏเตเด•เตเด•เตฝ เดŽเดจเตเดจเดฟเดตเดฏเดพเดฃเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด‚ เดฐเดฃเตเดŸเตเด‚. เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเต† เดชเตเดฐเดคเตเดฏเต‡เด• เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฌเตเดฒเต‹เด•เตเด•เต เดกเดฏเด—เตเดฐเดฎเตเด•เดณเตเดŸเต†เดฏเต‹ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดซเตเดฒเต‹เด•เดณเตเดŸเต†เดฏเต‹ เดตเดฟเดถเด•เดฒเดจเดคเตเดคเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดคเดฒเตเดฒเต†เดจเตเดจเต เดชเตผเดฃเดธเต เดตเดพเดฆเดฟเดšเตเดšเต. เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเดฟเตฝ เด•เตเดฒเดฏเดจเตเดฑเตเด•เตพเด•เตเด•เต เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดตเดฟเดตเดฐเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดชเดฐเดฟเดนเดพเดฐเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚.

เดตเดดเดฟเดฏเดฟเตฝ, เดฎเดพเตผเดŸเตเดŸเดฟเตป เด’เดฐเต เด•เดฎเตเดชเดจเดฟเดฏเตเดŸเต† (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 เดคเดคเตเดตเด‚ เดฒเด‚เด˜เดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เดนเตเดฐเดธเตเดตเด•เดพเดฒ เดคเดจเตเดคเตเดฐเดชเดฐเดฎเดพเดฏ เดตเดฟเดœเดฏเด‚ เดจเตฝเด•เดฟเดฏเต‡เด•เตเด•เดพเด‚, เดŽเดจเตเดจเดพเตฝ เด…เดตเดธเดพเดจเด‚ เดจเดฎเตเด•เตเด•เต "เดฏเตเดฆเตเดงเด‚ เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเด‚", เดญเดพเดตเดฟเดฏเดฟเตฝ เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดฐเดพเด•เตเดทเดธเดจเต† เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเตเดจเตเดจเดคเต เดตเดณเดฐเต† เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต† เด•เต‹เดกเดฟเดจเตเดฑเต† เดชเตเดฐเดคเตเดฏเต‡เด• เดตเดฟเดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต, เด…เดตเดฏเดฟเตฝ เด“เดฐเต‹เดจเตเดจเตเด‚ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดŸเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเด•เดณเดพเดฃเต. เด‡เดคเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดฟ, เดจเดฎเตเด•เตเด•เต เดธเตเดชเต‡เดธเต เดธเตเดฑเตเดฑเต‡เดทเตป เด•เตเดฒเดพเดธเต เดฎเดพเดฑเตเดฑเดพเด‚.

เดจเดฎเตเด•เตเด•เต เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเด‚ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดพเด‚

เดธเตโ€Œเดชเต‡เดธเตโ€Œเดธเตเดฑเตเดฑเต‡เดทเตป เด•เตเดฒเดพเดธเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเดจเตเดจ เดจเดพเดฒเต เดคเดฐเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดžเด™เตเด™เตพ เดฎเตเด•เดณเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเต. เดฑเต€เดซเดพเด•เตโ€ŒเดŸเตผ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดžเด™เตเด™เตพ เด…เดต เดฎเดจเดธเตเดธเดฟเตฝ เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเด‚. เดชเตเดคเตเด•เตเด•เดฟเดฏ เด•เต‹เดกเต เดŽเดธเตเด†เตผเดชเดฟเดฏเตเดฎเดพเดฏเดฟ เดจเดจเตเดจเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต.

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. เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตผ เด•เตเดฒเดพเดธเดฟเดฒเต† เด•เตเดŸเตเดŸเดฟเด•เดณเดพเดฃเต เด‡เดฐเตเดตเดฐเตเด‚. เด•เต‚เดŸเดพเดคเต†, เดžเด™เตเด™เตพ เดธเตโ€Œเดชเต‡เดธเตโ€Œเดธเตเดฑเตเดฑเต‡เดทเตป เด•เตเดฒเดพเดธเดฟเดฒเต‡เด•เตเด•เต เด‡เตปเดธเตโ€Œเดฑเตเดฑเตปเดธเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดšเต‡เตผเดคเตเดคเต, เด…เดคเดฟเดจเดพเตฝ เด†เดตเดถเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดธเดฌเตโ€Œเด•เตเดฒเดพเดธเต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เด‡เดชเตเดชเต‹เตพ, เดญเต‚เดฎเดฟ เดฎเดฑเตเดฑเต†เดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดพเดฑเตเดฑเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดžเด™เตเด™เตพ เดธเดฌเตเด•เตเดฒเดพเดธเตเดธเตเด•เดณเดฟเตฝ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเด‚, เดชเตเดฐเดงเดพเดจ เด•เตเดฒเดพเดธเดฟเดฒเต‡เด•เตเด•เดฒเตเดฒ.

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดžเด™เตเด™เดณเตเดŸเต† เดšเดฟเดฒ เด•เตเดฒเดพเดธเตเด•เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเดฐเดธเตเดชเดฐเด‚ เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เดธเดชเตเดฒเตˆ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตผ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเดชเตเดฒเตˆ เดนเต‹เตพเดกเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดซเตเดฏเต‚เดตเตฝ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตผ เดซเตเดฏเต‚เดตเตฝ เดŸเดพเด™เตเด•เดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดฌเต‚เดธเตเดฑเตเดฑเดฑเตเด•เตพ เด‡เดจเตเดงเดจ เดŸเดพเด™เตเด•เตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เดฃเด‚. เดŽเดจเตเดจเดพเตฝ เด‡เดตเดฟเดŸเต† เดŽเดฒเตเดฒเดพเด‚ เด‡เดคเดฟเดจเด•เด‚ เดฏเตเด•เตเดคเดฟเดธเดนเดฎเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต, เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเดจเตเดจเดคเต เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒ - เด’เดฐเต เดตเดธเตเดคเตเดตเดฟเดจเตเดฑเต† เด•เต‹เดกเต เดŽเดกเดฟเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดฎเดฑเตเดฑเตŠเดจเตเดจเดฟเดจเต† เด•เดพเดฐเตเดฏเดฎเดพเดฏเดฟ เดฌเดพเดงเดฟเด•เตเด•เดฟเดฒเตเดฒ.

เด…เด™เตเด™เดจเต†, เด“เดฐเต‹ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเตเดŸเต†เดฏเตเด‚/เด•เตเดฒเดพเดธเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเด™เตเด™เตพ เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดจเดฟเตผเดตเตเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฎเต‹เดกเตเดฒเดพเตผ เด•เต‹เดกเต เดžเด™เตเด™เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเต. เด…เดคเตเดคเดฐเด‚ เด•เต‹เดกเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เดชเตเดฐเดถเตเดจเดฎเดฒเตเดฒ, เด…เดคเต เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดœเต‹เดฒเดฟเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เดžเด™เตเด™เตพ "เดฆเตˆเดตเดฟเด• เดตเดธเตเดคเตเดตเดฟเดจเต†" เดฎเตเดดเตเดตเตป เดŽเดธเตเด†เตผเดชเดฟ เด†เด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเดฟ.

เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•