
ΠΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°: ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Π΄Π»Ρ Π²Π°Ρ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² SOLID Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΡΡΠ°ΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΊΠ°ΠΊ Π½ΠΎΠ²ΠΈΡΠΊΠ°ΠΌ, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°ΠΌ Ρ ΠΎΠΏΡΡΠΎΠΌ.
ΠΡΠ»ΠΈ Π²Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ, ΡΠΎ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΡΠ»ΡΡΠ°Π»ΠΈ ΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°Ρ SOLID. ΠΠ½ΠΈ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΠΈΡΡΡΠΉ, Ρ ΠΎΡΠΎΡΠΎ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΊΠΎΠ΄. Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ² ΠΊ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡ Π»ΠΈΠ±ΠΎ ΠΈΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ. Π£ ΡΠ°Π·Π½ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² β ΡΠ°Π·Π½ΡΠ΅ ΠΈΠ΄Π΅ΠΈ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Β«ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΈΒ», Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΠΏΡΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΈΠ΄Π΅ΠΈ, ΠΏΡΠΎΠ²ΠΎΠ·Π³Π»Π°ΡΠ΅Π½Π½ΡΠ΅ Π² SOLID, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΡΠΌΠΈ ΠΠ’-ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°. ΠΠ½ΠΈ ΡΡΠ°Π»ΠΈ ΠΎΡΠΏΡΠ°Π²Π½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ Π΄Π»Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Ρ ΠΎΡΠΎΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ SOLID ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ Π½Π°ΠΌ.
Skillbox ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΡΡΡ .
ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ: Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ Β«Π₯Π°Π±ΡΠ°Β» β ΡΠΊΠΈΠ΄ΠΊΠ° 10 000 ΡΡΠ±Π»Π΅ΠΉ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΊΡΡΡ Skillbox ΠΏΠΎ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄Ρ Β«Π₯Π°Π±ΡΒ».
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ SOLID?
ΠΡΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½ β Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ°, ΠΊΠ°ΠΆΠ΄Π°Ρ Π±ΡΠΊΠ²Π° ΡΠ΅ΡΠΌΠΈΠ½Π° β Π½Π°ΡΠ°Π»ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°:
- Single Responsibility Principle (ΠΏΡΠΈΠ½ΡΠΈΠΏ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ). ΠΠΎΠ΄ΡΠ»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΏΡΠΈΡΠΈΠ½Ρ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
- (ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΎΡΠΊΡΡΡΠΎΡΡΠΈ/Π·Π°ΠΊΡΡΡΠΎΡΡΠΈ). ΠΠ»Π°ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡΡΡΡ Π΄Π»Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
- (ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΠΈΡΠΊΠΎΠ²). Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π±Π°Π·ΠΎΠ²ΡΠΉ ΡΠΈΠΏ, Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΡΠΈΠΏΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Π½Π΅ Π·Π½Π°Ρ ΠΎΠ± ΡΡΠΎΠΌ.
- β (ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°). ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ.
- (ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ). ΠΠΎΠ΄ΡΠ»ΠΈ Π²Π΅ΡΡ Π½ΠΈΡ ΡΡΠΎΠ²Π½Π΅ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½ΠΈΡ ΡΡΠΎΠ²Π½Π΅ΠΉ.
ΠΡΠΈΠ½ΡΠΈΠΏ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ
β
ΠΡΠΈΠ½ΡΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ (SRP) Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π΅ΡΡΠΈ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π° ΠΎΠ΄Π½Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΠΊΡΠ΅ΠΏΠ»Π΅Π½Ρ Π·Π° ΡΠ²ΠΎΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ, Π° Π½Π΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΏΠΎ Π½Π΅ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠ°ΠΌ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈ Π³Π»Π°Π²Π½ΡΠΉ Π΅Π²Π°Π½Π³Π΅Π»ΠΈΡΡ SRP, Π ΠΎΠ±Π΅ΡΡ Π‘. ΠΠ°ΡΡΠΈΠ½, ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΠ½ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΡΡΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ Β«ΠΡΠΈΠ½ΡΠΈΠΏΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ». Π ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π²ΠΎΡΠ»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΈΠ· Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ ΡΠ²ΡΠ·Π½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠ°Π½Π΅Π΅ Π’ΠΎΠΌΠΎΠΌ ΠΠ΅ΠΌΠ°ΡΠΊΠΎ.
ΠΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π²ΠΎΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ½ΡΡΠΈΠΉ, ΡΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΡΠ²ΠΈΠ΄ΠΎΠΌ ΠΠ°ΡΠ½Π°ΡΠΎΠΌ. ΠΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½ΡΡ β ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ ΠΈ ΡΠΎΠΊΡΡΡΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΠ°ΡΠ½Π°Ρ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π», ΡΡΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Π°Π·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π΅ Π±Π»ΠΎΠΊ-ΡΡ Π΅ΠΌ Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠ±ΠΎΠΉ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ.
ΠΡΡΠ°ΡΠΈ, ΠΠ°ΡΡΠΈΠ½ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ» ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Ρ Π²ΡΡΡΠΈΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°ΠΌΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ (COO, CTO, CFO), ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π±ΠΈΠ·Π½Π΅ΡΠ° Ρ ΡΠ°Π·Π½ΠΎΠΉ ΡΠ΅Π»ΡΡ. Π ΠΈΡΠΎΠ³Π΅ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π²Π½Π΅Π΄ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΠ, Π½Π΅ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡ Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ².
ΠΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΠ·ΡΡΠΈΡΡ SRP β ΡΡΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π²ΡΠ΅ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΡΠ°ΡΡΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΠ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ. ΠΡΠΎ Ruby-ΠΊΠΎΠ΄, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ Π°ΡΡΠΈΠ±ΡΡΡ ΠΊΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ°Π½ΡΠΈΠΈ.
ΠΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
ΠΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ²ΠΎΠ·Π³Π»Π°ΡΠ΅Π½Ρ Π² ΠΊΠ»Π°ΡΡΠ΅ SpaceStation.
Π’Π΅Ρ
, ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ Π² ΡΠ°Π±ΠΎΡΠ΅ ΠΊΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ°Π½ΡΠΈΠΈ.
class SpaceStation
def initialize
@supplies = {}
@fuel = 0
end
def run_sensors
puts "----- Sensor Action -----"
puts "Running sensors!"
end
def load_supplies(type, quantity)
puts "----- Supply Action -----"
puts "Loading #{quantity} units of #{type} in the supply hold."
if @supplies[type]
@supplies[type] += quantity
else
@supplies[type] = quantity
end
end
def use_supplies(type, quantity)
puts "----- Supply Action -----"
if @supplies[type] != nil && @supplies[type] > quantity
puts "Using #{quantity} of #{type} from the supply hold."
@supplies[type] -= quantity
else
puts "Supply Error: Insufficient #{type} in the supply hold."
end
end
def report_supplies
puts "----- Supply Report -----"
if @supplies.keys.length > 0
@supplies.each do |type, quantity|
puts "#{type} avalilable: #{quantity} units"
end
else
puts "Supply hold is empty."
end
end
def load_fuel(quantity)
puts "----- Fuel Action -----"
puts "Loading #{quantity} units of fuel in the tank."
@fuel += quantity
end
def report_fuel
puts "----- Fuel Report -----"
puts "#{@fuel} units of fuel available."
end
def activate_thrusters
puts "----- Thruster Action -----"
if @fuel >= 10
puts "Thrusting action successful."
@fuel -= 10
else
puts "Thruster Error: Insufficient fuel available."
end
end
endΠ‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π½Π°ΡΠ° ΠΊΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΠ°Π½ΡΠΈΡ Π½Π΅ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π° (Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΡ Π·Π²ΠΎΠ½ΠΎΠΊ ΠΎΡ ΠΠΠ‘Π Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΌ ΠΎΠ±ΠΎΠ·ΡΠΈΠΌΠΎΠΌ Π±ΡΠ΄ΡΡΠ΅ΠΌ), Π½ΠΎ Π·Π΄Π΅ΡΡ Π΅ΡΡΡ ΡΡΠΎ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ°ΡΡ.
Π’Π°ΠΊ, Ρ ΠΊΠ»Π°ΡΡΠ° SpaceStation Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ (ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ). ΠΡΠ΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π±ΠΈΡΡ ΠΏΠΎ ΡΠΈΠΏΠ°ΠΌ:
- ΡΠ΅Π½ΡΠΎΡΡ;
- ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΠ΅ (ΡΠ°ΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ);
- Π³ΠΎΡΡΡΠ΅Π΅;
- ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π½ΠΈΠΊΡΠΎ ΠΈΠ· ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ² ΡΡΠ°Π½ΡΠΈΠΈ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² ΠΊΠ»Π°ΡΡΠ΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Ρ Π»Π΅Π³ΠΊΠΎΡΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, ΠΊΡΠΎ Π·Π° ΡΡΠΎ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ. Π‘ΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π½Π°ΡΡΠ½ΡΠΉ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ ΡΠ΅Π½ΡΠΎΡΡ, Π»ΠΎΠ³ΠΈΡΡ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° Π·Π°ΠΏΠ°ΡΡ ΡΠΎΠΏΠ»ΠΈΠ²Π°, Π° ΠΏΠΈΠ»ΠΎΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ.
ΠΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ SRP? ΠΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ. ΠΠΎ ΠΊΠ»Π°ΡΡ SpaceStation ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΈΡΠ½ΡΠΌ Β«Π±ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌΒ», ΠΊΠΎΡΠΎΡΡΠΉ Π·Π½Π°Π΅Ρ ΠΎΠ±ΠΎ Π²ΡΠ΅ΠΌ ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π²ΡΠ΅. ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π°Π½ΡΠΈΡΠ°Π±Π»ΠΎΠ½ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. ΠΠ»Ρ Π½ΠΎΠ²ΠΈΡΠΊΠ° ΡΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½Ρ Π² ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠΈ. ΠΠΎΠΊΠ° ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ, Π΄Π°, Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ°Π½ΡΠΈΠΈ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΌΠ΅Π΄ΠΏΡΠ½ΠΊΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π³ΠΎΠ²ΠΎΡΠ½Π°Ρ ΠΊΠΎΠΌΠ½Π°ΡΠ°. Π ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ΅ΠΌ ΡΠΈΠ»ΡΠ½Π΅Π΅ Π²ΡΡΠ°ΡΡΠ΅Ρ 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ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π»ΡΡΡΠ΅. Π‘Π΅ΠΉΡΠ°Ρ Π½Π°Ρ ΠΊΠ»Π°ΡΡ SpaceStation ΡΡΠ°Π», ΡΠΊΠΎΡΠ΅Π΅, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΠ½ΠΈΡΠΈΠΈΡΡΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠ°ΡΡΠ΅ΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ Π½Π°Π±ΠΎΡ ΡΠ΅Π½ΡΠΎΡΠΎΠ², ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΠΎΠ΄Π°ΡΠΈ ΡΠ°ΡΡ ΠΎΠ΄Π½ΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ², ΡΠΎΠΏΠ»ΠΈΠ²Π½ΡΠΉ Π±Π°ΠΊ, ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ.
ΠΠ»Ρ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΠΏΠ΅ΡΡ Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ: Sensors; SupplyHold; FuelTank; Thrusters.
Π ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΠΎΠ΄Π° Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°Π½Ρ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, ΠΎΠ½ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ. ΠΡ Π³ΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ ΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° ΡΠ²ΡΠ·Π½ΠΎΡΡΠΈ. Π’Π΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΏΠ΅ΡΠ΅ΠΉΠ΄Ρ Ρ Ρ ΡΡ-ΡΡΡΡΠΊΡΡΡΡ Π½Π° ΠΌΠ°ΡΡΠΈΠ², ΠΏΡΠΎΡΡΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΠΊΠ»Π°ΡΡΠΎΠΌ SupplyHold, Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΎΡΠΈΡΠ΅Ρ, ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΠΉ Π·Π° Π»ΠΎΠ³ΠΈΡΡΠΈΠΊΡ, ΡΡΠΎ-ΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠ΅ΠΊΡΠΈΠΈ, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΠ°Π½ΡΠΈΠΈ ΠΎΡΡΠ°Π½ΡΡΡΡ Π½Π΅ΡΡΠΎΠ½ΡΡΡΠΌΠΈ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡ SpaceStation Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π² ΠΊΡΡΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΠ°ΡΠΈ ΠΎΡΠΈΡΠ΅ΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Π½Π° ΠΊΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ°Π½ΡΠΈΠΈ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠ°Π΄Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠΎΠ³ΡΡ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² ΠΊΠΎΠ΄Π΅ Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠ°ΠΊ report_supplies ΠΈ report_fuel, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ΡΡ Π² ΠΊΠ»Π°ΡΡΠ°Ρ SupplyHold ΠΈ FuelTank. Π§ΡΠΎ ΡΠ»ΡΡΠΈΡΡΡ, Π΅ΡΠ»ΠΈ ΠΠ΅ΠΌΠ»Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΏΠΎΡΠΎΠ± ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΡΠ΅ΡΠΎΠ²? ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ±Π° ΠΊΠ»Π°ΡΡΠ°, SupplyHold ΠΈ FuelTank. Π ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠΎΠΏΠ»ΠΈΠ²Π° ΠΈ ΡΠ°ΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ²? ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ½ΠΎΠ²Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠ΅ ΡΠ΅ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΡ. Π ΡΡΠΎ ΡΠΆΠ΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ SRP-ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΠΌ.
class SpaceStation
attr_reader :sensors, :supply_hold, :supply_reporter,
:fuel_tank, :fuel_reporter, :thrusters
def initialize
@sensors = Sensors.new
@supply_hold = SupplyHold.new
@supply_reporter = SupplyReporter.new(@supply_hold)
@fuel_tank = FuelTank.new
@fuel_reporter = FuelReporter.new(@fuel_tank)
@thrusters = Thrusters.new(@fuel_tank)
end
end
class Sensors
def run_sensors
puts "----- Sensor Action -----"
puts "Running sensors!"
end
end
class SupplyHold
attr_accessor :supplies
attr_reader :reporter
def initialize
@supplies = {}
end
def get_supplies
@supplies
end
def load_supplies(type, quantity)
puts "----- Supply Action -----"
puts "Loading #{quantity} units of #{type} in the supply hold."
if @supplies[type]
@supplies[type] += quantity
else
@supplies[type] = quantity
end
end
def use_supplies(type, quantity)
puts "----- Supply Action -----"
if @supplies[type] != nil && @supplies[type] > quantity
puts "Using #{quantity} of #{type} from the supply hold."
@supplies[type] -= quantity
else
puts "Supply Error: Insufficient #{type} in the supply hold."
end
end
end
class FuelTank
attr_accessor :fuel
attr_reader :reporter
def initialize
@fuel = 0
end
def get_fuel_levels
@fuel
end
def load_fuel(quantity)
puts "----- Fuel Action -----"
puts "Loading #{quantity} units of fuel in the tank."
@fuel += quantity
end
def use_fuel(quantity)
puts "----- Fuel Action -----"
puts "Using #{quantity} units of fuel from the tank."
@fuel -= quantity
end
end
class Thrusters
FUEL_PER_THRUST = 10
def initialize(fuel_tank)
@linked_fuel_tank = fuel_tank
end
def activate_thrusters
puts "----- Thruster Action -----"
if @linked_fuel_tank.get_fuel_levels >= FUEL_PER_THRUST
puts "Thrusting action successful."
@linked_fuel_tank.use_fuel(FUEL_PER_THRUST)
else
puts "Thruster Error: Insufficient fuel available."
end
end
end
class Reporter
def initialize(item, type)
@linked_item = item
@type = type
end
def report
puts "----- #{@type.capitalize} Report -----"
end
end
class FuelReporter < Reporter
def initialize(item)
super(item, "fuel")
end
def report
super
puts "#{@linked_item.get_fuel_levels} units of fuel available."
end
end
class SupplyReporter < Reporter
def initialize(item)
super(item, "supply")
end
def report
super
if @linked_item.get_supplies.keys.length > 0
@linked_item.get_supplies.each do |type, quantity|
puts "#{type} avalilable: #{quantity} units"
end
else
puts "Supply hold is empty."
end
end
end
iss = SpaceStation.new
iss.sensors.run_sensors
# ----- Sensor Action -----
# Running sensors!
iss.supply_hold.use_supplies("parts", 2)
# ----- Supply Action -----
# Supply Error: Insufficient parts in the supply hold.
iss.supply_hold.load_supplies("parts", 10)
# ----- Supply Action -----
# Loading 10 units of parts in the supply hold.
iss.supply_hold.use_supplies("parts", 2)
# ----- Supply Action -----
# Using 2 of parts from the supply hold.
iss.supply_reporter.report
# ----- Supply Report -----
# parts avalilable: 8 units
iss.thrusters.activate_thrusters
# ----- Thruster Action -----
# Thruster Error: Insufficient fuel available.
iss.fuel_tank.load_fuel(100)
# ----- Fuel Action -----
# Loading 100 units of fuel in the tank.
iss.thrusters.activate_thrusters
# ----- Thruster Action -----
# Thrusting action successful.
# ----- Fuel Action -----
# Using 10 units of fuel from the tank.
iss.fuel_reporter.report
# ----- Fuel Report -----
# 90 units of fuel available.Π ΡΡΠΎΠΉ, ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ Π±ΡΠ»ΠΈ ΡΠ°Π·Π±ΠΈΡΡ Π½Π° Π΄Π²Π° Π½ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠ°, FuelReporter ΠΈ SupplyReporter. ΠΠ½ΠΈ ΠΎΠ±Π° ΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΊΠ»Π°ΡΡΡ Reporter. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊ ΠΊΠ»Π°ΡΡΡ SpaceStation Ρ ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ. Π’Π΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ ΠΠ΅ΠΌΠ»Ρ ΡΠ΅ΡΠΈΡ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ, ΡΠΎ ΠΌΡ Π²Π½Π΅ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΊΠΈ Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΡ, Π° Π½Π΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠ»Π°ΡΡ.
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠ»Π°ΡΡΡ Ρ Π½Π°Ρ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π·Π°Π²ΠΈΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°. Π’Π°ΠΊ, ΠΎΠ±ΡΠ΅ΠΊΡ SupplyReporter Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ SupplyHold, Π° FuelReporter Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ FuelTank. Π‘Π°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ, ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠΎΠΏΠ»ΠΈΠ²Π½ΡΠΌ Π±Π°ΠΊΠΎΠΌ. ΠΠΎ Π·Π΄Π΅ΡΡ ΡΠΆΠ΅ Π²ΡΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ, Π° Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌ β ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄, Π³Π΄Π΅ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²/ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΎΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ. Π Π°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ β Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π΅Π³ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΠ΅ΡΡ Β«Π±ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΒ» ΠΌΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π»ΠΈ Π² SRP.
Skillbox ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ:
- ΠΠ²ΡΡ Π»Π΅ΡΠ½ΠΈΠΉ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΡΡΡ .
- ΠΠ½Π»Π°ΠΉΠ½-ΠΊΡΡΡ .
- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π³ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΠΊΡΡΡ .
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com
