Scribens flexibile codice utens SOLIDUM

Scribens flexibile codice utens SOLIDUM

Ex interpres: editis tibi articulus Severini Perez de principiis solidis utendi in programmando. Informationes ex articulo utile erit tam incipientibus quam peritis programmatibus.

Si in progressionem es, verisimillimum audisti principia solidorum. programmator possunt scribere mundum, bene structum et codicem facile sustineri. Notatu dignum est in programmando plures esse aditus quomodo officium particulare recte exerceatur. Diversi speciales notiones et intellectus "rectae semitae" diversas habent, totum pendet ab uniuscuiusque experientia. Attamen ideae in SOLIDUM nuntiatae ab omnibus fere repraesentativis communitatis IT accipiuntur. Facti sunt initium cessum et evolutionis multorum bonorum evolutionis administrationis exercitiorum.

Intelligamus quid sint principia solida et quomodo nos adiuvent.

Skillbox commendat: Cursus practicus "Mobile Developer PRO".

admonemus; omnibus legentibus "Habr" - discount 10 rublorum cum scribendo in quavis Skillbox utens "Habr" codice promotivo.

Quid est SOLIDUM?

Hic dictio est abbreviatio, quaelibet littera vocabuli est principium nominis cuiusdam principii;

Unius Officii Principii

β€Š
Unius Responsibilitas Principii (SRP) affirmat unumquemque genus vel modulum in programmatis esse responsabilem unam tantum partem functionis illius programmatis. Accedit quod huius officii elementa suo classi tribuenda sunt potius quam per classes alienas dispersa. SRP elit ac princeps evangelista, Robert S. Martin, rationem reddendi rationi mutandi describit. Hoc vocabulum primum ut unum ex elementis operis sui "Principia Design Object-Oriented" proposuit. Notio multum incorporat nexus exemplaris, qui antea a Tom DeMarco definitus erat.

Notio etiam nonnullas notiones a Davide Parnas enuntiatas comprehendit. Duae praecipuae sunt encapsulation et notitiae occultationis. Parnas disseruit systema dividere in modulos separatos non debere in analysi schedularum schedularum vel exsecutionis profluenti fundari. Quilibet modulorum certam solutionem continere debet quae minimum informationis clientibus praebet.

Obiter, Martin exemplum interesting dedit cum senioribus moderatoribus societatis (COO, CTO, CFO), quorum uterque programmatis specificis utitur ad diversos usus. Quam ob rem, quaelibet eorum mutationum in programmate efficere potest sine commodis aliorum curatorum.

Divinum objectum

Ut semper, optime SRP discere est in actu videre. Intueamur sectionem programmatis quae non sequitur Principium Unicum Responsabilitas. Hic est Ruby codicem qui mores et attributa spatii stationis describit.

Exempla recense et sequentia determinare conantur:
Officia earum rerum, quae in genere SpaceStation declarantur.
Qui sit amet operationem stationis spatii.

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

Profecto nostra statio spatii dysfunctionalis est (non puto me vocatum a NASA quolibet tempore comparare), sed aliquid hic resolvere est.

Ita genus SpaceStation varia officia varia habet (vel munia). Quae omnia in genera dividi possunt;

  • sensoriis;
  • commeatus (consumables);
  • cibus;
  • acceleratores.

Etiamsi nemo ex statione ministrorum classis attribuitur, facile possumus opinari quisnam sit idoneus. Verisimile est, physicus sensores moderatur, logisticus responsabilis est ad facultates suppeditandas, machinator cibus commeatuum est, et gubernator gubernatores moderatur.

Possumus dicere hanc programma SRP non obsequentem? Ita. Sed genus SpaceStation typicum est "obiectum deus" qui omnia novit et omnia facit. Hoc maius est anti-specimen in programmatione obiecti ordinatum. Talia enim a principio difficillima sunt ad conservandum. Hactenus programma est valde simplex, immo, sed cogita quid futurum sit si novas notas addimus. Fortassis nostra statio spatii medicorum statio vel cubiculi conventu opus erit. Et quo magis functiones sunt, eo magis crescet SpaceStation. Bene, quia haec facilitas aliis coniungetur, totum incomplexum operando etiam magis implicatum fiet. Unde operationem perturbare possumus, verbi gratia, acceleratores. Si indagator petit mutationes sensoriis, hoc optime afficit systemata communicationum stationis.

Violatio SRP principium victoriae imperatoriae breve tempus dare potest, sed in fine "bellum amittimus", et difficillimum erit tale monstrum in futuro conservare. Melius est propositum dividere in singulas partes codicis, quarum unaquaeque est propriae operationi perficiendae. Hoc intellegens, classium SpaceStationum inmutemus.

Sit scriptor responsabilitate distribuere

Supra quattuor genera operationum definivimus quae classis SpaceStation moderatur. ea mente observabimus cum emendandi. Code updated melius congruit 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

Illic es multus mutationes, progressio certus magis nunc spectat. Nunc genus nostrum SpaceStation plus continentis factum est in quo operationes partium dependentium initiantur, inclusa sensoriis copia, ratio copia consumabilis, piscina cibus et cursus.

Pro quavis variabilium genere nunc correspondente: Sensores; SupplyHold; Fuel tank; Thrusters.

Plures momenti sunt in hac versione codicis mutationes. Punctum est quod singulae functiones non solum in suis ordinibus encapsantur, sed ita ordinantur ut praedictio et constanti fiant. Nos elementis gregibus similes functionality sequi principium cohaerentiae. Nunc, si opus est mutare viam operum systematis, ex densa structura in aciem moventes, modo SupplyHold classis utimur, alios modulos tangere non debemus. Hoc modo, si logistics praefectus aliquid in sectione mutaverit, reliqua statio integra manebit. Hoc in casu, classis SpaceStation ne conscius quidem erit mutationum.

Praefecti nostri in statione spatii laborantes fortasse laeti circa mutationes sunt, quia petere possunt quae indigent. Animadverto codicem modos habere ut nuntia_supplies et report_fuel contenta in classibus SupplyHold et FuelTank. Quid si Terra quaesivit mutare viam refert? Utrumque genus, SupplyHold et FuelTank, mutari necesse est. Quid, si opus est ut cibus et consummabiles vias mutent, liberantur? Probabiliter omnia eadem genera iterum mutare debebis. Et haec iam est violatio SRP principii. Hoc figamus.

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.

In hac novissima programmatis versione officia in duas classes novas divisae sunt, FuelReporter et SupplyReporter. Ambo sunt filii Notarii classis. Praeterea instantias variabiles classi SpaceStation adiecimus ut genus desideratum initialized fieri possit, si opus sit. Nunc si Terra aliud mutare voluerit, classium mutabimus, non genus principale.

Sane quaedam ex nostris generibus adhuc ab invicem pendent. Sic, obiectum SupplyReporter pendet a SupplyHold, et FuelReporter a FuelTank pendet. Utique, cursus in lacus esca sit necti. Sed hic omnia iam logica spectant, ac mutationes non admodum difficiles erunt β€” unius rei codicem recensere non magnopere afficit.

Sic modulum codicem creavimus ubi officia cuiusque obiecti/classum definita sunt. Tali codice operari non obstat, affirmans negotium simplex erit. Totam "obiectum divinum" in SRP convertimus.

Skillbox commendat:

Source: www.habr.com