ืฉืจื™ื™ื‘ืŸ ืคืœืขืงืกืึทื‘ืึทืœ ืงืึธื“ ื ื™ืฆืŸ SOLID

ืฉืจื™ื™ื‘ืŸ ืคืœืขืงืกืึทื‘ืึทืœ ืงืึธื“ ื ื™ืฆืŸ SOLID

ืคื•ืŸ ื“ืขืจ ืื™ื‘ืขืจื–ืขืฆืขืจ: ืืจื•ื™ืก ืคึฟืึทืจ ืื™ืจ ืึทืจื˜ื™ืงืœ ื“ื•ืจืš Severin Perez ื•ื•ืขื’ืŸ ื ื™ืฆืŸ SOLID ืคึผืจื™ื ืกืึทืคึผืึทืœื– ืื™ืŸ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’. ื“ื™ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื“ืขื ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ื‘ื™ื™ื“ืข ื‘ื™ื’ื™ื ืขืจื– ืื•ืŸ ื™ืงืกืคึผื™ืจื™ืึทื ืกื˜ ืคึผืจืึธื•ื’ืจืึทืžืขืจื–.

ืื•ื™ื‘ ืื™ืจ 'ืจืข ืื™ืŸ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’, ืื™ืจ'ื•ื•ืข ืžื™ืกื˜ืึธืžืข ื’ืขื”ืขืจื˜ ืคื•ืŸ ื“ื™ ืกืึธืœื™ื“ ืคึผืจื™ื ืกืึทืคึผืึทืœื–. ื–ื™ื™ ื’ืขื‘ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทืžื™ืกื˜ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืจื™ื™ืŸ, ื’ืขื–ื•ื ื˜-ืกื˜ืจืึทืงื˜ืฉืขืจื“ ืื•ืŸ ืœื™ื™ื›ื˜ ืžืึทื™ื ื˜ืึทื‘ืึทืœ ืงืึธื“. ืขืก ืื™ื– ื›ื“ืื™ ืฆื• ื‘ืืžืขืจืงืŸ ืึทื– ืื™ืŸ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ืึทืคึผืจืึธื•ื˜ืฉื™ื– ืฆื• ื•ื•ื™ ืฆื• ืจื™ื›ื˜ื™ืง ื“ื•ืจื›ืคื™ืจืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืึทืจื‘ืขื˜. ืคืึทืจืฉื™ื“ืขื ืข ืกืคึผืขืฉืึทืœืึทืกืฅ ื”ืึธื‘ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื’ืขื“ืื ืงืขืŸ ืื•ืŸ ืคืืจืฉื˜ืื ื“ ืคื•ืŸ ื“ื™ "ืจืขื›ื˜ ื•ื•ืขื’"; ืขืก ืึทืœืข ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ ื“ืขืจ ื“ืขืจืคืึทืจื•ื ื’ ืคื•ืŸ ื™ืขื“ืขืจ ืžืขื ื˜ืฉ. ืึธื‘ืขืจ, ื“ื™ ื™ื™ื“ื™ืึทื– ืคึผืจืึธื•ืงืœื™ื™ืžื“ ืื™ืŸ SOLID ื–ืขื ืขืŸ ืื ื’ืขื ื•ืžืขืŸ ื“ื•ืจืš ื›ึผืžืขื˜ ืึทืœืข ืคืืจืฉื˜ื™ื™ืขืจืก ืคื•ืŸ ื“ื™ IT ืงื”ืœ. ื–ื™ื™ ื’ืขื•ื•ืืจืŸ ื“ื™ ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ื ื˜ ืคึฟืึทืจ ื“ื™ ื™ืžืขืจื“ื–ืฉืึทื ืก ืื•ืŸ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ ืคื™ืœืข ื’ื•ื˜ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืคึผืจืึทืงื˜ื™ืกื™ื–.

ืœืึธืžื™ืจ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืึธืก ื“ื™ ืกืึธืœื™ื“ ืคึผืจื™ื ืกืึทืคึผืึทืœื– ื–ืขื ืขืŸ ืื•ืŸ ื•ื•ื™ ื–ื™ื™ ื”ืขืœืคึฟืŸ ืื•ื ื“ื–.

Skillbox ืจืขืงืึทืžืขื ื“ื–: ืคึผืจืึทืงื˜ื™ืฉ ืงื•ืจืก "ืžืึธื‘ื™ืœ ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคึผืจืึธ".

ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ: ืคึฟืึทืจ ืึทืœืข ืœื™ื™ืขื ืขืจ ืคื•ืŸ "ื”ื‘ืจ" - ืึท ืึทืจืึธืคึผืจืขื›ืขื ืขืŸ ืคื•ืŸ 10 ืจื•ื‘ืœ ื•ื•ืขืŸ ืื™ืจ ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ืงื™ื™ืŸ ืกืงื™ืœื‘ืึธืงืก ืงื•ืจืก ื ื™ืฆืŸ ื“ื™ ืคึผืขืจืžืึธื•ืฉืึทื ืึทืœ ืงืึธื“ "ื”ื‘ืจ".

ื•ื•ืึธืก ืื™ื– SOLID?

ื“ืขืจ ื˜ืขืจืžื™ืŸ ืื™ื– ืึท ืึทื‘ืจื™ื•ื•ื™ื™ื™ืฉืึทืŸ, ื™ืขื“ืขืจ ื‘ืจื™ื•ื• ืคื•ืŸ ื“ืขื ื˜ืขืจืžื™ืŸ ืื™ื– ื“ืขืจ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืคึผืจื™ื ืฆื™ืคึผ:

  • Sื™ื ื’ืœืข ืคึฟืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขื›ืงื™ื™ื˜ ืคึผืจื™ื ืฆื™ืคึผ. ื ืžืึธื“ื•ืœืข ืงืขื ืขืŸ ื”ืึธื‘ืŸ ืื™ื™ืŸ ืื•ืŸ ื‘ืœื•ื™ื– ืื™ื™ืŸ ืกื™ื‘ื” ืคึฟืึทืจ ื˜ื•ื™ืฉืŸ.
  • ื“ื™ Oืคืขื“ืขืจ / ืคืืจืžืื›ื˜ ืคึผืจื™ื ืฆื™ืคึผ (ืขืคืขื ืขืŸ / ืคืืจืžืื›ื˜ ืคึผืจื™ื ืฆื™ืคึผ). ืงืœืืกืŸ ืื•ืŸ ืื ื“ืขืจืข ืขืœืขืžืขื ื˜ืŸ ื–ืึธืœ ื–ื™ื™ืŸ ืึธืคืŸ ืคึฟืึทืจ ืคืึทืจืœืขื ื’ืขืจื•ื ื’, ืึธื‘ืขืจ ืคึฟืึทืจืžืึทื›ื˜ ืคึฟืึทืจ ืžืึทื“ืึทืคืึทืงื™ื™ืฉืึทืŸ.
  • โ€Šื“ื™ Lื™ืกืงืึธื•ื• ืกืึทื‘ืกื˜ื™ื˜ื•ืฉืึทืŸ ืคึผืจื™ื ืฆื™ืคึผ (ืœื™ืกืงืึธื•ื• ืกืึทื‘ืกื˜ื™ื˜ื•ืฉืึทืŸ ืคึผืจื™ื ืฆื™ืคึผ). ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ืึธืก ื ื•ืฆืŸ ืึท ื‘ืึทื–ืข ื˜ื™ืคึผ ื–ืึธืœ ืงืขื ืขืŸ ืฆื• ื ื•ืฆืŸ ืกื•ื‘ื˜ื™ืคึผืขืก ืคื•ืŸ ื“ื™ ื‘ืึทื–ืข ื˜ื™ืคึผ ืึธืŸ ื•ื•ื™ืกืŸ ืขืก.
  • ื“ื™ Iืฆื•ื‘ื™ื ื“ ืกืขื’ืจืขื’ืึทื˜ื™ืึธืŸ ืคึผืจื™ื ืฆื™ืคึผโ€Š (Interface ืฆืขืฉื™ื™ื“ื•ื ื’ ืคึผืจื™ื ืฆื™ืคึผ). ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืขื ื˜ื™ื˜ื™ื– ื–ืึธืœ ื ื™ืฉื˜ ืึธืคืขื ื’ืขืŸ ืื•ื™ืฃ ืžืขื˜ื”ืึธื“ืก ื•ื•ืึธืก ื–ื™ื™ ื˜ืึธืŸ ื ื™ื˜ ื ื•ืฆืŸ.
  • ื“ื™ Dืึธืคืขื ื’ื™ืงื™ื™ึทื˜ ื™ื ื•ื•ืขืจื–ืฉืึทืŸ ืคึผืจื™ื ืฆื™ืคึผ (ืคึผืจื™ื ืฆื™ืคึผ ืคื•ืŸ ื“ืขืคึผืขื ื“ืขื ืกื™ ื™ื ื•ื•ืขืจื–ืฉืึทืŸ). ืžืึธื“ื•ืœืขืก ืื™ืŸ ื”ืขื›ืขืจ ืœืขื•ื•ืขืœืก ื–ืึธืœ ื ื™ืฉื˜ ืึธืคืขื ื’ืขืŸ ืื•ื™ืฃ ืžืึทื“ื–ืฉื•ืœื– ืื™ืŸ ื ื™ื“ืขืจื™ืงืขืจ ืœืขื•ื•ืขืœืก.

ืื™ื™ืŸ ืคึฟืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขื›ืงื™ื™ื˜ ืคึผืจื™ื ืฆื™ืคึผ

โ€Š
ื“ื™ ืื™ื™ืŸ ืจืขืกืคึผืึธื ืกื™ื‘ื™ืœื™ื˜ื™ ืคึผืจื™ื ืฆื™ืคึผ (SRP) ื–ืื’ื˜ ืึทื– ื™ืขื“ืขืจ ืงืœืึทืก ืึธื“ืขืจ ืžืึธื“ื•ืœืข ืื™ืŸ ืึท ืคึผืจืึธื’ืจืึทื ื–ืึธืœ ื–ื™ื™ืŸ ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ื‘ืœื•ื™ื– ืื™ื™ืŸ ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืคื•ืŸ ื“ืขื ืคึผืจืึธื’ืจืึทื. ืึทื“ื“ื™ื˜ื™ืึธื ืึทืœืœื™, ืขืœืขืžืขื ื˜ืŸ ืคื•ืŸ ื“ืขื ืคึฟืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขื›ืงื™ื™ื˜ ื–ืึธืœ ื–ื™ื™ืŸ ืึทืกื™ื™ื ื“ ืฆื• ื–ื™ื™ืขืจ ืื™ื™ื’ืŸ ืงืœืึทืก, ืืœื ื•ื•ื™ ืฆืขื•ื•ืึธืจืคืŸ ืื™ื‘ืขืจ ืึทื ืจื™ืœื™ื™ื˜ื™ื“ ืงืœืืกืŸ. SRP ืก ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืื•ืŸ ื”ื•ื™ืคึผื˜ ืขื•ื•ืึทื ื’ืขืœื™ืกื˜, Robert S. Martin, ื‘ืืฉืจื™ื™ื‘ื˜ ืึทืงืึทื•ื ื˜ืึทื‘ื™ืœื™ื˜ื™ ื•ื•ื™ ื“ื™ ืกื™ื‘ื” ืคึฟืึทืจ ืขื ื“ืขืจื•ื ื’. ืขืจ ืขืจื™ื“ื–ืฉื ืึทืœื™ ืคืืจื’ืขืœื™ื™ื’ื˜ ื“ืขื ื˜ืขืจืžื™ืŸ ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื™ืกื•ื“ื•ืช ืคื•ืŸ ื–ื™ื™ืŸ ื•ื•ืขืจืง "ืคึผืจื™ื ืกื™ืคึผืœืขืก ืคื•ืŸ ืึธื‘ื“ื–ืฉืขืงื˜-ืึธืจื™ืขื ื˜ื™ื“ ืคึผืœืึทืŸ". ื“ืขืจ ื‘ืึทื’ืจื™ืฃ ื™ื ืงืึธืจืคึผืขืจื™ื™ืฅ ืคื™ืœ ืคื•ืŸ ื“ื™ ืงืึทื ืขืงื˜ื™ื•ื•ื™ื˜ื™ ืžื•ืกื˜ืขืจ ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ืคืจื™ืขืจ ื“ื™ืคื™ื™ื ื“ ื“ื•ืจืš Tom DeMarco.

ื“ืขืจ ื‘ืึทื’ืจื™ืฃ ืื•ื™ืš ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืขื˜ืœืขื›ืข ืงืึทื ืกืขืคึผืก ืคืึธืจืžื™ืึทืœื™ื™ื˜ืึทื“ ื“ื•ืจืš David Parnas. ื“ื™ ืฆื•ื•ื™ื™ ื”ื•ื™ืคึผื˜ ืึธื ืขืก ื–ืขื ืขืŸ ืขื ืงืึทืคึผืกื•ืœืึทื˜ื™ืึธืŸ ืื•ืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื›ื™ื™ื“ื™ื ื’. Parnas ืึทืจื’ื™ื•ื“ ืึทื– ื“ื™ื˜ื™ื™ืœื“ ืึท ืกื™ืกื˜ืขื ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ ืžืึทื“ื–ืฉื•ืœื– ื–ืึธืœ ื ื™ื˜ ื–ื™ื™ืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ื‘ืœืึธืง ื“ื™ื™ืึทื’ืจืึทืžื– ืึธื“ืขืจ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคืœืึธื•ื–. ืงื™ื™ืŸ ืคื•ืŸ ื“ื™ ืžืึทื“ื–ืฉื•ืœื– ืžื•ื–ืŸ ืึทื ื˜ื”ืึทืœื˜ืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืœื™ื™ื–ื•ื ื’ ื•ื•ืึธืก ื’ื™ื˜ ืึท ืžื™ื ื™ืžื•ื ืคื•ืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืฆื• ืงืœื™ื™ืึทื ืฅ.

ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืžืืจื˜ื™ืŸ ื”ืื˜ ืึท ื˜ืฉื™ืงืึทื•ื•ืข ื‘ื™ื™ึทืฉืคึผื™ืœ ืžื™ื˜ ืขืœื˜ืขืจ ืžืึทื ืึทื“ื–ืฉืขืจื– ืคื•ืŸ ืึท ืคื™ืจืžืข (COO, CTO, CFO), ื™ืขื“ืขืจ ืคื•ืŸ ื•ื•ืึธืก ื ื™ืฆื˜ ืกืคึผืขืฆื™ืคื™ืฉ ื’ืขืฉืขืคื˜ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืคึฟืึทืจ ืคืึทืจืฉื™ื“ืขื ืข ืฆื•ื•ืขืงืŸ. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืงื™ื™ืŸ ืคื•ืŸ ื–ื™ื™ ืงืขื ืขืŸ ื™ื ืกื˜ืจื•ืžืขื ื˜ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืึธืŸ ืึทืคืขืงื˜ื™ื ื’ ื“ื™ ืื™ื ื˜ืขืจืขืกืŸ ืคื•ืŸ ืื ื“ืขืจืข ืžืึทื ืึทื“ื–ืฉืขืจื–.

ื’ืขื˜ืœืขืš ื›ื™ื™ืคืขืฅ

ื•ื•ื™ ืฉื˜ืขื ื“ื™ืง, ื“ืขืจ ื‘ืขืกื˜ืขืจ ื•ื•ืขื’ ืฆื• ืœืขืจื ืขืŸ SRP ืื™ื– ืฆื• ื–ืขืŸ ืขืก ืื™ืŸ ืงืึทืžืฃ. ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ืึท ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ื ืึธื›ื’ื™ื™ืŸ ื“ื™ ืื™ื™ืŸ ืคึฟืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขื›ืงื™ื™ื˜ ืคึผืจื™ื ืฆื™ืคึผ. ื“ืึธืก ืื™ื– ืจื•ื‘ื™ ืงืึธื“ ื•ื•ืึธืก ื‘ืืฉืจื™ื™ื‘ื˜ ื“ื™ ื ืึทื˜ื•ืจ ืื•ืŸ ืึทื˜ืจื™ื‘ื™ื•ืฅ ืคื•ืŸ ื“ื™ ืคึผืœืึทืฅ ืกื˜ืึทื ืฆื™ืข.

ืื™ื‘ืขืจื‘ืœื™ืง ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ื“ื™ ืคืืœื’ืขื ื“ืข:
ืจื™ืกืคึผืึทื ืกืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื“ื™ ืึทื‘ื“ื–ืฉืขืงืฅ ื•ื•ืึธืก ื–ืขื ืขืŸ ื“ืขืจืงืœืขืจื˜ ืื™ืŸ ื“ื™ 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

ืึทืงื˜ื•ืึทืœืœื™, ืื•ื ื“ื–ืขืจ ืคึผืœืึทืฅ ืกื˜ืึทื ืฆื™ืข ืื™ื– ื“ื™ืกืคืึทื ื’ืงืฉืึทื ืึทืœ (ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื˜ืจืึทื›ื˜ืŸ ืื™ืš ื•ื•ืขื˜ ื‘ืึทืงื•ืžืขืŸ ืึท ืจื•ืฃ ืคื•ืŸ ื ืึทืกืึท ื‘ืึทืœื“), ืึธื‘ืขืจ ืขืก ืื™ื– ืขืคึผืขืก ืฆื• ืึทื ืึทืœื™ื™ื– ื“ืึธ.

ืื–ื•ื™, ื“ื™ SpaceStation ืงืœืึทืก ื”ืื˜ ืขื˜ืœืขื›ืข ืคืึทืจืฉื™ื“ืขื ืข ืจื™ืกืคึผืึทื ืกืึทื‘ื™ืœืึทื˜ื™ื– (ืึธื“ืขืจ ื˜ืึทืกืงืก). ืึทืœืข ืคื•ืŸ โ€‹โ€‹ื–ื™ื™ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืฆืขื˜ื™ื™ืœื˜ ืื™ืŸ ื˜ื™ื™ืคึผืก:

  • ืกืขื ืกืึธืจืก;
  • ืกืึทืคึผืœื™ื™ื– (ืงืึธื ืกื•ืžืึทื‘ืœืขืก);
  • ื‘ืจืขื ื•ื•ืึทืจื’;
  • ืึทืงืกืขืœืขืจื™ื™ื˜ืขืจื–.

ื›ืึธื˜ืฉ ืงื™ื™ื ืขืจ ืคึฟื•ืŸ ื“ื™ ืึธื ื’ืขืฉื˜ืขืœื˜ืข ืคึฟื•ืŸ ื“ืขืจ ืกื˜ืึทื ืฆื™ืข ื•ื•ืขืจื˜ ื ื™ืฉื˜ ื‘ืึทืฉื˜ื™ืžื˜ ืงื™ื™ืŸ ืงืœืึทืก, ืงืขื ืขืŸ ืžื™ืจ ื–ื™ืš ื’ืจื™ื ื’ ืคึฟืึธืจืฉื˜ืขืœืŸ, ื•ื•ืขืจ ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ื•ื•ืึธืก. ืจื•ื‘ึฟ ืžืกืชึผืžื, ื“ืขืจ ื’ืขืœืขืจื ื˜ืขืจ ืงืึธื ื˜ืจืึธืœืก ื“ื™ ืกืขื ืกืึธืจืก, ื“ืขืจ ืœืึธื’ื™ืกื˜ื™ืงื™ืึทืŸ ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ืฆื•ืฉื˜ืขืœืŸ ืจืขืกื•ืจืกืŸ, ื“ืขืจ ื™ื ื–ืฉืขื ื™ืจ ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ื‘ืจืขื ื•ื•ืึทืจื’ ืกืึทืคึผืœื™ื™ื–, ืื•ืŸ ื“ืขืจ ืคึผื™ืœืึธื˜ ืงืึธื ื˜ืจืึธืœ ื“ื™ ื‘ื•ืกื˜ืขืจื–.

ืงืขื ืขืŸ ืžื™ืจ ื–ืึธื’ืŸ ืึทื– ื“ื™ ืคึผืจืึธื’ืจืึทื ืื™ื– ื ื™ืฉื˜ SRP ื’ืขื”ืึธืจื›ื™ืง? ื™ื ื–ื™ื›ืขืจ. ืื‘ืขืจ ื“ื™ ืกืคึผืึทืกืขืกื˜ืึทื˜ื™ืึธืŸ ืงืœืึทืก ืื™ื– ืึท ื˜ื™ืคึผื™ืฉ "ื’ืึธื˜ ื›ื™ื™ืคืขืฅ" ื•ื•ืึธืก ื•ื•ื™ื™ืกื˜ ืึทืœืฅ ืื•ืŸ ื˜ื•ื˜ ืึทืœืฅ. ื“ืึธืก ืื™ื– ืึท ื”ื•ื™ืคึผื˜ ืึทื ื˜ื™-ืžื•ืกื˜ืขืจ ืื™ืŸ ื›ื™ื™ืคืขืฅ-ืึธืจื™ืขื ื˜ื™ื“ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’. ืคึฟืึทืจ ืึท ืึธื ื”ื™ื™ื‘ืขืจ, ืึทื–ืึท ืึทื‘ื“ื–ืฉืขืงืฅ ื–ืขื ืขืŸ ื’ืึธืจ ืฉื•ื•ืขืจ ืฆื• ื˜ื™ื™ึทื ืขืŸ. ื‘ื™ื– ืื™ืฆื˜ ื“ื™ ืคึผืจืึธื’ืจืึทื ืื™ื– ื–ื™ื™ืขืจ ืคึผืฉื•ื˜, ื™ืึธ, ืึธื‘ืขืจ ื™ืžืึทื“ื–ืฉืึทืŸ ื•ื•ืึธืก ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ืื•ื™ื‘ ืžื™ืจ ืœื™ื™ื’ืŸ ื ื™ื™ึทืข ืคึฟืขื™ึดืงื™ื™ื˜ืŸ. ื˜ืึธืžืขืจ ืื•ื ื“ื–ืขืจ ืคึผืœืึทืฅ ืกื˜ืึทื ืฆื™ืข ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืึท ืžืขื“ื™ืฆื™ื ื™ืฉ ืกื˜ืึทื ืฆื™ืข ืึธื“ืขืจ ืึท ื‘ืึทื’ืขื’ืขื ื™ืฉ ืฆื™ืžืขืจ. ืื•ืŸ ื“ื™ ืžืขืจ ืคืึทื ื’ืงืฉืึทื ื– ืขืก ื–ืขื ืขืŸ, ื“ื™ ืžืขืจ SpaceStation ื•ื•ืขื˜ ื•ื•ืึทืงืกืŸ. ื ื•, ื–ื™ื ื˜ ื“ื™ ืžืขื›ื™ืจืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืึธื ื ืขืงื˜ืขื“ ืฆื• ืื ื“ืขืจืข, ื“ื™ ืกืขืจื•ื•ื™ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื’ืื ืฆืข ืงืึธืžืคึผืœืขืงืก ื•ื•ืขื˜ ื•ื•ืขืจืŸ ืืคื™ืœื• ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืžื™ืจ ืงืขื ืขืŸ ืฆืขืฉื˜ืขืจืŸ ื“ื™ ืึธืคึผืขืจืึทืฆื™ืข ืคื•ืŸ, ืœืžืฉืœ, ืึทืงืกืขืœืขืจื™ื™ื˜ืขืจื–. ืื•ื™ื‘ ื ืคืืจืฉืขืจ ืคืืจืœืื ื’ื˜ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืกืขื ืกืืจืก, ืงืขืŸ ื“ืืก ื–ื™ื™ืขืจ ื’ื•ื˜ ืืคืขืงื˜ื™ืจืŸ ื“ื™ ืงืืžื™ื•ื ื™ืงืืฆื™ืข ืกื™ืกื˜ืขืžืขืŸ ืคื•ืŸ ื“ืขืจ ืกื˜ืื ืฆื™ืข.

ื•ื•ื™ื™ืึทืœื™ื™ื˜ื™ื ื’ ื“ื™ SRP ืคึผืจื™ื ืฆื™ืคึผ ืงืขืŸ ื’ืขื‘ืŸ ืึท ืงื•ืจืฅ-ื˜ืขืจืžื™ืŸ ื˜ืึทืงื˜ื™ืฉ ื ืฆื—ื•ืŸ, ืึธื‘ืขืจ ืื™ืŸ ื“ื™ ืกื•ืฃ ืžื™ืจ ื•ื•ืขืœืŸ "ืคืึทืจืœื™ืจืŸ ื“ื™ ืžืœื—ืžื”", ืื•ืŸ ืขืก ื•ื•ืขื˜ ื•ื•ืขืจืŸ ื–ื™ื™ืขืจ ืฉื•ื•ืขืจ ืฆื• ื”ืึทืœื˜ืŸ ืึทื–ืึท ืึท ืคืึทืจื–ืขืขื ื™ืฉ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜. ืขืก ืื™ื– ื‘ืขืกื˜ืขืจ ืฆื• ื˜ื™ื™ืœืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ ืกืขืงืฉืึทื ื– ืคื•ืŸ ืงืึธื“, ื™ืขื“ืขืจ ืคื•ืŸ ื•ื•ืึธืก ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ืคึผืขืจืคืึธืจืžื™ื ื’ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืึธืคึผืขืจืึทืฆื™ืข. ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ืขื, ืœืึธื–ืŸ ืื•ื ื“ื– ื˜ื•ื™ืฉืŸ ื“ื™ SpaceStation ืงืœืึทืก.

ืœืึธืžื™ืจ ืฆืขื˜ื™ื™ืœืŸ ืคึฟืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขื›ืงื™ื™ื˜

ืื•ื™ื‘ืŸ ืžื™ืจ ื“ื™ืคื™ื™ื ื“ ืคื™ืจ ื˜ื™ื™ืคึผืก ืคื•ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื•ื•ืึธืก ื–ืขื ืขืŸ ืงืึทื ื˜ืจืึธื•ืœื“ ื“ื•ืจืš ื“ื™ SpaceStation ืงืœืึทืก. ืžื™ืจ ื•ื•ืขืœืŸ ื”ืึทืœื˜ืŸ ื–ื™ื™ ืื™ืŸ ื–ื™ื ืขืŸ ื•ื•ืขืŸ ืจื™ืคืึทืงื˜ืขืจื™ื ื’. ื“ืขืจ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ืงืึธื“ ื‘ืขืกืขืจ ื’ืœื™ื™ึทื›ืŸ ื“ื™ SRP.

class SpaceStation
  attr_reader :sensors, :supply_hold, :fuel_tank, :thrusters
 
  def initialize
    @supply_hold = SupplyHold.new
    @sensors = Sensors.new
    @fuel_tank = FuelTank.new
    @thrusters = Thrusters.new(@fuel_tank)
  end
end
 
class Sensors
  def run_sensors
    puts "----- Sensor Action -----"
    puts "Running sensors!"
  end
end
 
class SupplyHold
  attr_accessor :supplies
 
  def initialize
    @supplies = {}
  end
 
  def load_supplies(type, quantity)
    puts "----- Supply Action -----"
    puts "Loading #{quantity} units of #{type} in the supply hold."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- Supply Action -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "Using #{quantity} of #{type} from the supply hold."
      @supplies[type] -= quantity
    else
      puts "Supply Error: Insufficient #{type} in the supply hold."
    end
  end
 
  def report_supplies
    puts "----- Supply Report -----"
    if @supplies.keys.length > 0
      @supplies.each do |type, quantity|
        puts "#{type} avalilable: #{quantity} units"
      end
    else
      puts "Supply hold is empty."
    end
  end
end
 
class FuelTank
  attr_accessor :fuel
 
  def initialize
    @fuel = 0
  end
 
  def get_fuel_levels
    @fuel
  end
 
  def load_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Loading #{quantity} units of fuel in the tank."
    @fuel += quantity
  end
 
  def use_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Using #{quantity} units of fuel from the tank."
    @fuel -= quantity
  end
 
  def report_fuel
    puts "----- Fuel Report -----"
    puts "#{@fuel} units of fuel available."
  end
end
 
class Thrusters
  def initialize(fuel_tank)
    @linked_fuel_tank = fuel_tank
  end
 
  def activate_thrusters
    puts "----- Thruster Action -----"
    if @linked_fuel_tank.get_fuel_levels >= 10
      puts "Thrusting action successful."
      @linked_fuel_tank.use_fuel(10)
    else
      puts "Thruster Error: Insufficient fuel available."
    end
  end
end

ืขืก ื–ืขื ืขืŸ ืคื™ืœืข ืขื ื“ืขืจื•ื ื’ืขืŸ, ื“ื™ ืคึผืจืึธื’ืจืึทื ืื™ื– ื‘ืืฉื˜ื™ืžื˜ ื‘ืขืกืขืจ ืื™ืฆื˜. ืื™ืฆื˜ ืื•ื ื“ื–ืขืจ ืกืคึผืึทืกืขืกื˜ืึทื˜ื™ืึธืŸ ืงืœืึทืก ืื™ื– ื’ืขื•ื•ืืจืŸ ืžืขืจ ืคื•ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ืื™ืŸ ื•ื•ืึธืก ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื–ืขื ืขืŸ ื™ื ื™ืฉื™ื™ื™ื˜ื™ื“ ืคึฟืึทืจ ืึธืคืขื ื’ื™ืง ืคึผืึทืจืฅ, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืึท ื’ืึทื ื’ ืคื•ืŸ ืกืขื ืกืึธืจืก, ืึท ืงืึทื ืกื•ืžืึทื‘ืึทืœ ืฆื•ืฉื˜ืขืœืŸ ืกื™ืกื˜ืขื, ืึท ื‘ืจืขื ื•ื•ืึทืจื’ ื˜ืึทื ืง ืื•ืŸ ื‘ื•ืกื˜ืขืจื–.

ืคึฟืึทืจ ืงื™ื™ืŸ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืขืก ืื™ื– ืื™ืฆื˜ ืึท ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืงืœืึทืก: ืกืขื ืกืึธืจืก; SupplyHold; FuelTank; ื˜ืจื•ืกื˜ืขืจื–.

ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื•ื•ื™ื›ื˜ื™ืง ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ืขื ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืงืึธื“. ื“ื™ ืคื•ื ื˜ ืื™ื– ืึทื– ื™ื—ื™ื“ ืคืึทื ื’ืงืฉืึทื ื– ื–ืขื ืขืŸ ื ื™ืฉื˜ ื‘ืœื•ื™ื– ืขื ืงืึทืคึผืกืึทืœื™ื™ื˜ื™ื“ ืื™ืŸ ื–ื™ื™ืขืจ ืื™ื™ื’ืŸ ืงืœืืกืŸ, ื–ื™ื™ ื–ืขื ืขืŸ ืึธืจื’ืึทื ื™ื–ื™ืจื˜ ืื™ืŸ ืึทื–ืึท ืึท ื•ื•ืขื’ ืฆื• ื•ื•ืขืจืŸ ืคึผืจื™ื“ื™ืงื˜ืึทื‘ืึทืœ ืื•ืŸ ืงืึธื ืกื™ืกื˜ืขื ื˜. ืžื™ืจ ื’ืจื•ืคึผืข ืขืœืขืžืขื ื˜ืŸ ืžื™ื˜ ืขื ืœืขืš ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืฆื• ื ืึธื›ืคืึธืœื’ืŸ ื“ืขื ืคึผืจื™ื ืฆื™ืคึผ ืคื•ืŸ ืงืึธื•ื›ื™ืจืึทื ืก. ืื™ืฆื˜, ืื•ื™ื‘ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ื•ื•ืขื’ ื“ื™ ืกื™ืกื˜ืขื ืึทืจื‘ืขื˜, ืžืึทืš ืคื•ืŸ ืึท ื”ืึทืฉ ืกื˜ืจื•ืงื˜ื•ืจ ืฆื• ืึท ืžืขื ื’ืข, ื ืึธืจ ื ื•ืฆืŸ ื“ื™ SupplyHold ืงืœืึทืก; ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืื ื“ืขืจืข ืžืึทื“ื–ืฉื•ืœื–. ืึทื–ื•ื™, ืื•ื™ื‘ ื“ืขืจ ืœืึธื’ื™ืกื˜ื™ืง ืึธืคื™ืฆื™ืจ ืขื ื“ืขืจื˜ ืขืคึผืขืก ืื™ืŸ ื–ื™ื™ืŸ ืึธืคึผื˜ื™ื™ืœื•ื ื’, ื“ื™ ืจืขืฉื˜ ืคื•ืŸ ื“ื™ ืกื˜ืึทื ืฆื™ืข ื•ื•ืขื˜ ื‘ืœื™ื™ึทื‘ืŸ ื‘ืขืฉืึธืœืขื. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ SpaceStation ืงืœืึทืก ื•ื•ืขื˜ ื ื™ืฉื˜ ืืคื™ืœื• ื–ื™ื™ืŸ ืึทื•ื•ืขืจ ืคื•ืŸ ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ.

ืื•ื ื“ื–ืขืจ ืึธืคื™ืฆื™ืจืŸ ืืจื‘ืขื˜ืŸ ืื•ื™ืฃ ื“ื™ ืคึผืœืึทืฅ ืกื˜ืึทื ืฆื™ืข ื–ืขื ืขืŸ ืžื™ืกื˜ืึธืžืข ืฆื•ืคืจื™ื“ืŸ ื•ื•ืขื’ืŸ ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ื•ื•ื™ื™ึทืœ ื–ื™ื™ ืงืขื ืขืŸ ื‘ืขื˜ืŸ ื“ื™ ื•ื•ืึธืก ื–ื™ื™ ื“ืึทืจืคึฟืŸ. ื‘ืึทืžืขืจืงื•ื ื’ ืึทื– ื“ืขืจ ืงืึธื“ ื”ืื˜ ืžืขื˜ื”ืึธื“ืก ืึทื–ืึท ื•ื•ื™ ืจืขืคึผืึธืจื˜_ืกืึทืคึผืœื™ื™ื– ืื•ืŸ ืจืขืคึผืึธืจื˜_ืคื•ืขืœ ืงืึทื ื˜ื™ื™ื ื“ ืื™ืŸ ื“ื™ 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. ื–ื™ื™ ื–ืขื ืขืŸ ื‘ื™ื™ื“ืข ืงื™ื ื“ืขืจ ืคื•ืŸ ื“ื™ ืจืขืคึผืึธืจื˜ืขืจ ืงืœืึทืก. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, ืžื™ืจ ืฆื•ื’ืขื’ืขื‘ืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืฆื• ื“ื™ SpaceStation ืงืœืึทืก ืึทื–ื•ื™ ืึทื– ื“ื™ ื’ืขื‘ืขื˜ืŸ ืกื•ื‘ืงืœืึทืกืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ื ื™ื˜ื™ืึทืœื™ื™ื–ื“ ืื•ื™ื‘ ื ื™ื™ื˜ื™ืง. ืื™ืฆื˜, ืื•ื™ื‘ ื“ื™ ืขืจื“ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื˜ื•ื™ืฉืŸ ืขืคึผืขืก ืึทื ื“ืขืจืฉ, ืžื™ืจ ื•ื•ืขืœืŸ ืžืึทื›ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืกื•ื‘ืงืœืึทืกืก, ืื•ืŸ ื ื™ืฉื˜ ืฆื• ื“ื™ ื”ื•ื™ืคึผื˜ ืงืœืึทืก.

ืคื•ืŸ ืงื•ืจืก, ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ืื•ื ื“ื–ืขืจ ืงืœืืกืŸ ืึธืคืขื ื’ืขืŸ ื ืึธืš ืื•ื™ืฃ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ. ืื–ื•ื™, ื“ื™ SupplyReporter ื›ื™ื™ืคืขืฅ ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ SupplyHold, ืื•ืŸ FuelReporter ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ FuelTank. ืคื•ืŸ ืงื•ืจืก, ื“ื™ ื‘ื•ืกื˜ืขืจื– ืžื•ื–ืŸ ื–ื™ื™ืŸ ืคืืจื‘ื•ื ื“ืŸ ืฆื• ื“ื™ ื‘ืจืขื ื•ื•ืึทืจื’ ื˜ืึทื ืง. ืื‘ืขืจ ื“ืึธ ืึทืœืฅ ืื™ื– ืฉื•ื™ืŸ ืœืึทื“ื–ืฉื™ืงืึทืœ, ืื•ืŸ ืฆื• ืžืึทื›ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื“ืขืจ ื”ื•ื™ืคึผื˜ ืฉื•ื•ืขืจ - ืขื“ื™ื˜ื™ื ื’ ื“ื™ ืงืึธื“ ืคื•ืŸ ืื™ื™ืŸ ื›ื™ื™ืคืขืฅ ื•ื•ืขื˜ ื ื™ืฉื˜ ื•ื•ื™ืจืงืŸ ื“ื™ ืื ื“ืขืจืข.

ืื–ื•ื™, ืžื™ืจ ื”ืึธื‘ืŸ ื‘ืืฉืืคืŸ ืึท ืžืึทื“ื–ืฉืึทืœืขืจ ืงืึธื“ ื•ื•ื• ื“ื™ ืจื™ืกืคึผืึทื ืกืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื™ืขื“ืขืจ ืคื•ืŸ ื“ื™ ืึทื‘ื“ื–ืฉืขืงืฅ / ืงืœืืกืŸ ื–ืขื ืขืŸ ื’ืขื ื•ื™ ื“ื™ืคื™ื™ื ื“. ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืึทื–ืึท ืงืึธื“ ืื™ื– ื ื™ืฉื˜ ืึท ืคึผืจืึธื‘ืœืขื, ืžื™ื™ื ื˜ื™ื™ื ื™ื ื’ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ืคึผืฉื•ื˜ ืึทืจื‘ืขื˜. ืžื™ืจ ื”ืึธื‘ืŸ ืงืึธื ื•ื•ืขืจื˜ืขื“ ื“ื™ ื’ืื ืฆืข "ื’ืขื˜ืœืขืš ื›ื™ื™ืคืขืฅ" ืื™ืŸ SRP.

Skillbox ืจืขืงืึทืžืขื ื“ื–:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’