SOLID рд╡рд╛рдкрд░реВрди рд▓рд╡рдЪрд┐рдХ рдХреЛрдб рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ

SOLID рд╡рд╛рдкрд░реВрди рд▓рд╡рдЪрд┐рдХ рдХреЛрдб рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ

рдЕрдиреБрд╡рд╛рджрдХрд╛рдХрдбреВрди: рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реЗрд╡реЗрд░рд┐рди рдкреЗрд░реЗрдЭ рдпрд╛рдВрдЪрд╛ рд▓реЗрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдордзреНрдпреЗ рд╕реЙрд▓рд┐рдб рддрддреНрддреНрд╡реЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓. рд▓реЗрдЦрд╛рддреАрд▓ рдорд╛рд╣рд┐рддреА рдирд╡рд╢рд┐рдХреНрдпрд╛ рдЖрдгрд┐ рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреЛрдШрд╛рдВрдирд╛рд╣реА рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓.

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

рд╕реЙрд▓рд┐рдб рддрддреНрддреНрд╡реЗ рдХрд╛рдп рдЖрд╣реЗрдд рдЖрдгрд┐ рддреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╢реА рдорджрдд рдХрд░рддрд╛рдд рддреЗ рд╕рдордЬреВрди рдШреЗрдКрдпрд╛.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕ "рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛ".

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рд╕реЙрд▓рд┐рдб рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?

рд╣реА рд╕рдВрдЬреНрдЮрд╛ рдПрдХ рд╕рдВрдХреНрд╖реЗрдк рдЖрд╣реЗ, рдкрджрд╛рдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрддреНрддреНрд╡рд╛рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреА рд╕реБрд░реВрд╡рд╛рдд рдЖрд╣реЗ:

рдПрдХрд▓ рдЬрдмрд╛рдмрджрд╛рд░реА рддрддреНрддреНрд╡

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

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

рддрд╕реЗ, рдорд╛рд░реНрдЯрд┐рдирдиреЗ рдХрдВрдкрдиреАрдЪреНрдпрд╛ рд╡рд░рд┐рд╖реНрда рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдВрд╕рд╣ (рд╕реАрдУрдУ, рд╕реАрдЯреАрдУ, рд╕реАрдПрдлрдУ) рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рд▓реЗ, рдЬреНрдпрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХрдЬрдг рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╣реЗрддреВрдВрд╕рд╛рдареА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╕рд╛рдп рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рд╡рд╛рдкрд░рддреЛ. рдкрд░рд┐рдгрд╛рдореА, рддреНрдпрд╛рдкреИрдХреА рдХреЛрдгреАрд╣реА рдЗрддрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдВрдЪреНрдпрд╛ рд╣рд┐рддрд╕рдВрдмрдВрдзрд╛рдВрд╡рд░ рдкрд░рд┐рдгрд╛рдо рди рдХрд░рддрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдордзреАрд▓ рдмрджрд▓ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддреЛ.

рджреИрд╡реА рд╡рд╕реНрддреВ

рдиреЗрд╣рдореАрдкреНрд░рдорд╛рдгреЗ, 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 рд╢реА рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓рд╛ рдЬреБрд│рддреЛ.

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

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

рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╛рдареА рдЖрддрд╛ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдЖрд╣реЗ: рд╕реЗрдиреНрд╕рд░реНрд╕; рд╕рдкреНрд▓рд╛рдпрд╣реЛрд▓реНрдб; рдЗрдВрдзрдирд╛рдЪреА рдЯрд╛рдХреА; рдереНрд░рд╕реНрдЯрд░реНрд╕.

рдХреЛрдбрдЪреНрдпрд╛ рдпрд╛ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЕрдиреЗрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдмрджрд▓ рдЖрд╣реЗрдд. рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рд╡реИрдпрдХреНрддрд┐рдХ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЗрд╡рд│ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╡рд░реНрдЧрд╛рдВрдордзреНрдпреЗрдЪ рдЕрдВрддрд░реНрднреВрдд рдирд╕рддрд╛рдд, рддрд░ рддреЗ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдпреЛрдЬрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдХреА рддреЗ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рддрд╛ рдпреЗрддреАрд▓ рдЖрдгрд┐ рд╕реБрд╕рдВрдЧрдд рд╣реЛрддреАрд▓. рд╕реБрд╕рдВрдЧрддрддреЗрдЪреНрдпрд╛ рддрддреНрддреНрд╡рд╛рдЪреЗ рдкрд╛рд▓рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╕рд╣ рдШрдЯрдХрд╛рдВрдЪреЗ рдЧрдЯ рдХрд░рддреЛ. рдЖрддрд╛, рдЬрд░ рдЖрдореНрд╣рд╛рдВрд▓рд╛ рд╕рд┐рд╕реНрдЯреАрдордЪреНрдпрд╛ рдХрд╛рдорд╛рдЪреА рдкрджреНрдзрдд рдмрджрд▓рд╛рдпрдЪреА рдЕрд╕реЗрд▓, рд╣реЕрд╢ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдордзреВрди рдЕреЕрд░реЗрдордзреНрдпреЗ рдЬрд╛рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рд╕рдкреНрд▓рд╛рдпрд╣реЛрд▓реНрдб рдХреНрд▓рд╛рд╕ рд╡рд╛рдкрд░рд╛; рдЖрдореНрд╣рд╛рд▓рд╛ рдЗрддрд░ рдореЙрдбреНрдпреВрд▓рд▓рд╛ рд╕реНрдкрд░реНрд╢ рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЬрд░ рд▓реЙрдЬрд┐рд╕реНрдЯрд┐рдХ рдЕрдзрд┐рдХрд╛рд▒реНрдпрд╛рдиреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдд рдХрд╛рд╣реА рдмрджрд▓ рдХреЗрд▓реЗ рддрд░ рдЙрд░реНрд╡рд░рд┐рдд рд╕реНрдЯреЗрд╢рди рдЕрдмрд╛рдзрд┐рдд рд░рд╛рд╣реАрд▓. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╕реНрдкреЗрд╕рд╕реНрдЯреЗрд╢рди рд╡рд░реНрдЧрд╛рд▓рд╛ рджреЗрдЦреАрд▓ рдмрджрд▓рд╛рдВрдЪреА рдЬрд╛рдгреАрд╡ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.

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

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

рдЕрд░реНрдерд╛рдд, рдЖрдордЪреЗ рдХрд╛рд╣реА рд╡рд░реНрдЧ рдЕрдЬреВрдирд╣реА рдПрдХрдореЗрдХрд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗрдд. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд╕рдкреНрд▓рд╛рдпрд░рд┐рдкреЛрд░реНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдкреНрд▓рд╛рдпрд╣реЛрд▓реНрдбрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ рдЖрдгрд┐ рдлреНрдпреБрдПрд▓рд░рд┐рдкреЛрд░реНрдЯрд░ рдлреНрдпреБрдПрд▓рдЯрдБрдХрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ. рдЕрд░реНрдерд╛рдд, рдмреВрд╕реНрдЯрд░ рдЗрдВрдзрди рдЯрд╛рдХреАрд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкрд░рдВрддреБ рдпреЗрдереЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЖрдзреАрдЪ рддрд╛рд░реНрдХрд┐рдХ рджрд┐рд╕рддреЗ рдЖрдгрд┐ рдмрджрд▓ рдХрд░рдгреЗ рд╡рд┐рд╢реЗрд╖рддрдГ рдХрдареАрдг рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА - рдПрдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрдЪрд╛ рдХреЛрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдгреЗ рджреБрд╕рд░реНрдпрд╛рд╡рд░ рдлрд╛рд░рд╕рд╛ рдкрд░рд┐рдгрд╛рдо рдХрд░рдгрд╛рд░ рдирд╛рд╣реА.

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдореНрд╣реА рдПрдХ рдореЙрдбреНрдпреБрд▓рд░ рдХреЛрдб рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ рдЬрд┐рдереЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ/рдХреНрд▓рд╛рд╕рдЪреНрдпрд╛ рдЬрдмрд╛рдмрджрд╛рд▒реНрдпрд╛ рдЕрдЪреВрдХрдкрдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдЕрд╢рд╛ рдХреЛрдбрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рд╣реА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╛рд╣реА, рддреА рд░рд╛рдЦрдгреЗ рд╕реЛрдкреЗ рдХрд╛рдо рдЕрд╕реЗрд▓. рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг тАЬрджреИрд╡реА рд╡рд╕реНрддреВтАЭ рдЪреЗ SRP рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░ рдХреЗрд▓реЗ рдЖрд╣реЗ.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛