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.
β
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.