SOLID භාවිතයෙන් නම්‍යශීලී කේතයක් ලිවීම

SOLID භාවිතයෙන් නම්‍යශීලී කේතයක් ලිවීම

පරිවර්තකයාගෙන්: ඔබ වෙනුවෙන් ප්‍රකාශයට පත් කරන ලදී සෙවරින් පෙරෙස්ගේ ලිපිය වැඩසටහන්කරණයේදී SOLID මූලධර්ම භාවිතා කිරීම ගැන. ලිපියේ තොරතුරු ආරම්භකයින් සහ පළපුරුදු වැඩසටහන්කරුවන්ට ප්රයෝජනවත් වනු ඇත.

ඔබ සංවර්ධනයේ යෙදී සිටින්නේ නම්, ඔබ SOLID මූලධර්ම ගැන අසා ඇති. ඒවා ක්‍රමලේඛකයාට පිරිසිදු, හොඳින් ව්‍යුහගත සහ පහසුවෙන් නඩත්තු කළ හැකි කේතයක් ලිවීමට සබල කරයි. ක්‍රමලේඛනයේදී යම් කාර්යයක් නිවැරදිව ඉටු කරන්නේ කෙසේද යන්න පිළිබඳ ප්‍රවේශයන් කිහිපයක් ඇති බව සඳහන් කිරීම වටී. විවිධ විශේෂඥයින්ට "නිවැරදි මාර්ගය" පිළිබඳ විවිධ අදහස් සහ අවබෝධය ඇත; ඒ සියල්ල එක් එක් පුද්ගලයාගේ අත්දැකීම් මත රඳා පවතී. කෙසේ වෙතත්, SOLID හි ප්‍රකාශ කරන ලද අදහස් තොරතුරු තාක්ෂණ ප්‍රජාවේ සියලුම නියෝජිතයින් පාහේ පිළිගනී. ඒවා බොහෝ යහපත් සංවර්ධන කළමනාකරණ පිළිවෙත්වල මතුවීම හා සංවර්ධනය සඳහා ආරම්භක ලක්ෂ්‍යය බවට පත්විය.

SOLID මූලධර්ම මොනවාද සහ ඒවා අපට උපකාර කරන්නේ කෙසේද යන්න අපි තේරුම් ගනිමු.

Skillbox නිර්දේශ කරයි: ප්රායෝගික පාඨමාලාව "ජංගම සංවර්ධක PRO".

අපි ඔබට මතක් කරමු: "Habr" හි සියලුම පාඨකයින් සඳහා - "Habr" ප්‍රවර්ධන කේතය භාවිතයෙන් ඕනෑම Skillbox පාඨමාලාවකට ලියාපදිංචි වන විට රූබල් 10 ක වට්ටමක්.

SOLID යනු කුමක්ද?

මෙම පදය කෙටි යෙදුමකි, පදයේ සෑම අකුරක්ම නිශ්චිත මූලධර්මයක නමේ ආරම්භය වේ:

  • Sතනි වගකීම් මූලධර්මය. මොඩියුලයකට වෙනස් වීමට එක් හේතුවක් තිබිය හැක.
  • එම Oපෑන / සංවෘත මූලධර්මය (විවෘත / සංවෘත මූලධර්මය). පන්ති සහ අනෙකුත් අංග දිගු කිරීම සඳහා විවෘත විය යුතුය, නමුත් වෙනස් කිරීම සඳහා වසා ඇත.
  •  එම Liskov ආදේශන මූලධර්මය (ලිස්කොව් ආදේශන මූලධර්මය). Base Type එකක් භාවිතා කරන Functions වලට තමන් නොදැනුවත්වම base type එකේ subtypes භාවිතා කිරීමට හැකි විය යුතුය.
  • එම Iඅතුරුමුහුණත වෙන් කිරීමේ මූලධර්මය  (අතුරුමුහුණ වෙන් කිරීමේ මූලධර්මය). මෘදුකාංග ආයතන ඔවුන් භාවිතා නොකරන ක්‍රම මත රඳා නොසිටිය යුතුය.
  • එම Dependency ප්‍රතිලෝම මූලධර්මය (යැපීම් ප්‍රතිලෝමයේ මූලධර්මය). ඉහළ මට්ටම්වල ඇති මොඩියුල පහළ මට්ටමේ මොඩියුල මත රඳා නොපවතී.

තනි වගකීම් මූලධර්මය


වැඩසටහනක එක් එක් පන්තිය හෝ මොඩියුලය එම වැඩසටහනේ ක්‍රියාකාරීත්වයේ එක් කොටසකට පමණක් වගකිව යුතු බව තනි වගකීම් මූලධර්මය (SRP) පවසයි. අමතර වශයෙන්, මෙම වගකීමේ මූලාංග අසම්බන්ධිත පන්තිවල විසිරී නොසිට ඔවුන්ගේම පන්තියට පැවරිය යුතුය. SRP හි සංවර්ධක සහ ප්‍රධාන එවැන්ජලිස්ත, රොබට් එස්. මාටින්, වගවීම වෙනස් වීමට හේතුව ලෙස විස්තර කරයි. ඔහු මුලින්ම මෙම යෙදුම යෝජනා කළේ ඔහුගේ කෘතියේ එක් අංගයක් ලෙස "වස්තු-නැඹුරු මෝස්තරයේ මූලධර්ම" ලෙසය. Tom DeMarco විසින් කලින් නිර්වචනය කරන ලද බොහෝ සම්බන්ධතා රටාව මෙම සංකල්පයට ඇතුළත් වේ.

ඩේවිඩ් පර්නාස් විසින් සකස් කරන ලද සංකල්ප කිහිපයක් ද මෙම සංකල්පයට ඇතුළත් විය. ප්‍රධාන දෙක තමයි කැප්සියුලේෂන් සහ තොරතුරු සැඟවීම. පර්නාස් තර්ක කළේ පද්ධතියක් වෙනම මොඩියුලවලට බෙදීම බ්ලොක් රූප සටහන් හෝ ක්‍රියාත්මක කිරීමේ ප්‍රවාහ විශ්ලේෂණය මත පදනම් නොවිය යුතු බවයි. ඕනෑම මොඩියුලයක සේවාදායකයින්ට අවම තොරතුරු සපයන නිශ්චිත විසඳුමක් අඩංගු විය යුතුය.

මාර්ගය වන විට, මාටින් සමාගමක ජ්යෙෂ්ඨ කළමනාකරුවන් (COO, CTO, CFO) සමඟ රසවත් උදාහරණයක් ලබා දුන්නේය, ඔවුන් එක් එක් විශේෂිත ව්යාපාරික මෘදුකාංග විවිධ අරමුණු සඳහා භාවිතා කරයි. එහි ප්‍රතිඵලයක් වශයෙන්, ඔවුන්ගෙන් ඕනෑම කෙනෙකුට වෙනත් කළමනාකරුවන්ගේ අවශ්‍යතාවලට බලපෑම් නොකර මෘදුකාංගයේ වෙනස්කම් ක්‍රියාත්මක කළ හැකිය.

දිව්යමය වස්තුව

සෑම විටම මෙන්, SRP ඉගෙන ගැනීමට ඇති හොඳම ක්‍රමය එය ක්‍රියාවෙන් දැකීමයි. තනි වගකීම් මූලධර්මය අනුගමනය නොකරන වැඩසටහනේ කොටසක් දෙස බලමු. මෙය අභ්‍යවකාශ මධ්‍යස්ථානයේ හැසිරීම් සහ ගුණාංග විස්තර කරන Ruby කේතයකි.

උදාහරණය සමාලෝචනය කර පහත සඳහන් දේ තීරණය කිරීමට උත්සාහ කරන්න:
අභ්‍යවකාශ මධ්‍යස්ථානයේ පන්තියේ ප්‍රකාශ කර ඇති එම වස්තූන්ගේ වගකීම්.
අභ්‍යවකාශ මධ්‍යස්ථානයේ ක්‍රියාකාරිත්වය ගැන උනන්දු විය හැකි අය.

class SpaceStation
  def initialize
    @supplies = {}
    @fuel = 0
  end
 
  def run_sensors
    puts "----- Sensor Action -----"
    puts "Running sensors!"
  end
 
  def load_supplies(type, quantity)
    puts "----- Supply Action -----"
    puts "Loading #{quantity} units of #{type} in the supply hold."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- Supply Action -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "Using #{quantity} of #{type} from the supply hold."
      @supplies[type] -= quantity
    else
      puts "Supply Error: Insufficient #{type} in the supply hold."
    end
  end
 
  def report_supplies
    puts "----- Supply Report -----"
    if @supplies.keys.length > 0
      @supplies.each do |type, quantity|
        puts "#{type} avalilable: #{quantity} units"
      end
    else
      puts "Supply hold is empty."
    end
  end
 
  def load_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Loading #{quantity} units of fuel in the tank."
    @fuel += quantity
  end
 
  def report_fuel
    puts "----- Fuel Report -----"
    puts "#{@fuel} units of fuel available."
  end
 
  def activate_thrusters
    puts "----- Thruster Action -----"
    if @fuel >= 10
      puts "Thrusting action successful."
      @fuel -= 10
    else
      puts "Thruster Error: Insufficient fuel available."
    end
  end
end

ඇත්ත වශයෙන්ම, අපගේ අභ්‍යවකාශ මධ්‍යස්ථානය ක්‍රියා විරහිතයි (මම හිතන්නේ නැහැ මම ඉක්මනින්ම නාසා ආයතනයෙන් ඇමතුමක් ලැබෙයි කියලා), නමුත් මෙතන විශ්ලේෂණය කරන්න දෙයක් තියෙනවා.

මේ අනුව, SpaceStation පන්තියට විවිධ වගකීම් (හෝ කාර්යයන්) ඇත. ඒවා සියල්ලම වර්ග වලට බෙදිය හැකිය:

  • සංවේදක;
  • සැපයුම් (පරිභෝජන භාණ්ඩ);
  • ඉන්ධන;
  • ත්වරණකාරක.

දුම්රිය ස්ථානයේ සේවකයන් කිසිවකුට පන්තියක් පවරා නොතිබුණද, කුමක් සඳහා වගකිව යුතුද යන්න අපට පහසුවෙන් සිතාගත හැකිය. බොහෝ දුරට ඉඩ ඇති පරිදි, විද්‍යාඥයා සංවේදක පාලනය කරයි, සැපයුම්කරු සම්පත් සැපයීම සඳහා වගකිව යුතුය, ඉංජිනේරුවරයා ඉන්ධන සැපයුම් සඳහා වගකිව යුතුය, සහ නියමුවා බූස්ටර පාලනය කරයි.

මෙම වැඩසටහන SRP අනුකූල නොවන බව අපට පැවසිය හැකිද? ඔව්, සහතිකයි. නමුත් SpaceStation පන්තිය යනු සෑම දෙයක්ම දන්නා සහ සෑම දෙයක්ම කරන සාමාන්‍ය "දේව වස්තුවක්" වේ. මෙය වස්තු-නැඹුරු වැඩසටහන්කරණයේ ප්‍රධාන විරෝධී රටාවකි. ආරම්භකයකු සඳහා, එවැනි වස්තූන් නඩත්තු කිරීම අතිශයින් දුෂ්කර ය. මෙතෙක් වැඩසටහන ඉතා සරලයි, ඔව්, නමුත් අපි නව විශේෂාංග එකතු කළහොත් කුමක් සිදුවේදැයි සිතා බලන්න. සමහරවිට අපේ අභ්‍යවකාශ මධ්‍යස්ථානයට වෛද්‍ය මධ්‍යස්ථානයක් හෝ රැස්වීම් කාමරයක් අවශ්‍ය වේවි. තවද කාර්යයන් වැඩි වන තරමට අභ්‍යවකාශ මධ්‍යස්ථානය වර්ධනය වේ. හොඳයි, මෙම පහසුකම අන් අයට සම්බන්ධ වන බැවින්, සම්පූර්ණ සංකීර්ණයටම සේවා සැපයීම වඩාත් සංකීර්ණ වනු ඇත. එහි ප්රතිඵලයක් වශයෙන්, අපි උදාහරණයක් ලෙස, ත්වරණකාරකවල ක්රියාකාරිත්වය කඩාකප්පල් කළ හැකිය. පර්යේෂකයෙකු සංවේදකවල වෙනස්කම් ඉල්ලා සිටින්නේ නම්, මෙය දුම්රිය ස්ථානයේ සන්නිවේදන පද්ධතිවලට ඉතා හොඳින් බලපානු ඇත.

SRP මූලධර්මය උල්ලංඝනය කිරීම කෙටි කාලීන උපායික ජයග්රහණයක් ලබා දිය හැකි නමුත් අවසානයේ දී අපි "යුද්ධය පරාජයට පත් වනු ඇත", අනාගතයේ දී එවැනි රකුසෙකු නඩත්තු කිරීම ඉතා අපහසු වනු ඇත. වැඩසටහන වෙනම කේත කොටස් වලට බෙදීම වඩාත් සුදුසුය, ඒ සෑම එකක්ම නිශ්චිත මෙහෙයුමක් සිදු කිරීම සඳහා වගකිව යුතුය. මෙය තේරුම් ගෙන අපි SpaceStation පන්තිය වෙනස් කරමු.

වගකීම බෙදා ගමු

ඉහත අපි SpaceStation පන්තිය මගින් පාලනය වන මෙහෙයුම් වර්ග හතරක් නිර්වචනය කළෙමු. නැවත සකස් කිරීමේදී අපි ඒවා මතක තබා ගන්නෙමු. යාවත්කාලීන කේතය SRP සමඟ වඩා හොඳින් ගැලපේ.

class SpaceStation
  attr_reader :sensors, :supply_hold, :fuel_tank, :thrusters
 
  def initialize
    @supply_hold = SupplyHold.new
    @sensors = Sensors.new
    @fuel_tank = FuelTank.new
    @thrusters = Thrusters.new(@fuel_tank)
  end
end
 
class Sensors
  def run_sensors
    puts "----- Sensor Action -----"
    puts "Running sensors!"
  end
end
 
class SupplyHold
  attr_accessor :supplies
 
  def initialize
    @supplies = {}
  end
 
  def load_supplies(type, quantity)
    puts "----- Supply Action -----"
    puts "Loading #{quantity} units of #{type} in the supply hold."
    
    if @supplies[type]
      @supplies[type] += quantity
    else
      @supplies[type] = quantity
    end
  end
 
  def use_supplies(type, quantity)
    puts "----- Supply Action -----"
    if @supplies[type] != nil && @supplies[type] > quantity
      puts "Using #{quantity} of #{type} from the supply hold."
      @supplies[type] -= quantity
    else
      puts "Supply Error: Insufficient #{type} in the supply hold."
    end
  end
 
  def report_supplies
    puts "----- Supply Report -----"
    if @supplies.keys.length > 0
      @supplies.each do |type, quantity|
        puts "#{type} avalilable: #{quantity} units"
      end
    else
      puts "Supply hold is empty."
    end
  end
end
 
class FuelTank
  attr_accessor :fuel
 
  def initialize
    @fuel = 0
  end
 
  def get_fuel_levels
    @fuel
  end
 
  def load_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Loading #{quantity} units of fuel in the tank."
    @fuel += quantity
  end
 
  def use_fuel(quantity)
    puts "----- Fuel Action -----"
    puts "Using #{quantity} units of fuel from the tank."
    @fuel -= quantity
  end
 
  def report_fuel
    puts "----- Fuel Report -----"
    puts "#{@fuel} units of fuel available."
  end
end
 
class Thrusters
  def initialize(fuel_tank)
    @linked_fuel_tank = fuel_tank
  end
 
  def activate_thrusters
    puts "----- Thruster Action -----"
    if @linked_fuel_tank.get_fuel_levels >= 10
      puts "Thrusting action successful."
      @linked_fuel_tank.use_fuel(10)
    else
      puts "Thruster Error: Insufficient fuel available."
    end
  end
end

බොහෝ වෙනස්කම් ඇත, වැඩසටහන දැන් වඩා හොඳ පෙනුමක් ඇත. දැන් අපගේ SpaceStation පන්තිය සංවේදක කට්ටලයක්, පරිභෝජන සැපයුම් පද්ධතියක්, ඉන්ධන ටැංකියක් සහ බූස්ටර ඇතුළුව යැපෙන කොටස් සඳහා මෙහෙයුම් ආරම්භ කරන බහාලුමක් බවට පත්ව ඇත.

ඕනෑම විචල්‍යයක් සඳහා දැන් අනුරූප පන්තියක් ඇත: සංවේදක; SupplyHold; තෙල් ටැංකිය; තෙරපුම්.

කේතයේ මෙම අනුවාදයේ වැදගත් වෙනස්කම් කිහිපයක් තිබේ. කාරණය නම්, පුද්ගල ශ්‍රිතයන් ඔවුන්ගේම පන්තිවල අන්තර්ගත කර තිබීම පමණක් නොව, ඒවා පුරෝකථනය කළ හැකි සහ ස්ථාවර බවට පත් වන ආකාරයට සංවිධානය කර තිබීමයි. අපි සමෝධානික මූලධර්මය අනුගමනය කිරීම සඳහා සමාන ක්‍රියාකාරීත්වයක් සහිත මූලද්‍රව්‍ය කාණ්ඩ කරමු. දැන්, අපට පද්ධතිය ක්‍රියා කරන ආකාරය වෙනස් කිරීමට අවශ්‍ය නම්, හැෂ් ව්‍යුහයක සිට අරාවකට මාරු වීමට, SupplyHold පන්තිය භාවිතා කරන්න; අපට වෙනත් මොඩියුල ස්පර්ශ කිරීමට අවශ්‍ය නැත. මේ ආකාරයෙන්, ලොජිස්ටික් නිලධාරියා ඔහුගේ කොටසේ යමක් වෙනස් කළහොත්, ඉතිරි ස්ථානය නොවෙනස්ව පවතිනු ඇත. මෙම අවස්ථාවෙහිදී, SpaceStation පන්තියේ වෙනස්කම් පවා නොදැනේ.

අභ්‍යවකාශ මධ්‍යස්ථානයේ සේවය කරන අපගේ නිලධාරීන්ට අවශ්‍ය අය ඉල්ලා සිටිය හැකි නිසා වෙනස්කම් ගැන සතුටු විය හැකිය. සප්ලිහෝල්ඩ් සහ ෆුල්ටැන්ක් පන්තිවල අඩංගු වාර්තා_සැපයුම් සහ වාර්තා_ඉන්ධන වැනි ක්‍රම කේතයෙහි ඇති බව සලකන්න. පෘථිවිය වාර්තා කරන ආකාරය වෙනස් කිරීමට ඉල්ලා සිටියහොත් කුමක් සිදුවේද? 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. ඔවුන් දෙදෙනා වාර්තාකරු පන්තියේ දරුවන්. ඊට අමතරව, අවශ්‍ය නම් අවශ්‍ය උප පංතිය ආරම්භ කිරීමට හැකි වන පරිදි අපි SpaceStation පන්තියට අවස්ථා විචල්‍ය එකතු කළෙමු. දැන්, පෘථිවිය වෙනත් දෙයක් වෙනස් කිරීමට තීරණය කරන්නේ නම්, අපි වෙනස්කම් සිදු කරන්නේ උප පංතිවලට මිස ප්‍රධාන පන්තියට නොවේ.

ඇත්ත වශයෙන්ම, අපගේ සමහර පන්ති තවමත් එකිනෙකා මත රඳා පවතී. මේ අනුව, SupplyReporter වස්තුව SupplyHold මත රඳා පවතින අතර FuelReporter FuelTank මත රඳා පවතී. ඇත්ත වශයෙන්ම, බූස්ටර ඉන්ධන ටැංකියට සම්බන්ධ කළ යුතුය. නමුත් මෙහි සෑම දෙයක්ම දැනටමත් තාර්කිකව පෙනෙන අතර, වෙනස්කම් සිදු කිරීම විශේෂයෙන් අපහසු නොවනු ඇත - එක් වස්තුවක කේතය සංස්කරණය කිරීම තවත් කෙනෙකුට බෙහෙවින් බලපාන්නේ නැත.

මේ අනුව, අපි එක් එක් වස්තු/පන්තියේ වගකීම් නිශ්චිතව නිර්වචනය කර ඇති මොඩියුලර් කේතයක් නිර්මාණය කර ඇත. එවැනි කේතයක් සමඟ වැඩ කිරීම ගැටළුවක් නොවේ, එය නඩත්තු කිරීම සරල කාර්යයක් වනු ඇත. අපි සම්පූර්ණ "දිව්යමය වස්තුව" SRP බවට පරිවර්තනය කර ඇත.

Skillbox නිර්දේශ කරයි:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න