SOLID рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рдЪрд┐рд▓реЛ рдХреЛрдб рд▓реЗрдЦреНрджреИ

SOLID рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рдЪрд┐рд▓реЛ рдХреЛрдб рд▓реЗрдЦреНрджреИ

рдЕрдиреБрд╡рд╛рджрдХрдмрд╛рдЯ: рддрдкрд╛рдИрдВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реЗрднреЗрд░рд┐рди рдкреЗрд░реЗрдЬ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рдареЛрд╕ рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗред рд▓реЗрдЦрдмрд╛рдЯ рдЬрд╛рдирдХрд╛рд░реА рд╢реБрд░реБрд╡рд╛рдд рд░ рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд╣рд░реВ рджреБрд╡реИрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧреА рд╣реБрдиреЗрдЫред

рдпрджрд┐ рддрдкрд╛рдИрдВ рд╡рд┐рдХрд╛рд╕рдорд╛ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рд╛рдпрдГ SOLID рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВ рд╕реБрдиреНрдиреБ рднрдПрдХреЛ рдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓рд╛рдИ рд╕рдлрд╛, рд░рд╛рдореНрд░реЛ-рд╕рдВрд░рдЪрд┐рдд рд░ рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рдорд░реНрдордд рдпреЛрдЧреНрдп рдХреЛрдб рд▓реЗрдЦреНрди рд╕рдХреНрд╖рдо рдкрд╛рд░реНрдЫрдиреНред рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рддреНрдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рдо рдХрд╕рд░реА рд╕рд╣реА рд░реВрдкрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдзреЗрд░реИ рджреГрд╖реНрдЯрд┐рдХреЛрдгрд╣рд░реВ рдЫрдиреНред рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрд╣рд░реВрд╕рдБрдЧ "рд╕рд╣реА рдорд╛рд░реНрдЧ" рдХреЛ рдмрд╛рд░реЗрдорд╛ рдлрд░рдХ рд╡рд┐рдЪрд╛рд░ рд░ рдмреБрдЭрд╛рдЗ рд╣реБрдиреНрдЫ; рдпреЛ рд╕рдмреИ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдХреЛ рдЕрдиреБрднрд╡рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред рдпрджреНрдпрдкрд┐, SOLID рдорд╛ рдШреЛрд╖рдгрд╛ рдЧрд░рд┐рдПрдХрд╛ рд╡рд┐рдЪрд╛рд░рд╣рд░реВ IT рд╕рдореБрджрд╛рдпрдХрд╛ рд▓рдЧрднрдЧ рд╕рдмреИ рдкреНрд░рддрд┐рдирд┐рдзрд┐рд╣рд░реВрд▓реЗ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реЗрдХрд╛ рдЫрдиреНред рддрд┐рдиреАрд╣рд░реВ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рд╡рд┐рдХрд╛рд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЕрднреНрдпрд╛рд╕рд╣рд░реВрдХреЛ рдЙрджрдп рд░ рд╡рд┐рдХрд╛рд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд░реВрд╡рд╛рдд рдмрд┐рдиреНрджреБ рдмрдиреЗред

SOLID рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВ рдХреЗ рд╣реБрдиреН рд░ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдХрд╕рд░реА рдорджреНрджрдд рдЧрд░реНрдЫрдиреН рднрдиреА рдмреБрдЭреМрдВред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдкреНрд░реЛ".

рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

SOLID рднрдиреЗрдХреЛ рдХреЗ рд╣реЛ?

рдпреЛ рд╢рдмреНрдж рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реЛ, рд╢рдмреНрдж рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рджреНрдзрд╛рдиреНрдд рдХреЛ рдирд╛рдо рдХреЛ рд╢реБрд░реБрд╡рд╛рдд рд╣реЛ:

  • SрдПрдХреАрдХреГрдд рдЬрд┐рдореНрдореЗрд╡рд╛рд░реА рд╕рд┐рджреНрдзрд╛рдиреНрддред рдореЛрдбреНрдпреБрд▓рдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирдХреЛ рдПрдЙрдЯреИ рдХрд╛рд░рдг рд╣реБрди рд╕рдХреНрдЫред
  • рдпреЛ OрдХрд▓рдо / рдмрдиреНрдж рд╕рд┐рджреНрдзрд╛рдиреНрдд (рдЦреБрд▓рд╛/рдмрдиреНрдж рд╕рд┐рджреНрдзрд╛рдиреНрдд)ред рдХрдХреНрд╖рд╛рд╣рд░реВ рд░ рдЕрдиреНрдп рддрддреНрд╡рд╣рд░реВ рд╡рд┐рд╕реНрддрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рдЦреБрд▓рд╛ рд╣реБрдиреБрдкрд░реНрдЫ, рддрд░ рдкрд░рд┐рдорд╛рд░реНрдЬрдирдХреЛ рд▓рд╛рдЧрд┐ рдмрдиреНрджред
  • тАКрдпреЛ Liskov рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдиреНрдд (Liskov рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдиреНрдд)ред рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░рдХреЛ рдЙрдкрдкреНрд░рдХрд╛рд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреБрдкрд░реНрджрдЫ рдпреЛ рдЬрд╛рдиреНрдиред
  • рдпреЛ IрдЗрдиреНрдЯрд░рдлреЗрд╕ рд╡рд┐рднрд╛рдЬрди рд╕рд┐рджреНрдзрд╛рдиреНрддтАК (рдЗрдиреНрдЯрд░рдлреЗрд╕ рд╡рд┐рднрд╛рдЬрди рд╕рд┐рджреНрдзрд╛рдиреНрдд)ред рд╕рдлреНрдЯрд╡реЗрдпрд░ рд╕рдВрд╕реНрдерд╛рд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреЗ рд╡рд┐рдзрд┐рд╣рд░реВрдорд╛ рдирд┐рд░реНрднрд░ рд╣реБрдиреБ рд╣реБрдБрджреИрдиред
  • рдпреЛ Dрдирд┐рд░реНрднрд░рддрд╛ рдЙрд▓реНрдЯреЛ рд╕рд┐рджреНрдзрд╛рдиреНрдд (рдирд┐рд░реНрднрд░рддрд╛ рдЙрд▓реНрдЯреЛ рд╕рд┐рджреНрдзрд╛рдиреНрдд)ред рдЙрдЪреНрдЪ рд╕реНрддрд░рд╣рд░реВрдорд╛ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рддрд▓реНрд▓реЛ рддрд╣рд╣рд░реВрдорд╛ рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдорд╛ рдирд┐рд░реНрднрд░ рд╣реБрдиреБ рд╣реБрдБрджреИрдиред

рдПрдХрд▓ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕рд┐рджреНрдзрд╛рдиреНрдд

тАК
рдПрдХрд▓ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕рд┐рджреНрдзрд╛рдиреНрдд (SRP) рд▓реЗ рдмрддрд╛рдЙрдБрдЫ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рд╡рд╛ рдореЛрдбреНрдпреБрд▓ рддреНрдпреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдХреЛ рдПрдХ рднрд╛рдЧрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рд╣реБрдиреБрдкрд░реНрдЫред рдердк рд░реВрдкрдорд╛, рдпрд╕ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реАрдХрд╛ рддрддреНрд╡рд╣рд░реВ рдЕрд╕рдореНрдмрдиреНрдзрд┐рдд рд╡рд░реНрдЧрд╣рд░реВрдорд╛ рдЫрд░рдкрд╖реНрдЯ рд╣реБрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛ рдЖрдлреНрдиреИ рд╡рд░реНрдЧрд▓рд╛рдИ рддреЛрдХреНрдиреБрдкрд░реНрдЫред SRP рдХрд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд░ рдкреНрд░рдореБрдЦ рдкреНрд░рдЪрд╛рд░рдХ, рд░реЛрдмрд░реНрдЯ рдПрд╕. рдорд╛рд░реНрдЯрд┐рдирд▓реЗ рдЬрд╡рд╛рдлрджреЗрд╣рд┐рддрд╛рд▓рд╛рдИ рдкрд░рд┐рд╡рд░реНрддрдирдХреЛ рдХрд╛рд░рдг рдмрддрд╛рдЙрдБрдЫрдиреНред рдЙрдирд▓реЗ рдореВрд▓ рд░реВрдкрдорд╛ рдпреЛ рд╢рдмреНрджрд▓рд╛рдИ рдЖрдлреНрдиреЛ рдХрд╛рдо "рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рдбрд┐рдЬрд╛рдЗрдирдХрд╛ рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВ" рдХреЛ рдПрдХ рддрддреНрд╡рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реЗред рдЕрд╡рдзрд╛рд░рдгрд╛рд▓реЗ рдзреЗрд░реИ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдврд╛рдБрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдЬреБрди рдкрд╣рд┐рд▓реЗ рдЯрдо рдбреЗрдорд╛рд░реНрдХреЛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдпрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛рдорд╛ рдбреЗрднрд┐рдб рдкрд░реНрдирд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИрдПрдХреЛ рдзреЗрд░реИ рдЕрд╡рдзрд╛рд░рдгрд╛рд╣рд░реВ рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдерд┐рдПред рджреБрдИ рдореБрдЦреНрдп рдХреБрд░рд╛рд╣рд░реВ рдЗрдиреНрдХреНрдпрд╛рдкреНрд╕реБрд▓реЗрд╢рди рд░ рдЬрд╛рдирдХрд╛рд░реА рд▓реБрдХрд╛рдЙрдиреЗ рд╣реБрдиреНред рдкрд░реНрдирд╛рд╕рд▓реЗ рддрд░реНрдХ рдЧрд░реЗ рдХрд┐ рдкреНрд░рдгрд╛рд▓реАрд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдореЛрдбреНрдпреБрд▓рдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрдиреБ рдмреНрд▓рдХ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ рд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╡рд╛рд╣рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдорд╛ рдЖрдзрд╛рд░рд┐рдд рд╣реБрдиреБ рд╣реБрдБрджреИрдиред рдХреБрдиреИ рдкрдирд┐ рдореЛрдбреНрдпреБрд▓рд▓реЗ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓рд╛рдИ рдиреНрдпреВрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрдиреЗ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╛рдзрд╛рди рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБрдкрд░реНрдЫред

рд╡реИрд╕реЗ, рдорд╛рд░реНрдЯрд┐рдирд▓реЗ рдХрдореНрдкрдиреАрдХрд╛ рд╡рд░рд┐рд╖реНрда рдкреНрд░рдмрдиреНрдзрдХрд╣рд░реВ (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

рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╣рд╛рдореНрд░реЛ рдЕрдиреНрддрд░рд┐рдХреНрд╖ рд╕реНрдЯреЗрд╢рди рдмреЗрдХрд╛рд░ рдЫ (рдорд▓рд╛рдИ рд▓рд╛рдЧреНрджреИрди рдХрд┐ рдо NASA рдмрд╛рдЯ рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдХрд▓ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреБ), рддрд░ рдпрд╣рд╛рдБ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рдХреЗрд╣рд┐ рдЫред

рдпрд╕реИрд▓реЗ, SpaceStation рд╡рд░реНрдЧрд╕рдБрдЧ рдзреЗрд░реИ рдлрд░рдХ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реАрд╣рд░реВ (рд╡рд╛ рдХрд╛рд░реНрдпрд╣рд░реВ) рдЫрдиреНред рддреА рд╕рдмреИ рдкреНрд░рдХрд╛рд░ рдорд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

  • рд╕реЗрдиреНрд╕рд░рд╣рд░реВ;
  • рдЖрдкреВрд░реНрддрд┐ (рдЙрдкрднреЛрдЧреНрдп рд╡рд╕реНрддреБрд╣рд░реВ);
  • рдЗрдиреНрдзрди;
  • рдЧрддрд┐рд╡рд░реНрдзрдХрд╣рд░реВред

рд╕реНрдЯреЗрд╕рдирдХрд╛ рдХреБрдиреИ рдкрдирд┐ рдХрд░реНрдордЪрд╛рд░реАрд▓рд╛рдИ рдХрдХреНрд╖рд╛ рддреЛрдХрд┐рдПрдХреЛ рдЫреИрди, рд╣рд╛рдореА рд╕рдЬрд┐рд▓реИ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рдХрд╕рдХреЛ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реА рдХреЗ рдЫред рд╕рдореНрднрд╡рддрдГ, рд╡реИрдЬреНрдЮрд╛рдирд┐рдХрд▓реЗ рд╕реЗрдиреНрд╕рд░рд╣рд░реВ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрджрдЫ, рд░рд╕рдж рд╕реНрд░реЛрддрд╣рд░реВ рдЖрдкреВрд░реНрддрд┐ рдЧрд░реНрди рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ, рдЗрдиреНрдЬрд┐рдирд┐рдпрд░ рдЗрдиреНрдзрди рдЖрдкреВрд░реНрддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ, рд░ рдкрд╛рдпрд▓рдЯрд▓реЗ рдмреВрд╕реНрдЯрд░рд╣рд░реВ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрджрдЫред

рдХреЗ рд╣рд╛рдореА рдпреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо SRP рдЕрдиреБрд░реВрдк рдЫреИрди рднрдиреНрди рд╕рдХреНрдЫреМрдВ? рд╣реЛ, рдкрдХреНрдХрд╛ред рддрд░ SpaceStation рд╡рд░реНрдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ "рднрдЧрд╡рд╛рди рд╡рд╕реНрддреБ" рд╣реЛ рдЬрд╕рд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рдЬрд╛рдиреНрджрдЫрдиреН рд░ рд╕рдмреИ рдХреБрд░рд╛ рдЧрд░реНрдЫред рдпреЛ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рдорд╛ рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд░реЛрдзреА рдврд╛рдБрдЪрд╛ рд╣реЛред рдПрдХ рд╢реБрд░реБрд╡рд╛рддрдХреЛ рд▓рд╛рдЧрд┐, рддреНрдпрд╕реНрддрд╛ рд╡рд╕реНрддреБрд╣рд░реВ рдорд░реНрдордд рдЧрд░реНрди рдзреЗрд░реИ рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреНрдЫред рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдзреЗрд░реИ рд╕рд░рд▓ рдЫ, рд╣реЛ, рддрд░ рд╣рд╛рдореАрд▓реЗ рдирдпрд╛рдБ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдердкреНрдпреМрдВ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рд╕рд╛рдпрдж рд╣рд╛рдореНрд░реЛ рд╕реНрдкреЗрд╕ рд╕реНрдЯреЗрд╢рдирд▓рд╛рдИ рдореЗрдбрд┐рдХрд▓ рд╕реНрдЯреЗрд╢рди рд╡рд╛ рдмреИрдардХ рдХреЛрдард╛ рдЪрд╛рд╣рд┐рдиреНрдЫред рд░ рддреНрдпрд╣рд╛рдБ рдЬрддрд┐ рдзреЗрд░реИ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН, рдердк рд╕реНрдкреЗрд╕ рд╕реНрдЯреЗрд╢рди рдмрдвреНрдиреЗрдЫред рдЦреИрд░, рдпреЛ рд╕реБрд╡рд┐рдзрд╛ рдЕрд░реВрд╕рдБрдЧ рдЬреЛрдбрд┐рдиреЗ рднрдПрдХреЛрд▓реЗ, рд╕рдореНрдкреВрд░реНрдг рдХрдореНрдкреНрд▓реЗрдХреНрд╕рдХреЛ рд╕реЗрд╡рд╛ рджрд┐рди рдЕрдЭ рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреЗрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣рд╛рдореА, рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдЧрддрд┐рд╡рд░реНрдзрдХ рдХреЛ рд╕рдЮреНрдЪрд╛рд▓рди рдмрд╛рдзрдХ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдпрджрд┐ рдПрдХ рд╢реЛрдзрдХрд░реНрддрд╛рд▓реЗ рд╕реЗрдиреНрд╕рд░рд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЕрдиреБрд░реЛрдз рдЧрд░реНрджрдЫ рднрдиреЗ, рдпрд╕рд▓реЗ рд╕реНрдЯреЗрд╢рдирдХреЛ рд╕рдЮреНрдЪрд╛рд░ рдкреНрд░рдгрд╛рд▓реАрд▓рд╛рдИ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдЕрд╕рд░ рдЧрд░реНрди рд╕рдХреНрдЫред

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

рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЫрдиреН, рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдЕрдм рд░рд╛рдореНрд░реЛ рджреЗрдЦрд┐рдиреНрдЫред рдЕрдм рд╣рд╛рдореНрд░реЛ рд╕реНрдкреЗрд╕ рд╕реНрдЯреЗрд╢рди рдХреНрд▓рд╛рд╕ рдПрдХ рдХрдиреНрдЯреЗрдирд░ рднрдПрдХреЛ рдЫ рдЬрд╕рдорд╛ рд╕реЗрдиреНрд╕рд░рд╣рд░реВрдХреЛ рд╕реЗрдЯ, рдЙрдкрднреЛрдЧреНрдп рдЖрдкреВрд░реНрддрд┐ рдкреНрд░рдгрд╛рд▓реА, рдЗрдиреНрдзрди рдЯреНрдпрд╛рдЩреНрдХреА рд░ рдмреВрд╕реНрдЯрд░рд╣рд░реВ рд╕рд╣рд┐рдд рдирд┐рд░реНрднрд░ рднрд╛рдЧрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдЮреНрдЪрд╛рд▓рдирд╣рд░реВ рд╕реБрд░реБ рдЧрд░рд┐рдиреНрдЫред

рдХреБрдиреИ рдкрдирд┐ рдЪрд░рдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдм рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рдЫ: рд╕реЗрдиреНрд╕рд░; рдЖрдкреВрд░реНрддрд┐ рд╣реЛрд▓реНрдб; рдЗрдиреНрдзрди рдЯреНрдпрд╛рдЩреНрдХреА; рдереНрд░рд╕реНрдЯрд░рд╣рд░реВред

рдХреЛрдбрдХреЛ рдпрд╕ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЫрдиреНред рдмрд┐рдиреНрджреБ рдпреЛ рд╣реЛ рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЖрдлреНрдиреИ рдХрдХреНрд╖рд╛рд╣рд░реВрдорд╛ рдорд╛рддреНрд░ рд╕рдореЗрдЯрд┐рдПрдХрд╛ рдЫреИрдирдиреН, рддрд┐рдиреАрд╣рд░реВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЧрд░реНрди рдпреЛрдЧреНрдп рд░ рд╕реБрд╕рдВрдЧрдд рд╣реБрдиреЗ рддрд░рд┐рдХрд╛рдорд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЫрдиреНред рд╣рд╛рдореА рд╕рдорд╛рдирддрд╛рдХреЛ рд╕рд┐рджреНрдзрд╛рдиреНрддрд▓рд╛рдИ рдкрдЫреНрдпрд╛рдЙрди рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднрдПрдХрд╛ рддрддреНрд╡рд╣рд░реВрд▓рд╛рдИ рд╕рдореВрд╣рдмрджреНрдз рдЧрд░реНрдЫреМрдВред рдЕрдм, рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдХрд╛рдо рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд╣реНрдпрд╛рд╕ рд╕рдВрд░рдЪрдирд╛рдмрд╛рдЯ рдПрд░реЗрдорд╛ рд╕рд░реНрджреИ, рдХреЗрд╡рд▓ рд╕рдкреНрд▓рд╛рдЗрд╣реЛрд▓реНрдб рдХреНрд▓рд╛рд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН; рд╣рд╛рдореАрд▓реЗ рдЕрдиреНрдп рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдЫреБрдиреБ рдкрд░реНрджреИрдиред рдпрд╕рд░реА, рдпрджрд┐ рд░рд╕рдж рдЕрдзрд┐рдХрд╛рд░реАрд▓реЗ рдЖрдлреНрдиреЛ рдЦрдгреНрдбрдорд╛ рдХреЗрд╣рд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджрдЫ рднрдиреЗ, рдмрд╛рдБрдХреА рд╕реНрдЯреЗрд╢рди рдЕрдХреНрд╖реБрдгреНрдг рд░рд╣рдиреЗрдЫред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, SpaceStation рдХреНрд▓рд╛рд╕рд▓реЗ рдкрдирд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдмрд╛рд░реЗ рд╕рдЪреЗрдд рд╣реБрдиреЗрдЫреИрдиред

рдЕрдиреНрддрд░рд┐рдХреНрд╖ рд╕реНрдЯреЗрд╢рдирдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╣рд╛рдореНрд░рд╛ рдЕрдзрд┐рдХрд╛рд░реАрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдмрд╛рдЯ рдЦреБрд╕реА рдЫрдиреН рдХрд┐рдирднрдиреЗ рдЙрдиреАрд╣рд░реВрд▓реЗ рдЖрдлреВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдЕрдиреБрд░реЛрдз рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рдХреЛрдбрдорд╛ рд╡рд┐рдзрд┐рд╣рд░реВ рдЫрдиреН рдЬрд╕реНрддреИ рд░рд┐рдкреЛрд░реНрдЯ_рд╕рдкреНрд▓рд╛рдЗрд╣рд░реВ рд░ рд░рд┐рдкреЛрд░реНрдЯ_рдИрдиреНрдзрдирд╣рд░реВ рдЖрдкреВрд░реНрддрд┐рд╣реЛрд▓реНрдб рд░ рдлреНрдпреБрд▓рдЯреНрдпрд╛рдЩреНрдХ рдХрдХреНрд╖рд╛рд╣рд░реВрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреНред рдпрджрд┐ рдкреГрдереНрд╡реАрд▓реЗ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рднрдиреНрдпреЛ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ? рджреБрдмреИ рд╡рд░реНрдЧрд╣рд░реВ, рд╕рдкреНрд▓рд╛рдИрд╣реЛрд▓реНрдб рд░ рдлреНрдпреБрд▓рдЯреНрдпрд╛рдЩреНрдХ, рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЗрдиреНрдзрди рд░ рдЙрдкрднреЛрдЧреНрдп рд╡рд╕реНрддреБрд╣рд░реВ рдбреЗрд▓рд┐рднрд░реА рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ? рддрдкрд╛рдИрдВрд▓реЗ рд╕рд╛рдпрдж рд╕рдмреИ рдПрдЙрдЯреИ рдХрдХреНрд╖рд╛рд╣рд░реВ рдлреЗрд░рд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫред рд░ рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ 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 рдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдЙрдиреАрд╣рд░реБ рджреБрд╡реИ рд░рд┐рдкреЛрд░реНрдЯрд░ рдХрдХреНрд╖рд╛рдХрд╛ рд╕рдиреНрддрд╛рди рд╣реБрдиреН ред рдердк рд░реВрдкрдорд╛, рд╣рд╛рдореАрд▓реЗ рд╕реНрдкреЗрд╕рд╕реНрдЯреЗрд╢рди рдХреНрд▓рд╛рд╕рдорд╛ рдЙрджрд╛рд╣рд░рдг рдЪрд░рд╣рд░реВ рдердкреНрдпреМрдВ рддрд╛рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рднрдПрдорд╛ рд╡рд╛рдВрдЫрд┐рдд рдЙрдкрд╡рд░реНрдЧ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЕрдм, рдпрджрд┐ рдкреГрдереНрд╡реАрд▓реЗ рдЕрд░реВ рдХреЗрд╣рд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдЫ рднрдиреЗ, рд╣рд╛рдореА рдЙрдкрд╡рд░реНрдЧрд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗрдЫреМрдВ, рдореБрдЦреНрдп рд╡рд░реНрдЧрдорд╛ рд╣реЛрдЗрдиред

рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╣рд╛рдореНрд░рд╛ рдХреЗрд╣реА рд╡рд░реНрдЧрд╣рд░реВ рдЕрдЭреИ рдкрдирд┐ рдПрдХрдЕрд░реНрдХрд╛рдорд╛ рдирд┐рд░реНрднрд░ рдЫрдиреНред рдпрд╕рд░реА, SupplyReporter рд╡рд╕реНрддреБ SupplyHold рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫ, рд░ FuelReporter FuelTank рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдмреВрд╕реНрдЯрд░рд╣рд░реВ рдЗрдиреНрдзрди рдЯреНрдпрд╛рдЩреНрдХреАрдорд╛ рдЬреЛрдбрд┐рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рддрд░ рдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рддрд╛рд░реНрдХрд┐рдХ рджреЗрдЦрд┐рдиреНрдЫ, рд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреЗрдЫреИрди - рдПрдЙрдЯрд╛ рд╡рд╕реНрддреБрдХреЛ рдХреЛрдб рд╕рдореНрдкрд╛рджрди рдЧрд░реНрджрд╛ рдЕрд░реНрдХреЛрд▓рд╛рдИ рдзреЗрд░реИ рдЕрд╕рд░ рдЧрд░реНрджреИрдиред

рдпрд╕рд░реА, рд╣рд╛рдореАрд▓реЗ рдПрдХ рдореЛрдбреНрдпреБрд▓рд░ рдХреЛрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХрд╛ рдЫреМрдВ рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ/рд╡рд░реНрдЧрдХреЛ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реАрд╣рд░реВ рдареАрдХрд╕рдБрдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫред рдпрд╕реНрддреЛ рдХреЛрдбрдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрди рдХреБрдиреИ рд╕рдорд╕реНрдпрд╛ рдЫреИрди, рдпрд╕рд▓рд╛рдИ рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реБрдиреЗрдЫред рд╣рд╛рдореАрд▓реЗ рд╕рдореНрдкреВрд░реНрдг "рджреИрд╡реА рд╡рд╕реНрддреБ" рд▓рд╛рдИ SRP рдорд╛ рдкрд░рд┐рдгрдд рдЧрд░реЗрдХрд╛ рдЫреМрдВред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди