5 eksempler på den bedste brug af Ruby
Har du nogensinde undret dig over, hvad vi kan gøre med Ruby? Det er nok kun fantasien, der sætter grænser, men vi fortæller gerne om nogle mere eller mindre kendte tilfælde...
Læs en artikel fra vores Ruby-ekspert og find ud af, hvorfor du ikke altid behøver at bruge hash.
Når vi vil samle nogle ting, bruger vi ofte 1TP61Undervis_med_objekt
eller udvide den almindelige Sløjfe ved hjælp af #med_objekt
. Men i de fleste tilfælde Ruby-udviklere bruger en almindelig hash som aggregator, og måske er det fint, men i denne artikel vil jeg gerne vise dig, at det ikke altid behøver at være en hash.
Vi antager, at alle filerne er placeret i en mappe (mennesker
).
Lad os sige, at vi har følgende mennesker/folk.csv
file:
Fornavn,Efternavn,Alder
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Vi vil gerne finde det samlede antal rækker og gennemsnitsalderen - vi kunne skrive følgende script:
people/parser.rb
kræver 'csv'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += række['Alder'].toi
end
total = aggregeret[:total]
gennemsnitsalder = aggregeret[:totalalder].to_f / total
puts "Total: #{total}"
puts "Gennemsnitsalder: #{gennemsnitsalder}"
Og ja, det gør det, men at læse sådan en Kode er en tvivlsom fornøjelse. Det føles som et for lavt niveau. Vi kan forbedre det ved at levere en dedikeret aggregator til Sløjfe.
people/age_aggregator.rb
klasse AgeAggregator
attrreader :total, :totalage
def initialiser
@total = 0
@total_age = 0
slut
def increment!
@total += 1
end
def incrementage!(alder)
@totalage += alder
end
def averageage
totalage.to_f / total
end
slut
Og så ville vores loop se ud som nedenfor:
people/parser.rb
kræver 'csv'
requirerelative './ageaggregator.rb'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.increment!
agg.incrementage!(række['Alder'].to_i)
slut
puts "Total: #{aggregated.total}"
puts "Gennemsnitsalder: #{aggregated.average_age}"
Jeg synes, det er meget tydeligere.
Vi har skrevet mere kode, men vores detaljer på lavere niveau er trukket ud til den separate klasse. Nu læses hovedscriptet meget bedre.
Man kan selvfølgelig argumentere for, at eksemplet er for simpelt til at bruge så mange kræfter på refaktorering, men hold nu op - det er jo bare et eksempel ;). Hvis du skulle samle flere data, er sådanne aggregator-objekter virkelig vejen frem.
Læs mere om det:
Fordele og ulemper ved Ruby-softwareudvikling