เช
เชจเซเชตเชพเชฆเช เชคเชฐเชซเชฅเซ: เชคเชฎเชพเชฐเชพ เชฎเชพเชเซ เชชเซเชฐเชเชพเชถเชฟเชค
เชเซ เชคเชฎเซ เชตเชฟเชเชพเชธเชฎเชพเช เชเซ, เชคเซ เชคเชฎเซ เชฎเซเชเชพ เชญเชพเชเซ SOLID เชธเชฟเชฆเซเชงเชพเชเชคเซ เชตเชฟเชถเซ เชธเชพเชเชญเชณเซเชฏเซเช เชนเชถเซ. เชคเซเช เชชเซเชฐเซเชเซเชฐเชพเชฎเชฐเชจเซ เชธเซเชตเชเซเช, เชธเชพเชฐเซ เชฐเซเชคเซ เชธเชเชฐเชเชฟเชค เช เชจเซ เชธเชฐเชณเชคเชพเชฅเซ เชเชพเชณเชตเซ เชถเชเชพเชฏ เชคเซเชตเชพ เชเซเชก เชฒเชเชตเชพเชฎเชพเช เชธเชเซเชทเชฎ เชเชฐเซ เชเซ. เชคเซ เชจเซเชเชงเชตเซเช เชฏเซเชเซเชฏ เชเซ เชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเชเชฎเชพเช เชเซเช เชเซเชเซเชเชธ เชเชพเชฐเซเชฏเชจเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเซเชตเซ เชฐเซเชคเซ เชเชฐเชตเซเช เชคเซ เชฎเชพเชเซ เชเชฃเชพ เช เชญเชฟเชเชฎเซ เชเซ. เชเซเชฆเชพ เชเซเชฆเชพ เชจเชฟเชทเซเชฃเชพเชคเซเชจเชพ "เชธเชพเชเชพ เชฎเชพเชฐเซเช" เชตเชฟเชถเซเชจเชพ เชเซเชฆเชพ เชเซเชฆเชพ เชตเชฟเชเชพเชฐเซ เช เชจเซ เชธเชฎเช เชนเซเชฏ โโเชเซ; เชคเซ เชฌเชงเซเช เชฆเชฐเซเช เชตเซเชฏเชเซเชคเชฟเชจเชพ เช เชจเซเชญเชต เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเซ. เชเซ เชเซ, SOLID เชฎเชพเช เชเชพเชนเซเชฐ เชเชฐเชพเชฏเซเชฒเชพ เชตเชฟเชเชพเชฐเซ IT เชธเชฎเซเชฆเชพเชฏเชจเชพ เชฒเชเชญเช เชคเชฎเชพเชฎ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเช เชฆเซเชตเชพเชฐเชพ เชธเซเชตเซเชเชพเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซเช เชเชฃเซ เชธเชพเชฐเซ เชตเชฟเชเชพเชธ เชตเซเชฏเชตเชธเซเชฅเชพเชชเชจ เชชเชฆเซเชงเชคเชฟเชเชจเชพ เชเชฆเชญเชต เช เชจเซ เชตเชฟเชเชพเชธ เชฎเชพเชเซ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชฌเชฟเชเชฆเซ เชฌเชจเซเชฏเชพ.
เชเชพเชฒเซ เชธเชฎเชเซเช เชเซ เชธเซเชฒเชฟเชก เชธเชฟเชฆเซเชงเชพเชเชคเซ เชถเซเช เชเซ เช
เชจเซ เชคเซ เชเชชเชฃเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชฎเชฆเชฆ เชเชฐเซ เชเซ.
เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ: เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"เชฎเซเชฌเชพเชเชฒ เชกเซเชตเชฒเชชเชฐ เชชเซเชฐเซ" .เช เชฎเซ เชฏเชพเชฆ เชเชฐเชพเชตเซเช เชเซเช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชเชเซ เชฎเชพเชเซ - Habr เชชเซเชฐเซเชฎเซ เชเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชเชชเชฃ เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชเซเชฐเซเชธเชฎเชพเช เชจเซเชเชงเชฃเซ เชเชฐเชคเซ เชตเชเชคเซ 10 เชฐเซเชฌเชฒ เชกเชฟเชธเซเชเชพเชเชจเซเช.
เชธเซเชฒเชฟเชก เชถเซเช เชเซ?
เช เชถเชฌเซเชฆ เชธเชเชเซเชทเซเชช เชเซ, เชถเชฌเซเชฆเชจเซ เชฆเชฐเซเช เช เชเซเชทเชฐ เชเซเชเซเชเชธ เชธเชฟเชฆเซเชงเชพเชเชคเชจเชพ เชจเชพเชฎเชจเซ เชถเชฐเซเชเชค เชเซ:
- Sเชเชเชฒ เชเชตเชพเชฌเชฆเชพเชฐเซ เชธเชฟเชฆเซเชงเชพเชเชค. เชฎเซเชกเซเชฏเซเชฒเชฎเชพเช เชซเซเชฐเชซเชพเชฐเชจเซเช เชเช เช เชจเซ เชฎเชพเชคเซเชฐ เชเช เช เชเชพเชฐเชฃ เชนเซเช เชถเชเซ เชเซ.
เช Oเชชเซเชจ/เชฌเชเชง เชธเชฟเชฆเซเชงเชพเชเชค (เชเซเชฒเซเชฒเซ/เชฌเชเชง เชธเชฟเชฆเซเชงเชพเชเชค). เชตเชฐเซเชเซ เช เชจเซ เช เชจเซเชฏ เชเชเชเซ เชเชเซเชธเซเชเซเชเชถเชจ เชฎเชพเชเซ เชเซเชฒเซเชฒเชพ เชนเซเชตเชพ เชเซเชเช, เชชเชฐเชเชคเซ เชซเซเชฐเชซเชพเชฐ เชฎเชพเชเซ เชฌเชเชง เชนเซเชตเชพ เชเซเชเช.โเช Lเชเชธเซเชเซเชต เช เชตเซเชเซ เชธเชฟเชฆเซเชงเชพเชเชค (เชฒเชฟเชธเซเชเซเชต เช เชตเซเชเซ เชธเชฟเชฆเซเชงเชพเชเชค). เชซเชเชเซเชถเชจ เชเซ เชเซ เชฌเซเช เชเชพเชเชชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชคเซ เชเชพเชฃเซเชฏเชพ เชตเชเชฐ เชฌเซเช เชเชพเชเชชเชจเชพ เชชเซเชเชพเชชเซเชฐเชเชพเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชธเชเซเชทเชฎ เชนเซเชตเชพ เชเซเชเช.เช Iเชเชจเซเชเชฐเชซเซเชธ เชธเซเชเซเชฐเชฟเชเซเชถเชจ เชธเชฟเชฆเซเชงเชพเชเชค โ (เชเชจเซเชเชฐเชซเซเชธ เชตเชฟเชญเชพเชเชจ เชธเชฟเชฆเซเชงเชพเชเชค). เชธเซเชซเซเชเชตเซเชฐ เชธเชเชธเซเชฅเชพเชเช เชคเซ เชชเชฆเซเชงเชคเชฟเช เชชเชฐ เชเชงเชพเชฐ เชฐเชพเชเชตเซ เชเซเชเช เชจเชนเซเช เชเซเชจเซ เชคเซเช เชเชชเชฏเซเช เชเชฐเชคเชพ เชจเชฅเซ.เช Dเช เชตเชฒเชเชฌเชจ เชตเซเชฏเซเชคเซเชเซเชฐเชฎ เชธเชฟเชฆเซเชงเชพเชเชค (เชจเชฟเชฐเซเชญเชฐเชคเชพ เชตเซเชฏเซเชคเซเชเซเชฐเชฎเชจเซ เชธเชฟเชฆเซเชงเชพเชเชค). เชเชเซเช เชธเซเชคเชฐ เชชเชฐเชจเชพ เชฎเซเชกเซเชฏเซเชฒเซ เชจเซเชเชฒเชพ เชธเซเชคเชฐเชจเชพ เชฎเซเชกเซเชฏเซเชฒเซ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชจ เชนเซเชตเชพ เชเซเชเช.
เชเช เชเชตเชพเชฌเชฆเชพเชฐเซ เชธเชฟเชฆเซเชงเชพเชเชค
โ
เชธเชฟเชเชเชฒ เชฐเชฟเชธเซเชชเซเชจเซเชธเชฟเชฌเชฟเชฒเชฟเชเซ เชชเซเชฐเชฟเชจเซเชธเชฟเชชเชฒ (SRP) เชเชฃเชพเชตเซ เชเซ เชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเช เชฆเชฐเซเช เชตเชฐเซเช เช
เชฅเชตเชพ เชฎเซเชกเซเชฏเซเชฒ เชคเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเชพ เชฎเชพเชคเซเชฐ เชเช เชญเชพเช เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ เชนเซเชตเชพ เชเซเชเช. เชตเชงเซเชฎเชพเช, เช เชเชตเชพเชฌเชฆเชพเชฐเซเชจเชพ เชเชเชเซ เช
เชธเชเชฌเชเชงเชฟเชค เชตเชฐเซเชเซเชฎเชพเช เชตเชฟเชเซเชฐเชพเช เชเชตเชพเชจเซ เชฌเชฆเชฒเซ เชคเซเชฎเชจเชพ เชชเซเชคเชพเชจเชพ เชตเชฐเซเชเชจเซ เชธเซเชเชชเชตเชพ เชเซเชเช. SRP เชจเชพ เชกเซเชตเชฒเชชเชฐ เช
เชจเซ เชฎเซเชเซเชฏ เชชเซเชฐเชเชพเชฐเช, เชฐเซเชฌเชฐเซเช เชเชธ. เชฎเชพเชฐเซเชเชฟเชจ, เชฌเชฆเชฒเชพเชตเชจเชพ เชเชพเชฐเชฃ เชคเชฐเซเชเซ เชเชตเชพเชฌเชฆเชพเชฐเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ. เชคเซเชฎเชฃเซ เชฎเซเชณเชฐเซเชชเซ เช เชถเชฌเซเชฆเชจเซ เชคเซเชฎเชจเชพ เชเชพเชฐเซเชฏ "เชเชฌเซเชเซเชเซเช-เชเชฐเชฟเชเชจเซเชเซเชก เชกเชฟเชเชพเชเชจเชจเชพ เชธเชฟเชฆเซเชงเชพเชเชคเซ" เชจเชพ เชเชเชเซเชฎเชพเชเชจเชพ เชเช เชคเชฐเซเชเซ เชชเซเชฐเชธเซเชคเชพเชตเชฟเชค เชเชฐเซเชฏเซ เชนเชคเซ. เชเซเชจเซเชธเซเชชเซเชเชฎเชพเช เชเชจเซเชเซเชเชฟเชตเชฟเชเซ เชชเซเชเชฐเซเชจเชจเซ เชฎเซเชเชพเชญเชพเชเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ เชเซ เช
เชเชพเช เชเซเชฎ เชกเซเชฎเชพเชฐเซเชเซ เชฆเซเชตเชพเชฐเชพ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ.
เช เชตเชฟเชญเชพเชตเชจเชพเชฎเชพเช เชกเซเชตเชฟเชก เชชเชฐเซเชจเชพเชธ เชฆเซเชตเชพเชฐเชพ เชเชกเชตเชพเชฎเชพเช เชเชตเซเชฒเชพ เชเชฃเชพ เชเซเชฏเชพเชฒเซเชจเซ เชชเชฃ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ. เชฌเซ เชฎเซเชเซเชฏ เชเซ เชเชจเซเชเซเชชเซเชธเซเชฏเซเชฒเซเชถเชจ เช เชจเซ เชฎเชพเชนเชฟเชคเซ เชเซเชชเชพเชตเชตเซ. เชชเชฐเชจเชพเชธเซ เชฆเชฒเซเชฒ เชเชฐเซ เชนเชคเซ เชเซ เชธเชฟเชธเซเชเชฎเชจเซ เช เชฒเช เชฎเซเชกเซเชฏเซเชฒเชฎเชพเช เชตเชฟเชญเชพเชเซเชค เชเชฐเชตเซ เช เชฌเซเชฒเซเช เชกเชพเชฏเชพเชเซเชฐเชพเชฎ เช เชฅเชตเชพ เชเชเซเชเซเชเซเชฏเซเชถเชจ เชซเซเชฒเซเชจเชพ เชตเชฟเชถเซเชฒเซเชทเชฃ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชนเซเชตเซเช เชเซเชเช เชจเชนเซเช. เชเซเชเชชเชฃ เชฎเซเชกเซเชฏเซเชฒเชฎเชพเช เชเซเชเซเชเชธ เชธเซเชฒเซเชฏเซเชถเชจ เชนเซเชตเซเช เชเชตเชถเซเชฏเช เชเซ เชเซ เชเซเชฐเชพเชนเชเซเชจเซ เชจเซเชฏเซเชจเชคเชฎ เชฎเชพเชนเชฟเชคเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ.
เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เชฎเชพเชฐเซเชเชฟเชจเซ เชเชเชชเชจเซเชจเชพ เชตเชฐเชฟเชทเซเช เชธเชเชเชพเชฒเชเซ (COO, CTO, CFO) เชธเชพเชฅเซ เชเช เชฐเชธเชชเซเชฐเชฆ เชเชฆเชพเชนเชฐเชฃ เชเชชเซเชฏเซเช, เชเซเชฎเชพเชเชฅเซ เชฆเชฐเซเช เช เชฒเช-เช เชฒเช เชนเซเชคเซเช เชฎเชพเชเซ เชเซเชเซเชเชธ เชฌเชฟเชเชจเซเชธ เชธเซเชซเซเชเชตเซเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชชเชฐเชฟเชฃเชพเชฎเซ, เชคเซเชฎเชพเชเชฅเซ เชเซเชเชชเชฃ เช เชจเซเชฏ เชฎเซเชจเซเชเชฐเซเชจเชพ เชนเชฟเชคเซเชจเซ เช เชธเชฐ เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ เชธเซเชซเซเชเชตเซเชฐเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซเชจเซ เช เชฎเชฒ เชเชฐเซ เชถเชเซ เชเซ.
เชฆเซเชตเซ เชชเชฆเชพเชฐเซเชฅ
เชนเชเชฎเซเชถเชจเซ เชเซเชฎ, SRP เชถเซเชเชตเชพเชจเซ เชถเซเชฐเซเชทเซเช เชฐเซเชค เชคเซเชจเซ เชเซเชฐเชฟเชฏเชพเชฎเชพเช เชเซเชตเชพเชจเซเช เชเซ. เชเชพเชฒเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเชพ เชเช เชตเชฟเชญเชพเชเชจเซ เชเซเชเช เชเซ เชธเชฟเชเชเชฒ เชฐเชฟเชธเซเชชเซเชจเซเชธเชฟเชฌเชฟเชฒเชฟเชเซ เชธเชฟเชฆเซเชงเชพเชเชคเชจเซเช เชชเชพเชฒเชจ เชเชฐเชคเซเช เชจเชฅเซ. เช เชฐเซเชฌเซ เชเซเชก เชเซ เชเซ เชธเซเชชเซเชธ เชธเซเชเซเชถเชจเชจเชพ เชตเชฐเซเชคเชจ เช เชจเซ เชฒเชเซเชทเชฃเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ.
เชเชฆเชพเชนเชฐเชฃเชจเซ เชธเชฎเซเชเซเชทเชพ เชเชฐเซ เช
เชจเซ เชจเซเชเซเชจเชพเชจเซ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ:
เชคเซ เชเชฌเซเชเซเชเซเชเซเชธเชจเซ เชเชตเชพเชฌเชฆเชพเชฐเซเช เชเซ เชธเซเชชเซเชธเชธเซเชเซเชถเชจ เชตเชฐเซเชเชฎเชพเช เชเชพเชนเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชเซเช เชธเซเชชเซเชธ เชธเซเชเซเชถเชจเชจเชพ เชธเชเชเชพเชฒเชจเชฎเชพเช เชฐเชธ เชงเชฐเชพเชตเซ เชถเชเซ เชเซ.
class SpaceStation
def initialize
@supplies = {}
@fuel = 0
end
def run_sensors
puts "----- Sensor Action -----"
puts "Running sensors!"
end
def load_supplies(type, quantity)
puts "----- Supply Action -----"
puts "Loading #{quantity} units of #{type} in the supply hold."
if @supplies[type]
@supplies[type] += quantity
else
@supplies[type] = quantity
end
end
def use_supplies(type, quantity)
puts "----- Supply Action -----"
if @supplies[type] != nil && @supplies[type] > quantity
puts "Using #{quantity} of #{type} from the supply hold."
@supplies[type] -= quantity
else
puts "Supply Error: Insufficient #{type} in the supply hold."
end
end
def report_supplies
puts "----- Supply Report -----"
if @supplies.keys.length > 0
@supplies.each do |type, quantity|
puts "#{type} avalilable: #{quantity} units"
end
else
puts "Supply hold is empty."
end
end
def load_fuel(quantity)
puts "----- Fuel Action -----"
puts "Loading #{quantity} units of fuel in the tank."
@fuel += quantity
end
def report_fuel
puts "----- Fuel Report -----"
puts "#{@fuel} units of fuel available."
end
def activate_thrusters
puts "----- Thruster Action -----"
if @fuel >= 10
puts "Thrusting action successful."
@fuel -= 10
else
puts "Thruster Error: Insufficient fuel available."
end
end
end
เชตเชพเชธเซเชคเชตเชฎเชพเช, เช เชฎเชพเชฐเซเช เชธเซเชชเซเชธ เชธเซเชเซเชถเชจ เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชเซ (เชฎเชจเซ เชจเชฅเซ เชฒเชพเชเชคเซเช เชเซ เชฎเชจเซ เชจเชพเชธเชพ เชคเชฐเชซเชฅเซ เชเซเชเช เชธเชฎเชฏเชฎเชพเช เชเซเช เชเซเชฒ เชเชตเชถเซ), เชชเชฐเชเชคเซ เช เชนเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชเชเช เชเซ.
เชเชฎ, เชธเซเชชเซเชธเชธเซเชเซเชถเชจ เชตเชฐเซเชเชฎเชพเช เชเชฃเซ เชเซเชฆเซ เชเซเชฆเซ เชเชตเชพเชฌเชฆเชพเชฐเซเช (เช เชฅเชตเชพ เชเชพเชฐเซเชฏเซ) เชเซ. เชคเซ เชฌเชงเชพเชจเซ เชชเซเชฐเชเชพเชฐเซเชฎเชพเช เชตเชนเซเชเชเซ เชถเชเชพเชฏ เชเซ:
- เชธเซเชจเซเชธเชฐ;
- เชชเซเชฐเชตเช เซ (เชเชชเชญเซเชเซเชฏ เชตเชธเซเชคเซเช);
- เชฌเชณเชคเชฃ
- เชชเซเชฐเชตเซเชเช
เชธเซเชเซเชถเชจเชจเชพ เชเซเชเชชเชฃ เชเชฐเซเชฎเชเชพเชฐเซเชจเซ เชตเชฐเซเช เชธเซเชเชชเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชจ เชนเซเชตเชพ เชเชคเชพเช, เชเชชเชฃเซ เชธเชฐเชณเชคเชพเชฅเซ เชเชฒเซเชชเชจเชพ เชเชฐเซ เชถเชเซเช เชเซเช เชเซ เชเซเชฃ เชถเซเช เชเชตเชพเชฌเชฆเชพเชฐ เชเซ. เชธเชเชญเชตเชคเช, เชตเซเชเซเชเชพเชจเชฟเช เชธเซเชจเซเชธเชฐเซเชธเชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ, เชธเชเชธเชพเชงเชจเซ เชชเซเชฐเชพ เชชเชพเชกเชตเชพ เชฎเชพเชเซ เชฒเซเชเชฟเชธเซเชเชฟเชฏเชจ เชเชตเชพเชฌเชฆเชพเชฐ เชเซ, เชเชจเซเชเชฟเชจเชฟเชฏเชฐ เชเชเชงเชฃ เชชเซเชฐเชตเช เชพ เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ เชเซ, เช เชจเซ เชชเชพเชเชฒเช เชฌเซเชธเซเชเชฐเชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ.
เชถเซเช เชเชชเชฃเซ เชเชนเซ เชถเชเซเช เชเซ เช เชเชพเชฐเซเชฏเชเซเชฐเชฎ 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
เชคเซเชฏเชพเช เชเชฃเชพ เชฌเชงเชพ เชซเซเชฐเชซเชพเชฐเซ เชเซ, เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเซเชเซเชเชธเชชเชฃเซ เชนเชตเซ เชตเชงเซ เชธเชพเชฐเซเช เชฒเชพเชเซ เชเซ. เชนเชตเซ เช เชฎเชพเชฐเซ เชธเซเชชเซเชธเชธเซเชเซเชถเชจ เชตเชฐเซเช เชตเชงเซ เชเช เชเชจเซเชเซเชจเชฐ เชฌเชจเซ เชเชฏเซ เชเซ เชเซเชฎเชพเช เชธเซเชจเซเชธเชฐเชจเซ เชธเชฎเซเชน, เชเชชเชญเซเชเซเชฏ เชธเชชเซเชฒเชพเชฏ เชธเชฟเชธเซเชเชฎ, เชเชเชงเชฃ เชเชพเชเชเซ เช เชจเซ เชฌเซเชธเซเชเชฐ เชธเชนเชฟเชค เชเชถเซเชฐเชฟเชค เชญเชพเชเซ เชฎเชพเชเซ เชเชพเชฎเชเซเชฐเซ เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชเซเชเชชเชฃ เชเชฒเซ เชฎเชพเชเซ เชนเชตเซ เช เชจเซเชฐเซเชช เชตเชฐเซเช เชเซ: เชธเซเชจเซเชธเชฐเซเชธ; เชธเชชเซเชฒเชพเชฏ เชนเซเชฒเซเชก; เชซเซเชฏเซเช เชฒ เชเซเชจเซเช; เชฅเซเชฐเชธเซเชเชฐเซเชธ.
เชเซเชกเชจเชพ เช เชธเชเชธเซเชเชฐเชฃเชฎเชพเช เชเชฃเชพ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชซเซเชฐเชซเชพเชฐเซ เชเซ. เชฎเซเชฆเซเชฆเซ เช เชเซ เชเซ เชตเซเชฏเชเซเชคเชฟเชเชค เชเชพเชฐเซเชฏเซ เชซเชเซเชค เชคเซเชฎเชจเชพ เชชเซเชคเชพเชจเชพ เชตเชฐเซเชเซเชฎเชพเช เช เชธเชฎเชพเชตเชฟเชทเซเช เชจเชฅเซ, เชคเซ เชเชตเซ เชฐเซเชคเซ เชเซเช เชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เชคเซ เช เชจเซเชฎเชพเชจเชฟเชค เช เชจเซ เชธเซเชธเชเชเชค เชฌเชจเซ. เชธเซเชธเชเชเชคเชคเชพเชจเชพ เชธเชฟเชฆเซเชงเชพเชเชคเชจเซ เช เชจเซเชธเชฐเชตเชพ เชฎเชพเชเซ เช เชฎเซ เชธเชฎเชพเชจ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชตเชพเชณเชพ เชเชเชเซเชจเซ เชเซเชฅเชฌเชฆเซเชง เชเชฐเซเช เชเซเช. เชนเชตเซ, เชเซ เชเชชเชฃเซ เชนเซเชถ เชธเซเชเซเชฐเชเซเชเชฐเชฎเชพเชเชฅเซ เชเชฐเซเชฎเชพเช เชเชตเชพ เชฎเชพเชเซ, เชธเชฟเชธเซเชเชฎเชจเซ เชเชพเชฐเซเชฏ เชเชฐเชตเชพเชจเซ เชฐเซเชค เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ, เชคเซ เชซเชเซเชค เชธเชชเซเชฒเชพเชฏเชนเซเชฒเซเชก เชเซเชฒเชพเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซ; เชเชชเชฃเซ เช เชจเซเชฏ เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชธเซเชชเชฐเซเชถ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ. เช เชฐเซเชคเซ, เชเซ เชฒเซเชเชฟเชธเซเชเชฟเชเซเชธ เช เชงเชฟเชเชพเชฐเซ เชคเซเชจเชพ เชตเชฟเชญเชพเชเชฎเชพเช เชเชเชเช เชฌเชฆเชฒเชถเซ, เชคเซ เชฌเชพเชเซเชจเซเช เชธเซเชเซเชถเชจ เช เชเชฌเชเชง เชฐเชนเซเชถเซ. เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชธเซเชชเซเชธเชธเซเชเซเชถเชจ เชตเชฐเซเช เชชเชฃ เชซเซเชฐเชซเชพเชฐเซเชฅเซ เชตเชพเชเซเชซ เชฐเชนเซเชถเซ เชจเชนเซเช.
เชธเซเชชเซเชธ เชธเซเชเซเชถเชจ เชชเชฐ เชเชพเชฎ เชเชฐเชคเชพ เช เชฎเชพเชฐเชพ เช เชงเชฟเชเชพเชฐเซเช เชธเชเชญเชตเชคเช เชซเซเชฐเชซเชพเชฐเซเชฅเซ เชเซเชถ เชเซ เชเชพเชฐเชฃ เชเซ เชคเซเช เชคเซเชฎเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชค เชฎเชพเชเซ เชตเชฟเชจเชเชคเซ เชเชฐเซ เชถเชเซ เชเซ. เชจเซเชเชง เชฒเซ เชเซ เชเซเชกเชฎเชพเช เชธเชชเซเชฒเชพเชฏเชนเซเชฒเซเชก เช เชจเซ เชซเซเชฏเซเช เชฒ เชเซเชจเซเช เชตเชฐเซเชเซเชฎเชพเช เชธเชฎเชพเชฏเซเชฒ เชฐเชฟเชชเซเชฐเซเช_เชธเชชเซเชฒเชพเชฏ เช เชจเซ เชฐเชฟเชชเซเชฐเซเช_เชซเซเชฏเซเช เชฒ เชเซเชตเซ เชชเชฆเซเชงเชคเชฟเช เชเซ. เชเซ เชชเซเชฅเซเชตเซ เชคเซเชจเซ เชฐเชฟเชชเซเชฐเซเช เชเชฐเชตเชพเชจเซ เชฐเซเชค เชฌเชฆเชฒเชตเชพเชจเซเช เชเชนเซ เชคเซ เชถเซเช เชฅเชถเซ? เชธเชชเซเชฒเชพเชฏเชนเซเชฒเซเชก เช เชจเซ เชซเซเชฏเซเช เชฒ เชเซเชจเซเช เชฌเชเชจเซ เชตเชฐเซเชเซ เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. เชเซ เชคเชฎเชพเชฐเซ เชเชเชงเชฃ เช เชจเซ เชเชชเชญเซเชเซเชฏ เชตเชธเซเชคเซเชเชจเซ เชกเชฟเชฒเชฟเชตเชฐเซ เชเชฐเชตเชพเชจเซ เชฐเซเชค เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ เชคเซ เชถเซเช? เชคเชฎเชพเชฐเซ เชเชฆเชพเช เชฌเชงเชพ เช เชตเชฐเซเชเซ เชซเชฐเซเชฅเซ เชฌเชฆเชฒเชตเชพ เชชเชกเชถเซ. เช เชจเซ เช เชชเชนเซเชฒเซเชฅเซ เช 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. เชคเซ เชฌเชเชจเซ เชฐเชฟเชชเซเชฐเซเชเชฐ เชเซเชฒเชพเชธเชจเชพ เชฌเชพเชณเชเซ เชเซ. เชตเชงเซเชฎเชพเช, เช เชฎเซ เชธเซเชชเซเชธเชธเซเชเซเชถเชจ เชเซเชฒเชพเชธเชฎเชพเช เชเชจเซเชธเซเชเชจเซเชธ เชตเซเชฐเซเชเชฌเชฒเซเชธ เชเชฎเซเชฐเซเชฏเชพ เชเซ เชเซเชฅเซ เชเซ เชเชฐเซเชฐเซ เชนเซเชฏ เชคเซ เชเชเซเชเชฟเชค เชธเชฌเชเซเชฒเชพเชธ เชถเชฐเซ เชเชฐเซ เชถเชเชพเชฏ. เชนเชตเซ, เชเซ เชชเซเชฅเซเชตเซ เชเชเชเช เชฌเซเชเซเช เชฌเชฆเชฒเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซ, เชคเซ เชเชชเชฃเซ เชชเซเชเชพ เชตเชฐเซเชเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐ เชเชฐเซเชถเซเช, เชฎเซเชเซเชฏ เชตเชฐเซเชเชฎเชพเช เชจเชนเซเช.
เช เชฒเชฌเชคเซเชค, เช เชฎเชพเชฐเชพ เชเซเชเชฒเชพเช เชตเชฐเซเชเซ เชนเชเซ เชชเชฃ เชเชเชฌเซเชเชพ เชชเชฐ เชจเชฟเชฐเซเชญเชฐ เชเซ. เชเชฎ, เชธเชชเซเชฒเชพเชฏ เชฐเชฟเชชเซเชฐเซเชเชฐ เชเชฌเซเชเซเชเซเช เชธเชชเซเชฒเชพเชฏเชนเซเชฒเซเชก เชชเชฐ เชเชงเชพเชฐ เชฐเชพเชเซ เชเซ, เช เชจเซ เชซเซเชฏเซเช เชฒ เชฐเชฟเชชเซเชฐเซเชเชฐ เชซเซเชฏเซเช เชฒ เชเซเชจเซเช เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเซ. เช เชฒเชฌเชคเซเชค, เชฌเซเชธเซเชเชฐ เชฌเชณเชคเชฃ เชเชพเชเชเซ เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒเชพ เชนเซเชตเชพ เชเซเชเช. เชชเชฐเชเชคเซ เช เชนเซเช เชฌเชงเซเช เชชเชนเซเชฒเซเชฅเซ เช เชคเชพเชฐเซเชเชฟเช เชฒเชพเชเซ เชเซ, เช เชจเซ เชซเซเชฐเชซเชพเชฐเซ เชเชฐเชตเชพ เชเชพเชธ เชเชฐเซเชจเซ เชฎเซเชถเซเชเซเชฒ เชจเชนเซเช เชนเซเชฏ - เชเช เชเชฌเซเชเซเชเซเชเชจเชพ เชเซเชกเชจเซ เชธเชเชชเชพเชฆเชฟเชค เชเชฐเชตเชพเชฅเซ เชฌเซเชเชพเชจเซ เชเซเชฌ เช เชธเชฐ เชฅเชถเซ เชจเชนเซเช.
เชเชฎ, เช เชฎเซ เชเช เชฎเซเชกเซเชฏเซเชฒเชฐ เชเซเชก เชฌเชจเชพเชตเซเชฏเซ เชเซ เชเซเชฏเชพเช เชฆเชฐเซเช เชเชฌเซเชเซเชเซเช/เชตเชฐเซเชเชจเซ เชเชตเชพเชฌเชฆเชพเชฐเซเช เชเซเชเซเชเชธ เชฐเซเชคเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชเชตเชพ เชเซเชก เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช เชเซเช เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ, เชคเซเชจเซ เชเชพเชณเชตเชตเซเช เชเช เชธเชฐเชณ เชเชพเชฐเซเชฏ เชนเชถเซ. เช เชฎเซ เชธเชฎเชเซเชฐ "เชฆเซเชตเซ เชชเชฆเชพเชฐเซเชฅ" เชจเซ SRP เชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเซเชฏเซเช เชเซ.
เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ:
- เชฌเซ เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"เชนเซเช เชชเซเชฐเซ เชตเซเชฌ เชกเซเชตเชฒเชชเชฐ เชเซเช" .- เชเชจเชฒเชพเชเชจ เชเซเชฐเซเชธ
"0 เชฅเซ C# เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .- เชเช เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"0 เชฅเซ PRO เชธเซเชงเซ PHP เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .
เชธเซเชฐเซเชธ: www.habr.com