SOLID เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเจšเจ•เจฆเจพเจฐ เจ•เฉ‹เจก เจฒเจฟเจ–เจฃเจพ

SOLID เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเจšเจ•เจฆเจพเจฐ เจ•เฉ‹เจก เจฒเจฟเจ–เจฃเจพ

เจ…เจจเฉเจตเจพเจฆเจ• เจคเฉ‹เจ‚: เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจธเฉ‡เจตเจฐเจฟเจจ เจชเฉ‡เจฐเฉ‡เจœเจผ เจฆเฉเจ†เจฐเจพ เจฒเฉ‡เจ– เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจ เฉ‹เจธ เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡เฅค เจฒเฉ‡เจ– เจคเฉ‹เจ‚ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจตเจพเจฒเจฟเจ†เจ‚ เจ…เจคเฉ‡ เจคเจœเจฐเจฌเฉ‡เจ•เจพเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐเจพเจ‚ เจฆเฉ‹เจตเจพเจ‚ เจฒเจˆ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เฉ€.

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจตเจฟเจ•เจพเจธ เจตเจฟเฉฑเจš เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจธเฉฐเจญเจพเจตเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ เฉ‹เจธ เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ เจฌเจพเจฐเฉ‡ เจธเฉเจฃเจฟเจ† เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‰เจน เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจจเฉ‚เฉฐ เจธเจพเจซเจผ, เจšเฉฐเจ—เฉ€ เจคเจฐเฉเจนเจพเจ‚ เจขเจพเจ‚เจšเจพเจ—เจค เจ…เจคเฉ‡ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจธเจพเจ‚เจญเจฃเจฏเฉ‹เจ— เจ•เฉ‹เจก เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจจเจพ เจนเฉˆ เจ‡เจธ เจฒเจˆ เจ•เจˆ เจคเจฐเฉ€เจ•เฉ‡ เจนเจจ. เจตเฉฑเจ–-เจตเฉฑเจ– เจฎเจพเจนเจฟเจฐเจพเจ‚ เจฆเฉ‡ "เจธเจนเฉ€ เจฎเจพเจฐเจ—" เจฌเจพเจฐเฉ‡ เจตเฉฑเจ–เฉ‹-เจตเฉฑเจ–เจฐเฉ‡ เจตเจฟเจšเจพเจฐ เจ…เจคเฉ‡ เจธเจฎเจ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ; เจ‡เจน เจธเจญ เจนเจฐเฉ‡เจ• เจตเจฟเจ…เจ•เจคเฉ€ เจฆเฉ‡ เจ…เจจเฉเจญเจต 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, SOLID เจตเจฟเฉฑเจš เจ˜เฉ‹เจธเจผเจฟเจค เจ•เฉ€เจคเฉ‡ เจ—เจ เจตเจฟเจšเจพเจฐเจพเจ‚ เจจเฉ‚เฉฐ IT เจญเจพเจˆเจšเจพเจฐเฉ‡ เจฆเฉ‡ เจฒเจ—เจญเจ— เจธเจพเจฐเฉ‡ เจชเฉเจฐเจคเฉ€เจจเจฟเจงเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจธเจตเฉ€เจ•เจพเจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‰เจน เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจšเฉฐเจ—เฉ‡ เจตเจฟเจ•เจพเจธ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจ‰เจญเจพเจฐ เจ…เจคเฉ‡ เจตเจฟเจ•เจพเจธ เจฒเจˆ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจฌเจฟเฉฐเจฆเฉ‚ เจฌเจฃ เจ—เจเฅค

เจ†เจ“ เจธเจฎเจเฉ€เจ เจ•เจฟ เจ เฉ‹เจธ เจธเจฟเจงเจพเจ‚เจค เจ•เฉ€ เจนเจจ เจ…เจคเฉ‡ เจ‰เจน เจธเจพเจกเฉ€ เจ•เจฟเจตเฉ‡เจ‚ เจฎเจฆเจฆ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ: เจชเฉเจฐเฉˆเจ•เจŸเฉ€เจ•เจฒ เจ•เฉ‹เจฐเจธ "เจฎเฉ‹เจฌเจพเจˆเจฒ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจชเฉเจฐเฉ‹".

เจ…เจธเฉ€เจ‚ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚: "Habr" เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ - "Habr" เจชเฉเจฐเจšเจพเจฐ เจ•เฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจ•เฉ‹เจฐเจธ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒเจพ เจฒเฉˆเจฃ เจตเฉ‡เจฒเฉ‡ 10 เจฐเฉ‚เจฌเจฒ เจฆเฉ€ เจ›เฉ‹เจŸเฅค

SOLID เจ•เฉ€ เจนเฉˆ?

เจ‡เจน เจธเจผเจฌเจฆ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจฐเฉ‚เจช เจนเฉˆ, เจธเจผเจฌเจฆ เจฆเจพ เจนเจฐเฉ‡เจ• เจ…เฉฑเจ–เจฐ เจ‡เฉฑเจ• เจ–เจพเจธ เจธเจฟเจงเจพเจ‚เจค เจฆเฉ‡ เจจเจพเจฎ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจนเฉˆ:

  • Sเจธเฉฐเจ—เจ เจฟเจค เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€ เจธเจฟเจงเจพเจ‚เจคเฅค เจ‡เฉฑเจ• เจฎเฉ‹เจกเฉ€เจŠเจฒ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€ เจฆเจพ เจ‡เฉฑเจ• เจนเฉ€ เจ•เจพเจฐเจจ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค
  • The Oเจ•เจฒเจฎ/เจฌเฉฐเจฆ เจธเจฟเจงเจพเจ‚เจค (เจ–เฉเฉฑเจฒเฉเจนเฉ‡/เจฌเฉฐเจฆ เจธเจฟเจงเจพเจ‚เจค)เฅค เจ•เจฒเจพเจธเจพเจ‚ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจคเฉฑเจค เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจฒเจˆ เจ–เฉเฉฑเจฒเฉเจนเฉ‡ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ, เจชเจฐ เจธเฉ‹เจง เจฒเจˆ เจฌเฉฐเจฆ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค
  • โ€ŠThe Liskov เจฌเจฆเจฒเฉ€ เจฆเจพ เจธเจฟเจงเจพเจ‚เจค (เจฒเจฟเจธเจ•เฉ‹เจต เจฌเจฆเจฒ เจธเจฟเจงเจพเจ‚เจค)เฅค เจฌเฉ‡เจธ เจŸเจพเจˆเจช เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจฌเฉ‡เจธ เจŸเจพเจˆเจช เจฆเฉ‡ เจ‰เจช-เจ•เจฟเจธเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจœเจพเจฃเฉ‡ เจฌเจฟเจจเจพเจ‚ เจตเจฐเจคเจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค
  • The Iเจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเฉฑเจ– เจ•เจฐเจจ เจฆเจพ เจธเจฟเจงเจพเจ‚เจคโ€Š (เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเฉฑเจ– เจ•เจฐเจจ เจฆเจพ เจธเจฟเจงเจพเจ‚เจค)เฅค เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจธเฉฐเจธเจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‰เจน เจจเจนเฉ€เจ‚ เจตเจฐเจคเจฆเฉ‡ เจนเจจเฅค
  • The Dเจจเจฟเจฐเจญเจฐเจคเจพ เจ‰เจฒเจŸ เจธเจฟเจงเจพเจ‚เจค (เจจเจฟเจฐเจญเจฐเจคเจพ เจ‰เจฒเจŸเจฃ เจฆเจพ เจธเจฟเจงเจพเจ‚เจค)เฅค เจ‰เฉฑเจš เจชเฉฑเจงเจฐเจพเจ‚ 'เจคเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจนเฉ‡เจ เจฒเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒเจพเจ‚ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค

เจธเจฟเฉฐเจ—เจฒ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€ เจธเจฟเจงเจพเจ‚เจค

โ€Š
เจธเจฟเฉฐเจ—เจฒ เจฐเจฟเจธเจชเฉŒเจ‚เจธเฉ€เจฌเจฟเจฒเจŸเฉ€ เจธเจฟเจงเจพเจ‚เจค (SRP) เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจนเจฐเฉ‡เจ• เจ•เจฒเจพเจธ เจœเจพเจ‚ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ‰เจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจฆเฉ‡ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจนเจฟเฉฑเจธเฉ‡ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจธ เจœเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€ เจฆเฉ‡ เจคเฉฑเจค เจ—เฉˆเจฐ-เจธเจฌเฉฐเจงเจค เจ•เจฒเจพเจธเจพเจ‚ เจตเจฟเฉฑเจš เจ–เจฟเฉฐเจกเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจฌเจœเจพเจ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจ†เจชเจฃเฉ€ เจœเจฎเจพเจค เจจเฉ‚เฉฐ เจธเฉŒเจ‚เจชเฉ‡ เจœเจพเจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค SRP เจฆเฉ‡ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจชเฉเจฐเจšเจพเจฐเจ•, เจฐเฉŒเจฌเจฐเจŸ เจเจธ. เจฎเจพเจฐเจŸเจฟเจจ, เจœเจตเจพเจฌเจฆเฉ‡เจนเฉ€ เจจเฉ‚เฉฐ เจคเจฌเจฆเฉ€เจฒเฉ€ เจฆเจพ เจ•เจพเจฐเจจ เจฆเฉฑเจธเจฆเฉ‡ เจนเจจเฅค เจ‰เจธเจจเฉ‡ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจธ เจธเจผเจฌเจฆ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ•เฉฐเจฎ "เจ†เจฌเจœเฉˆเจ•เจŸ-เจ“เจฐเฉ€เจเจ‚เจŸเจก เจกเจฟเจœเจผเจพเจˆเจจ เจฆเฉ‡ เจธเจฟเจงเจพเจ‚เจค" เจฆเฉ‡ เจ‡เฉฑเจ• เจคเฉฑเจค เจตเจœเฉ‹เจ‚ เจชเฉเจฐเจธเจคเจพเจตเจฟเจค เจ•เฉ€เจคเจพ เจธเฉ€เฅค เจธเฉฐเจ•เจฒเจช เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจ•เจจเฉˆเจ•เจŸเฉ€เจตเจฟเจŸเฉ€ เจชเฉˆเจŸเจฐเจจ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจœเฉ‹ เจชเจนเจฟเจฒเจพเจ‚ เจŸเฉŒเจฎ เจกเฉ€เจฎเจพเจฐเจ•เฉ‹ เจฆเฉเจ†เจฐเจพ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค

เจ‡เจธ เจธเฉฐเจ•เจฒเจช เจตเจฟเฉฑเจš เจกเฉ‡เจตเจฟเจก เจชเจฐเจจเจพเจธ เจฆเฉเจ†เจฐเจพ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ•เจˆ เจงเจพเจฐเจจเจพเจตเจพเจ‚ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจนเจจเฅค เจฆเฉ‹ เจฎเฉเฉฑเจ– เจนเจจ เจ‡เจจเจ•เฉˆเจชเจธเฉ‚เจฒเฉ‡เจธเจผเจจ เจ…เจคเฉ‡ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฒเฉเจ•เจพเจ‰เจฃเจพเฅค เจชเจฐเจจเจพเจธ เจจเฉ‡ เจฆเจฒเฉ€เจฒ เจฆเจฟเฉฑเจคเฉ€ เจ•เจฟ เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจตเฉฑเจ–เจฐเฉ‡ เจฎเจพเจกเจฟเจŠเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฃเจพ เจฌเจฒเจพเจ• เจกเจพเจ‡เจ—เฉเจฐเจพเจฎ เจœเจพเจ‚ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจซเจฒเฉ‹ เจฆเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฎเฉˆเจกเจฟเจŠเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ–เจพเจธ เจนเฉฑเจฒ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจœเฉ‹ เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ, เจฎเจพเจฐเจŸเจฟเจจ เจจเฉ‡ เจ‡เฉฑเจ• เจ•เฉฐเจชเจจเฉ€ (เจธเฉ€.เจ“.เจ“., เจธเฉ€.เจŸเฉ€.เจ“., เจธเฉ€.เจเฉฑเจซ.เจ“.) เจฆเฉ‡ เจธเฉ€เจจเฉ€เจ…เจฐ เจฎเฉˆเจจเฉ‡เจœเจฐเจพเจ‚ เจจเจพเจฒ เจ‡เฉฑเจ• เจฆเจฟเจฒเจšเจธเจช เจ‰เจฆเจพเจนเจฐเจฃ เจฆเจฟเฉฑเจคเฉ€, เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐ เจ‡เฉฑเจ• เจตเฉฑเจ–-เจตเฉฑเจ– เจ‰เจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจ–เจพเจธ เจตเจชเจพเจฐเจ• เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจตเจฐเจคเจฆเจพ เจนเฉˆเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เฉ‹เจˆ เจตเฉ€ เจฆเฉ‚เจœเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจ•เจพเจ‚ เจฆเฉ‡ เจนเจฟเฉฑเจคเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจฌเฉเจฐเจนเจฎ เจตเจธเจคเฉ‚

เจนเจฎเฉ‡เจธเจผเจพ เจตเจพเจ‚เจ—, 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

เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจธเจพเจกเจพ เจชเฉเจฒเจพเฉœ เจธเจŸเฉ‡เจธเจผเจจ เจ…เจธเจฅเจฟเจฐ เจนเฉˆ (เจฎเฉˆเจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฒเฉฑเจ—เจฆเจพ เจ•เจฟ เจฎเฉˆเจจเฉ‚เฉฐ เจœเจฒเจฆเฉ€ เจนเฉ€ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฎเฉ‡เจ‚ NASA เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ•เจพเจฒ เจ†เจตเฉ‡เจ—เฉ€), เจชเจฐ เจ‡เฉฑเจฅเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฒเจˆ เจ•เฉเจ เจนเฉˆเฅค

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจธเจชเฉ‡เจธ เจธเจŸเฉ‡เจธเจผเจจ เจ•เจฒเจพเจธ เจฆเฉ€เจ†เจ‚ เจ•เจˆ เจตเฉฑเจ–เจฐเฉ€เจ†เจ‚ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€เจ†เจ‚ (เจœเจพเจ‚ เจ•เฉฐเจฎ) เจนเจจเฅค เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจธเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ:

  • เจธเฉˆเจ‚เจธเจฐ;
  • เจธเจชเจฒเจพเจˆ (เจ‰เจชเจญเฉ‹เจ—เจคเจพ);
  • เจฌเจพเจฒเจฃ;
  • เจเจ•เจธเจฒเฉ‡เจŸเจฐ

เจนเจพเจฒเจพเจ‚เจ•เจฟ เจธเจŸเฉ‡เจธเจผเจจ เจฆเฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ•เจฐเจฎเจšเจพเจฐเฉ€ เจจเฉ‚เฉฐ เจ•เจฒเจพเจธ เจจเจนเฉ€เจ‚ เจธเฉŒเจ‚เจชเฉ€ เจ—เจˆ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ•เจฒเจชเจจเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ•เจฟเจธ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจธเฉฐเจญเจพเจตเจค เจคเฉŒเจฐ 'เจคเฉ‡, เจตเจฟเจ—เจฟเจ†เจจเฉ€ เจธเฉˆเจ‚เจธเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ, เจฒเฉŒเจœเจฟเจธเจŸเจฟเจ•เจธ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจธเจชเจฒเจพเจˆ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆ, เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐ เจฌเจพเจฒเจฃ เจฆเฉ€ เจธเจชเจฒเจพเจˆ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆ, เจ…เจคเฉ‡ เจชเจพเจ‡เจฒเจŸ เจฌเฉ‚เจธเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เฉ€ เจ…เจธเฉ€เจ‚ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เจน เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ SRP เจ…เจจเฉเจ•เฉ‚เจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ? เจœเฉ€ เจฌเจฟเจฒเจ•เฉเจฒ. เจชเจฐ เจธเจชเฉ‡เจธ เจธเจŸเฉ‡เจธเจผเจจ เจ•เจฒเจพเจธ เจ‡เฉฑเจ• เจ†เจฎ "เจฐเฉฑเจฌ เจตเจธเจคเฉ‚" เจนเฉˆ เจœเฉ‹ เจธเจญ เจ•เฉเจ เจœเจพเจฃเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจญ เจ•เฉเจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ†เจฌเจœเฉˆเจ•เจŸ-เจ…เจงเจพเจฐเจฟเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉเจฐเจฎเฉเฉฑเจ– เจตเจฟเจฐเฉ‹เจงเฉ€ เจชเฉˆเจŸเจฐเจจ เจนเฉˆเฅค เจ‡เฉฑเจ• เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจฒเจˆ, เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจญเจพเจฒเจฃเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจนเฉเจฃ เจคเฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉˆ, เจนเจพเจ‚, เจชเจฐ เจ•เจฒเจชเจจเจพ เจ•เจฐเฉ‹ เจ•เจฟ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚เฅค เจธเจผเจพเจ‡เจฆ เจธเจพเจกเฉ‡ เจชเฉเจฒเจพเฉœ เจธเจŸเฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจฎเฉˆเจกเฉ€เจ•เจฒ เจธเจŸเฉ‡เจธเจผเจจ เจœเจพเจ‚ เจฎเฉ€เจŸเจฟเฉฐเจ— เจฐเฉ‚เจฎ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจ…เจคเฉ‡ เจœเจฟเฉฐเจจเฉ‡ เจœเจผเจฟเจ†เจฆเจพ เจซเฉฐเจ•เจธเจผเจจ เจนเฉ‹เจฃเจ—เฉ‡, เจ“เจจเจพ เจนเฉ€ เจœเจผเจฟเจ†เจฆเจพ เจธเจชเฉ‡เจธ เจธเจŸเฉ‡เจธเจผเจจ เจตเจงเฉ‡เจ—เจพเฅค เจ–เฉˆเจฐ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจธเจนเฉ‚เจฒเจค เจนเฉ‹เจฐเจพเจ‚ เจจเจพเจฒ เจœเฉเฉœ เจœเจพเจตเฉ‡เจ—เฉ€, เจชเฉ‚เจฐเฉ‡ เจ•เฉฐเจชเจฒเฉˆเจ•เจธ เจฆเฉ€ เจธเฉ‡เจตเจพ เจ•เจฐเจจเจพ เจนเฉ‹เจฐ เจตเฉ€ เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจเจ•เจธเจฒเฉ‡เจŸเจฐเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจšเจพเจฒเจจ เจตเจฟเฉฑเจš เจตเจฟเจ˜เจจ เจชเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจ–เฉ‹เจœเจ•เจฐเจคเจพ เจธเฉˆเจ‚เจธเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจพเจ… เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน เจธเจŸเฉ‡เจธเจผเจจ เจฆเฉ‡ เจธเฉฐเจšเจพเจฐ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจšเฉฐเจ—เฉ€ เจคเจฐเฉเจนเจพเจ‚ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจเจธเจ†เจฐเจชเฉ€ เจธเจฟเจงเจพเจ‚เจค เจฆเฉ€ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจ•เจฐเจจ เจจเจพเจฒ เจฅเฉ‹เฉœเฉเจนเฉ‡ เจธเจฎเฉ‡เจ‚ เจฒเจˆ เจฐเจฃเจจเฉ€เจคเจ• เจœเจฟเฉฑเจค เจฎเจฟเจฒ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจชเจฐ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ "เจœเฉฐเจ— เจนเจพเจฐ เจœเจพเจตเจพเจ‚เจ—เฉ‡", เจ…เจคเฉ‡ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจ…เจœเจฟเจนเฉ‡ เจฐเจพเจ–เจธเจผ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ–เจฃเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เฉ‹เจก เจฆเฉ‡ เจตเฉฑเจ–เจฐเฉ‡ เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฃเจพ เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจนเฉˆ, เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐ เจ‡เฉฑเจ• เจ–เจพเจธ เจ•เจพเจฐเจตเจพเจˆ เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค เจ‡เจธ เจจเฉ‚เฉฐ เจธเจฎเจเจฆเฉ‡ เจนเฉ‹เจ, เจ†เจ“ เจธเจชเฉ‡เจธ เจธเจŸเฉ‡เจธเจผเจจ เจ•เจฒเจพเจธ เจจเฉ‚เฉฐ เจฌเจฆเจฒเฉ€เจเฅค

เจ†เจ“ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€ เจตเฉฐเจกเฉ€เจ

เจ‰เฉฑเจชเจฐ เจ…เจธเฉ€เจ‚ เจšเจพเจฐ เจ•เจฟเจธเจฎเจพเจ‚ เจฆเฉ‡ เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจนเฉˆ เจœเฉ‹ เจธเจชเฉ‡เจธ เจธเจŸเฉ‡เจธเจผเจจ เจ•เจฒเจพเจธ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจฐเฉ€เจซเฉˆเจ•เจŸเจฐเจฟเฉฐเจ— เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจพเจ‚เจ—เฉ‡เฅค เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เฉ€เจคเจพ เจ•เฉ‹เจก 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.

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจ‡เจธ เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš, เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฆเฉ‹ เจจเจตเฉ€เจ†เจ‚ เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚, เจซเจฟเจŠเจฒเจฐเจฟเจชเฉ‹เจฐเจŸเจฐ เจ…เจคเฉ‡ เจธเจชเจฒเจพเจˆเจฐเจฟเจชเฉ‹เจฐเจŸเจฐ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจ‡เจน เจฆเฉ‹เจตเฉ‡เจ‚ เจฐเจฟเจชเฉ‹เจฐเจŸเจฐ เจœเจฎเจพเจค เจฆเฉ‡ เจฌเฉฑเจšเฉ‡ เจนเจจเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ…เจธเฉ€เจ‚ เจธเจชเฉ‡เจธเจธเจŸเฉ‡เจธเจผเจจ เจ•เจฒเจพเจธ เจตเจฟเฉฑเจš เจ‰เจฆเจพเจนเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจนเจจ เจคเจพเจ‚ เจœเฉ‹ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจธเจฌเจ•เจฒเจพเจธ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เฉ‡เฅค เจนเฉเจฃ, เจœเฉ‡เจ•เจฐ เจงเจฐเจคเฉ€ เจ•เฉเจ เจนเฉ‹เจฐ เจฌเจฆเจฒเจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‰เจช-เจ•เจฒเจพเจธเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจพเจ… เจ•เจฐเจพเจ‚เจ—เฉ‡, เจจเจพ เจ•เจฟ เจฎเฉเฉฑเจ– เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจตเจฟเฉฑเจšเฅค

เจฌเฉ‡เจธเจผเฉฑเจ•, เจธเจพเจกเฉ€เจ†เจ‚ เจ•เฉเจ เจœเจฎเจพเจคเจพเจ‚ เจ…เจœเฉ‡ เจตเฉ€ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจนเจจเฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, SupplyReporter เจ†เจฌเจœเฉˆเจ•เจŸ SupplyHold 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ FuelReporter FuelTank 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฌเฉ‡เจธเจผเฉฑเจ•, เจฌเฉ‚เจธเจŸเจฐ เจฌเจพเจฒเจฃ เจŸเฉˆเจ‚เจ• เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ. เจชเจฐ เจ‡เฉฑเจฅเฉ‡ เจธเจญ เจ•เฉเจ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจคเจฐเจ•เจชเฉ‚เจฐเจจ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ•เจฐเจจเจพ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเฉเจธเจผเจ•เจฒ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ - เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจฆเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เจฐเจจเจพ เจฆเฉ‚เจœเฉ‡ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจชเฉเจฐเจญเจพเจตเจฟเจค เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพ.

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฎเจพเจกเจฟเจŠเจฒเจฐ เจ•เฉ‹เจก เจฌเจฃเจพเจ‡เจ† เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจนเจฐ เจ‡เฉฑเจ• เจ†เจฌเจœเฉˆเจ•เจŸ/เจ•เจฒเจพเจธ เจฆเฉ€เจ†เจ‚ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจคเจฐเฉเจนเจพเจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ…เจœเจฟเจนเฉ‡ เจ•เฉ‹เจก เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจ•เฉ‹เจˆ เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ–เจฃเจพ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจ•เฉฐเจฎ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ€ โ€œเจฌเฉเจฐเจนเจฎ เจตเจธเจคเฉ‚โ€ เจจเฉ‚เฉฐ SRP เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฆเจฟเฉฑเจคเจพ เจนเฉˆเฅค

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹