เบเบฒเบเบเบฑเบเปเบ: เบเบฑเบเบเบตเบกเบกเบฒเบชเปเบฒเบฅเบฑเบเบเปเบฒเบ
เบเปเบฒเบเปเบฒเบเปเบเบปเปเบฒเปเบเปเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒ, เบเปเบฒเบเบกเบฑเบเบเบฐเปเบเปเบเบดเบเบเปเบฝเบงเบเบฑเบเบซเบผเบฑเบเบเบฒเบ SOLID. เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบฎเบฑเบเปเบซเปเบเบนเปเบเบฝเบเปเบเบฅเปเบเบฅเบกเบชเบฒเบกเบฒเบเบเบฝเบเบฅเบฐเบซเบฑเบเบเบตเปเบชเบฐเบญเบฒเบ, เบกเบตเปเบเบเบชเปเบฒเบเบเบตเปเบเบตเปเบฅเบฐเบชเบฒเบกเบฒเบเบฎเบฑเบเบชเบฒเปเบเปเบเปเบฒเบ. เบกเบฑเบเปเบเบฑเบเบกเบนเบเบเปเบฒเบเบตเปเบชเบฑเบเปเบเบเบงเปเบฒเปเบเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบกเบตเบซเบฅเบฒเบเบงเบดเบเบตเบเบตเปเบเบฐเบเบฐเบเบดเบเบฑเบเบงเบฝเบเบเบฒเบเบชเบฐเปเบเบฒเบฐเปเบเบซเบเบถเปเบเบขเปเบฒเบเบเบทเบเบเปเบญเบ. เบเบนเปเบเปเบฝเบงเบเบฒเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบกเบตเบเบงเบฒเบกเบเบดเบเปเบฅเบฐเบเบงเบฒเบกเปเบเบปเปเบฒเปเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบเปเบฝเบงเบเบฑเบ "เปเบชเบฑเปเบเบเบฒเบเบเบตเปเบเบทเบเบเปเบญเบ", เบกเบฑเบเบเบฑเบเบซเบกเบปเบเปเบกเปเบเบเบถเปเบเบเบฑเบเบเบฐเบชเบปเบเบเบฒเบเบเบญเบเปเบเปเบฅเบฐเบเบปเบ. เบขเปเบฒเบเปเบเบเปเปเบเบฒเบก, เปเบเบงเบเบงเบฒเบกเบเบดเบเบเบตเปเบเบฐเบเบฒเบเปเบ SOLID เปเบกเปเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบญเบกเบฎเบฑเบเปเบเบเบเบนเปเบเบฒเบเบซเบเปเบฒเปเบเบทเบญเบเบเบฑเบเบซเบกเบปเบเบเบญเบเบเบธเบกเบเบปเบ IT. เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเบเบฒเบเปเบเบฑเบเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบตเบเปเบซเบกเปเปเบฅเบฐเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบธเปเบกเบเบญเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเบเบตเบซเบผเบฒเบ.
เปเบซเปเปเบเบปเปเบฒเปเบเบงเปเบฒเบซเบผเบฑเบเบเบฒเบ SOLID เปเบกเปเบเบซเบเบฑเบ เปเบฅเบฐเบกเบฑเบเบเปเบงเบเบเบงเบเปเบฎเบปเบฒเปเบเบงเปเบ.
Skillbox เปเบเบฐเบเปเบฒ: เบซเบผเบฑเบเบชเบนเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ
"เบเบนเปเบเบฑเบเบเบฐเบเบฒเบกเบทเบเบท PRO" .เบเบงเบเปเบฎเบปเบฒเปเบเบทเบญเบ: เบชเปเบฒเบฅเบฑเบเบเบนเปเบญเปเบฒเบเบเบฑเบเบซเบกเบปเบเบเบญเบ "Habr" - เบชเปเบงเบเบซเบผเบธเบ 10 rubles เปเบกเบทเปเบญเบฅเบปเบเบเบฐเบเบฝเบเปเบเบซเบผเบฑเบเบชเบนเบ Skillbox เปเบเบเปเบเปเบฅเบฐเบซเบฑเบเบชเบปเปเบเปเบชเบตเบก "Habr".
SOLID เปเบกเปเบเบซเบเบฑเบ?
เบเปเบฒเบชเบฑเบเบเบตเปเปเบกเปเบเบเบปเบงเบซเบเปเป, เปเบเปเบฅเบฐเบเบปเบงเบญเบฑเบเบชเบญเบเบเบญเบเบเปเบฒเบชเบฑเบเปเบกเปเบเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเบทเปเบเบญเบเบซเบผเบฑเบเบเบฒเบเบชเบฐเปเบเบฒเบฐ:
- Sเบซเบผเบฑเบเบเบฒเบเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบ. เปเบกเบเบนเบเบชเบฒเบกเบฒเบเบกเบตเปเบซเบเบเบปเบเบญเบฑเบเบเบฝเบงเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฝเบเปเบเบ.
เปเบเป Oเบเบฒเบเบเบฒ/เบซเบผเบฑเบเบเบฒเบเบเบดเบ (เบซเบผเบฑเบเบเบฒเบเปเบเบตเบ/เบเบดเบ). เบซเปเบญเบเบฎเบฝเบเปเบฅเบฐเบญเบปเบเบเบฐเบเบญเบเบญเบทเปเบเปเบเบงเบเบเบฐเปเบเบตเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบซเบเบฒเบ, เปเบเปเบเบดเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเปเบเป.โเปเบเป Liskov เบซเบผเบฑเบเบเบฒเบเบเบปเบเปเบเบ (เบซเบผเบฑเบเบเบฒเบเบเบฒเบเบเบปเบเปเบเบ Liskov). เบซเบเปเบฒเบเบตเปเบเปเบฒเปเบเปเบเบฐเปเบเบเบเบทเปเบเบเบฒเบเบเบงเบเบเบฐเบชเบฒเบกเบฒเบเบเปเบฒเปเบเป subtypes เบเบญเบเบเบฐเปเบเบเบเบทเปเบเบเบฒเบเปเบเบเบเปเปเบฎเบนเปเบเบปเบง.เปเบเป Iเบซเบผเบฑเบเบเบฒเบเปเบเปเบเบชเปเบงเบเบเบฒเบเปเบเปเบเบญเบ โ (เบซเบผเบฑเบเบเบฒเบเปเบเบเบเบฒเบเปเบเปเบเบญเบ). เบซเบเปเบงเบเบเบฒเบเบเบญเบเปเบงเบเปเปเบเบงเบเบเบถเปเบเบเบฑเบเบงเบดเบเบตเบเบฒเบเบเบตเปเบเบงเบเปเบเบปเบฒเบเปเปเปเบเปเปเบเป.เปเบเป Dเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบเบตเปเบเบเบฑเบ ependency (เบซเบผเบฑเบโเบเบฒเบโเบเบญเบโเบเบฒเบโเบเบตเปเบโเบเบฑเบโเบเบญเบโเบเบฒเบโเปเบเบดเปเบโเบเบฒโเบญเบฒโเปเบชโ)โ. เปเบกเบเบนเบเปเบเบฅเบฐเบเบฑเบเบชเบนเบเบเบงเปเบฒเบเปเปเบเบงเบเบเบถเปเบเบเบฑเบเปเบกเบเบนเบเปเบเบฅเบฐเบเบฑเบเบเปเปเบฒ.
เบซเบผเบฑเบเบเบฒเบเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเบเบฝเบง
โ
เบซเบผเบฑเบเบเบฒเบเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเบเบฝเบง (SRP) เบฅเบฐเบเบธเบงเปเบฒเปเบเปเบฅเบฐเบซเปเบญเบเบฎเบฝเบเบซเบผเบทเปเบกเบเบนเบเปเบเปเบเบเบเบฒเบเบเบงเบเบเบฐเบฎเบฑเบเบเบดเบเบเบญเบเบเบฝเบเปเบเปเบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเปเบเบเบเบฒเบเบเบฑเปเบ. เบเบญเบเบเบฒเบเบเบฑเปเบ, เบญเบปเบเบเบฐเบเบญเบเบเบญเบเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเบเบตเปเบเบงเบเบเบฐเบเบทเบเบกเบญเบเบซเบกเบฒเบเปเบซเปเบซเปเบญเบเบฎเบฝเบเบเบญเบเบเบปเบเปเบญเบ, เปเบเบเบเบตเปเบเบฐเบเบฐเปเบเบเบเบฐเบเบฒเบเปเบเบเบปเปเบงเบซเปเบญเบเบฎเบฝเบเบเบตเปเบเปเปเบเปเบฝเบงเบเปเบญเบ. เบเบนเปเบเบฑเบเบเบฐเบเบฒเปเบฅเบฐเบเบนเปเบเบฐเบเบฒเบเบเปเบฒเบงเบเบฐเปเบชเบตเบเบเบญเบ SRP, Robert S. Martin, เบญเบฐเบเบดเบเบฒเบเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเปเบเบฑเบเปเบซเบเบเบปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฝเบเปเบเบ. เปเบเปเบเบทเปเบญเบเบเบปเปเบเบฅเบฒเบงเปเบเปเบชเบฐเปเบซเบเบตเบเปเบฒเบเบตเปเปเบเบฑเบเบซเบเบถเปเบเปเบเบญเบปเบเบเบฐเบเบญเบเบเบญเบเบงเบฝเบเบเบฒเบเบเบญเบเบฅเบฒเบง "เบซเบผเบฑเบเบเบฒเบเบเบญเบเบเบฒเบเบญเบญเบเปเบเบเบเบตเปเบกเบตเบเบธเบเบเบฐเบชเบปเบ". เปเบเบงเบเบงเบฒเบกเบเบดเบเบฅเบงเบกเปเบญเบปเบฒเบซเบผเบฒเบเบฎเบนเบเปเบเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบตเปเบเบทเบเบเปเบฒเบเบปเบเปเบงเปเบเปเบญเบเบซเบเปเบฒเบเบตเปเปเบเบ Tom DeMarco.
เปเบเบงเบเบงเบฒเบกเบเบดเบเบเบฑเปเบเบเปเบฒเบงเบเบฑเบเบฅเบงเบกเปเบญเบปเบฒเปเบเบงเบเบงเบฒเบกเบเบดเบเบซเบผเบฒเบเบขเปเบฒเบเบเบตเปเบชเปเบฒเบเบเบถเปเบเปเบเบ David Parnas. เบชเบญเบเบเบปเปเบเบเปเปเบกเปเบ encapsulation เปเบฅเบฐเบเบฒเบเปเบเบทเปเบญเบเบเปเปเบกเบนเบ. Parnas เปเบเปเบเบฝเบเบงเปเบฒเบเบฒเบเปเบเปเบเบฅเบฐเบเบปเบเปเบเบฑเบเปเบกเบเบนเบเปเบเบเบเปเบฒเบเบซเบฒเบเบเปเปเบเบงเบเบญเบตเบเปเบชเปเบเบฒเบเบงเบดเปเบเบฒเบฐเปเบเบเบงเบฒเบเบเบฑเบเบซเบผเบทเบเบฒเบเปเบซเบผเปเบเบปเปเบฒเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ. เบเบธเบเปเปเบกเบเบนเบเบเปเบญเบเบกเบตเบเบฒเบเปเบเปเปเบเบชเบฐเปเบเบฒเบฐเบเบตเปเบชเบฐเบซเบเบญเบเบเปเปเบกเบนเบเบเปเบฒเปเบชเบธเบเบเบตเปเปเบซเปเปเบเปเบฅเบนเบเบเปเบฒ.
เปเบเบเบงเบดเบเบตเบเบฒเบเบเบฒเบ, Martin เปเบเปเปเบซเปเบเบปเบงเบขเปเบฒเบเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบเบเบฑเบเบเบนเปเบเบฑเบเบเบฒเบเบญเบฒเบงเบธเปเบชเบเบญเบเบเปเบฅเบดเบชเบฑเบ (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
เปเบเปเบเบดเบเปเบฅเปเบง, เบชเบฐเบเบฒเบเบตเบญเบฒเบงเบฐเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบงเบฒเบกเบเบดเบเบเบปเบเบเบฐเบเบด (เบเปเบญเบเบเปเปเบเบดเบเบงเปเบฒเบเปเบญเบเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเปเบเบซเบฒเบเบฒเบเบญเบปเบเบเบฒเบ NASA เบเบฑเบเบเบต), เปเบเปเบกเบตเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเบเบฐเบงเบดเปเบเบฒเบฐเบขเบนเปเบเบตเปเบเบตเป.
เบเบฑเปเบเบเบฑเปเบ, เบซเปเบญเบเบฎเบฝเบ SpaceStation เบกเบตเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบซเบผเบฒเบ (เบซเบผเบทเบงเบฝเบเบเบฒเบ). เบเบงเบเบกเบฑเบเบเบฑเบเปเบปเบเบชเบฒเบกเบฒเบเปเบเปเบเบญเบญเบเปเบเบฑเบเบเบฐเปเบเบ:
- เปเบเบฑเบเปเบเบต;
- เบญเบธโเบเบฐโเบเบญเบ (เบญเบธโเบเบฐโเบเบญเบโเบญเบธโเบเบฐโเปเบเบโ)โ;
- เบเปเปเบฒเบกเบฑเบ;
- เปเบเบทเปเบญเบเปเบฅเบฑเปเบ.
เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเปเปเบกเบตเบเบฐเบเบฑเบเบเบฒเบเบเบญเบเบชเบฐเบเบฒเบเบตเปเบเปเบเบทเบเบกเบญเบเบซเบกเบฒเบเปเบซเปเบซเปเบญเบเบฎเบฝเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบดเบเบเบฐเบเบฒเบเบฒเบเปเบเปเบเปเบฒเบเบงเปเบฒเปเบเปเบเบฑเบเบเบนเปเบฎเบฑเบเบเบดเบเบเบญเบเปเบเบชเบดเปเบเบเบตเป. เบชเปเบงเบเบซเบผเบฒเบเบญเบฒเบเบเบฐ, เบเบฑเบเบงเบดเบเบฐเบเบฒเบชเบฒเบเบเบงเบเบเบธเบก sensors, logistician เบฎเบฑเบเบเบดเบเบเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบฐเบซเบเบญเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ, เบงเบดเบชเบฐเบงเบฐเบเบญเบเบฎเบฑเบเบเบดเบเบเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบฐเบซเบเบญเบเบเปเปเบฒเบกเบฑเบเปเบเบทเปเบญเปเบ, เปเบฅเบฐเบเบฑเบเบเบดเบเบเบงเบเบเบธเบก boosters.
เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบงเบปเปเบฒเบงเปเบฒเปเบเบเบเบฒเบเบเบตเปเบเปเปเบชเบญเบเบเปเบญเบเบเบฑเบ SRP? เปเบเบปเปเบฒโเปเบเปโเบเบญเบ. เปเบเปเบซเปเบญเบเบฎเบฝเบ SpaceStation เปเบกเปเบ "เบงเบฑเบเบเบธเบเบญเบเบเบฃเบฐเปเบเบปเปเบฒ" เบเบปเบเบเบฐเบเบดเบเบตเปเบฎเบนเปเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบฅเบฐเปเบฎเบฑเบเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบ. เบเบตเปเปเบกเปเบเบเบฒเบเบเปเปเบเปเบฒเบเบฎเบนเบเปเบเบเบเบตเปเบชเปเบฒเบเบฑเบเปเบเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเปเบเบเบงเบฑเบเบเบธ. เบชเปเบฒเบฅเบฑเบเบเบนเปเปเบฅเบตเปเบกเบเบปเปเบ, เบงเบฑเบเบเบธเบเบฑเปเบเบเปเบฒเบงเปเบกเปเบเบเบฒเบเบเบตเปเบเบฐเบฎเบฑเบเบชเบฒ. เบกเบฒเบฎเบญเบเบเบฐเบเบธ, เปเบเบเบเบฒเบเปเบกเปเบเบเปเบฒเบเบเบฒเบเบซเบผเบฒเบ, เปเบกเปเบเปเบฅเปเบง, เปเบเปเบเบดเบเบเบฐเบเบฒเบเบฒเบเบชเบดเปเบเบเบตเปเบเบฐเปเบเบตเบเบเบถเปเบเบเปเบฒเบซเบฒเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบเบตเปเบกเบเบธเบเบชเบปเบกเบเบฑเบเปเบซเบกเป. เบเบฒเบเบเบตเบชเบฐเบเบฒเบเบตเบญเบฒเบงเบฐเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบญเบเบกเบตเบชเบฐเบเบฒเบเบตเบเบฒเบเปเบเบ เบซเบผเบทเบซเปเบญเบเบเบฐเบเบธเบก. เปเบฅเบฐเบซเบผเบฒเบเบซเบเปเบฒเบเบตเปเบกเบต, SpaceStation เบซเบผเบฒเบเบเบฐเบเบฐเบซเบเบฒเบเบเบปเบง. เบเบต, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเบเบฐเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบเบนเปเบญเบทเปเบ, เบเบฒเบเบเปเบฅเบดเบเบฒเบเบชเบฐเบฅเบฑเบเบชเบฑเบเบเปเบญเบเบเบฑเบเบซเบกเบปเบเบเบฐเบเบฒเบเปเบเบฑเบเบเบงเบฒเบกเบซเบเบธเปเบเบเบฒเบเบซเบผเบฒเบ. เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบฅเบปเบเบเบงเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบญเบ, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เปเบฅเบฑเปเบ. เบเปเบฒเบเบฑเบเบเบปเปเบเบเบงเปเบฒเบฎเปเบญเบเบเปเบเบฒเบเบเปเบฝเบเปเบเบเปเบเบฑเบเปเบเบต, เบเบตเปเบญเบฒเบเบเบฐเบชเบปเปเบเบเบปเบเบเบฐเบเบปเบเบเปเปเบฅเบฐเบเบปเบเบเบฒเบเบชเบทเปเบชเบฒเบเบเบญเบเบชเบฐเบเบฒเบเบตเปเบเปเบเบตเบซเบผเบฒเบ.
เบเบฒเบเบฅเบฐเปเบกเบตเบเบซเบผเบฑเบเบเบฒเบเบเบญเบ SRP เบญเบฒเบเบเบฐเปเบฎเบฑเบเปเบซเปเปเบเบเบฐเบเบฐเบเบฒเบเบเปเบฒเบเบเบธเบเบเบฐเบงเบดเบเบตเปเบเปเบฅเบเบฐเบชเบฑเปเบ, เปเบเปเปเบเบเบตเปเบชเบธเบเบเบงเบเปเบฎเบปเบฒเบเบฐ "เบชเบนเบเปเบชเบเบชเบปเบเบเบฒเบก", เปเบฅเบฐเบกเบฑเบเบเบฐเบเบฒเบเปเบเบฑเบเปเบฅเบทเปเบญเบเบเบฒเบเบซเบผเบฒเบเบเบตเปเบเบฐเบฎเบฑเบเบชเบฒ monster เบเบฑเปเบเบเปเบฒเบงเปเบเบญเบฐเบเบฒเบเบปเบ. เบกเบฑเบเบเบตเบเบตเปเบชเบธเบเบเบตเปเบเบฐเปเบเปเบเปเบเบเบเบฒเบเบญเบญเบเปเบเบฑเบเบชเปเบงเบเปเบเบเบเปเบฒเบเบซเบฒเบเบเบญเบเบฅเบฐเบซเบฑเบ, เปเบเปเบฅเบฐเบเบปเบเบกเบตเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบชเบฐเปเบเบฒเบฐ. เปเบเบปเปเบฒเปเบเปเบฅเบทเปเบญเบเบเบตเป, เปเบซเปเบเปเบฝเบเบซเปเบญเบเบฎเบฝเบ SpaceStation.
เปเบเปเบเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบ
เบเปเบฒเบเปเบเบดเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเบเปเบฒเบเบปเบเบชเบตเปเบเบฐเปเบเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบตเปเบเบทเบเบเบงเบเบเบธเบกเปเบเบเบเบฑเปเบ SpaceStation. เบเบงเบเปเบฎเบปเบฒเบเบฐเบฎเบฑเบเบชเบฒเบเบงเบเปเบเบปเบฒเบขเบนเปเปเบเปเบเปเบเปเบงเบฅเบฒเบเบตเป refactoring. เบฅเบฐเบซเบฑเบเบเบตเปเบเบทเบเบเบฑเบเบเบธเบเปเบซเปเบเบปเบเบเบฑเบ 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; เปเบฎเบเบเบฑเบ.
เบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเบเบตเปเบชเปเบฒเบเบฑเบเบเปเบฒเบเบงเบเบซเบเบถเปเบเปเบเบฅเบฐเบซเบฑเบเบชเบฐเบเบฑเบเบเบตเป. เบเบธเบเปเบกเปเบเบงเปเบฒเบซเบเปเบฒเบเบตเปเบเบญเบเบเบธเบเบเบปเบเบเปเปเบเบฝเบเปเบเปเบเบทเบเบซเบธเปเบกเบซเปเปเบขเบนเปเปเบเบซเปเบญเบเบฎเบฝเบเบเบญเบเบเบปเบเปเบญเบ, เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเบเบทเบเบเบฑเบเบเบฑเปเบเปเบเบฅเบฑเบเบชเบฐเบเบฐเบเบตเปเบเบฐเบเบฒเบเปเบเบฑเบเบเบฒเบเบเบฒเบเปเบเบปเบฒเปเบฅเบฐเบชเบญเบเบเปเบญเบ. เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบธเปเบกเบญเบปเบเบเบฐเบเบญเบเบเบตเปเบกเบตเบซเบเปเบฒเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบฒเบกเบซเบผเบฑเบเบเบฒเบเบเบญเบเบเบฒเบเบชเบญเบเบเปเบญเบ. เปเบเบเบฑเบเบเบธเบเบฑเบ, เบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเปเบฝเบเบงเบดเบเบตเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเบฅเบฐเบเบปเบ, เบเบฒเบเปเบเบทเปเบญเบเบเปเบฒเบเบเบฒเบเปเบเบเบชเปเบฒเบ hash เปเบเบซเบฒ array, เบเบฝเบเปเบเปเปเบเปเบซเปเบญเบเบฎเบฝเบ 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. เบเบงเบเปเบเบปเบฒเบเบฑเบเบชเบญเบเปเบเบฑเบเปเบเบฑเบเบเปเบญเบเบเบญเบเบซเปเบญเบเบฎเบฝเบเบเบฑเบเบเปเบฒเบง. เบเบญเบเบเบฒเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบตเปเบกเบเบปเบงเปเบ instance เบเบฑเบเบซเปเบญเบเบฎเบฝเบ SpaceStation เปเบเบทเปเบญเปเบซเป subclass เบเบตเปเบเปเบญเบเบเบฒเบเบชเบฒเบกเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเปเบเปเบเปเบฒเบเปเบฒเปเบเบฑเบ. เปเบเบเบฑเบเบเบธเบเบฑเบ, เบเปเบฒเปเบเปเบเบเบดเบเปเบฅเบเบเบฑเบเบชเบดเบเปเบเบเบตเปเบเบฐเบเปเบฝเบเปเบเบเบชเบดเปเบเบญเบทเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฎเบฑเบเบเบฒเบเบเปเบฝเบเปเบเบเปเบเบเบฑเปเบเบเปเบญเบ, เปเบฅเบฐเบเปเปเปเบกเปเบเบเบฑเปเบเบเบปเปเบเบเป.
เปเบเปเบเบญเบ, เบเบฒเบเบซเปเบญเบเบฎเบฝเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบถเปเบเบเบฑเบเบเบฑเบเปเบฅเบฐเบเบฑเบ. เบเบฑเปเบเบเบฑเปเบ, เบงเบฑเบเบเบธ SupplyReporter เปเบกเปเบเบเบถเปเบเบเบฑเบ SupplyHold, เปเบฅเบฐ FuelReporter เปเบกเปเบเบเบถเปเบเบเบฑเบ FuelTank. เปเบเปเบเบญเบ, เปเบเบทเปเบญเบเบเบฐเบเบธเปเบเบเปเบญเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบเบฑเบเบเปเปเบฒเบกเบฑเบ. เปเบเปเปเบเบเบตเปเบเบตเปเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบเบดเปเบเบเบทเบงเปเบฒเบกเบตเปเบซเบเบเบปเบ, เปเบฅเบฐเบเบฒเบเบเปเบฝเบเปเบเบเบเบฐเบเปเปเบกเบตเบเบงเบฒเบกเบซเบเบธเปเบเบเบฒเบเปเบเบเบชเบฐเปเบเบฒเบฐ - เบเบฒเบเปเบเปเปเบเบฅเบฐเบซเบฑเบเบเบญเบเบงเบฑเบเบเบธเบซเบเบถเปเบเบเบฐเบเปเปเบกเบตเบเบปเบเบเบฐเบเบปเบเบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบเบเปเปเบชเบดเปเบเบญเบทเปเบ.
เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบชเปเบฒเบเบฅเบฐเบซเบฑเบ modular เบเบตเปเบเบงเบฒเบกเบฎเบฑเบเบเบดเบเบเบญเบเบเบญเบเปเบเปเบฅเบฐเบงเบฑเบเบเบธ / เบซเปเบญเบเบฎเบฝเบเบเบทเบเบเปเบฒเบเบปเบเบขเปเบฒเบเปเบเปเบเบญเบ. เบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบฅเบฐเบซเบฑเบเบเบฑเปเบเบเปเบฒเบงเบเปเปเปเบกเปเบเบเบฑเบเบซเบฒ, เบเบฒเบเบฎเบฑเบเบชเบฒเบกเบฑเบเบเบฐเปเบเบฑเบเบงเบฝเบเบเบตเปเบเปเบฒเบเบเบฒเบ. เบเบงเบเปเบฎเบปเบฒเปเบเปเบเปเบฝเบ โเบงเบฑเบเบเบธเบญเบฑเบเบชเบนเบเบชเบปเปเบโ เบเบฑเบเปเบปเบเปเบเบฑเบ SRP.
Skillbox เปเบเบฐเบเปเบฒ:
- เบซเบผเบฑเบเบชเบนเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบชเบญเบเบเบต
"เบเปเบญเบเปเบเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบงเบฑเบ PRO" .- เบซเบผเบฑเบเบชเบนเบเบญเบญเบเปเบฅเบ
"เบเบฑเบเบเบฑเบเบเบฐเบเบฒ C# เบเบฒเบ 0" .- เบซเบผเบฑเบเบชเบนเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ
"เบเบฑเบเบเบฑเบเบเบฐเบเบฒ PHP เบเบฒเบ 0 เปเบเบดเบ PRO" .
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com