Vidaus ir išorės programuotojų samdymas
Ar samdote darbuotojus iš vidaus, ar iš išorės? Tai didžiausia dilema! Sužinokite outsourcing ar vidinės komandos kūrimo privalumus šiame straipsnyje.
Perskaitykite mūsų "Ruby" eksperto straipsnį ir sužinokite, kodėl jums nereikia visada naudoti "youse hash".
Kai norime sujungti tam tikrus dalykus, labai dažnai naudojame 1TP69Mokymas_su_objektu arba išplėsti įprastą kilpa naudojant #with_object. Tačiau daugeliu atvejų Ruby kūrėjai kaip agregatorių naudojate paprastą hash ir galbūt tai yra gerai, tačiau šiame straipsnyje norėčiau parodyti, kad tai ne visada turi būti hash.
Darome prielaidą, kad visi failai yra viename kataloge (žmonės).
Tarkime, kad turime šiuos duomenis people/people.csv file:
Vardas,Pavardė,Amžius
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Norime rasti bendrą eilučių skaičių ir vidutinį amžių - galėtume parašyti tokį scenarijų:
people/parser.rb
require 'csv'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += row['Age'].toi
pabaiga
total = aggregated[:total]
averageage = aggregated[:totalage].to_f / total
puts "Iš viso: #{iš viso}"
puts "Vidutinis amžius: #{vidutinis amžius}"
Ir taip, jis daro šį dalyką, bet skaityti tokį kodas yra abejotinas malonumas. Jis jaučiasi per žemo lygio. Galime jį patobulinti pateikdami specialų agregatorių kilpa.
people/age_aggregator.rb
klasė AgeAggregator
attrreader :total, :totalage
def initialize
@total = 0
@total_age = 0
end
def increment!
@total += 1
end
def incrementage!(age)
@totalage += age
end
def averageage
totalage.to_f / total
end
end
Tada mūsų ciklas atrodytų taip:
people/parser.rb
require 'csv'
requirerelative './ageaggregator.rb'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.increment!
agg.incrementage!(row['Age'].to_i)
end
puts "Iš viso: #{aggregated.total}"
puts "Vidutinis amžius: #{aggregated.average_age}"
Manau, kad tai daug aiškiau.
Parašėme daugiau kodo, tačiau žemesnio lygio detalės perkeltos į atskirą klasę. Dabar pagrindinis scenarijus skaitomas daug geriau.
Žinoma, galite teigti, kad pavyzdys yra pernelyg paprastas, kad būtų galima dėti tiek pastangų jį pertvarkyti, bet juk tai tik pavyzdys ;). Jei turėtumėte surinkti daugiau duomenys, tokie agreguojantys objektai iš tikrųjų yra gelbėjimosi būdas.

Skaityti daugiau:
"Ruby" programinės įrangos kūrimo privalumai ir trūkumai