5 eksempler på hvordan Ruby kan brukes på best mulig måte
Har du noen gang lurt på hva vi kan gjøre med Ruby? Det er nok ingen grenser, men vi snakker gjerne om noen mer eller mindre kjente tilfeller...
Les en artikkel fra vår Ruby-ekspert og lær hvorfor du ikke alltid trenger å bruke hasj.
Når vi ønsker å samle noen ting, bruker vi ofte 1TP61Lære_med_objekt
eller utvide den vanlige sløyfe ved hjelp av #med_objekt
. Men i de fleste tilfeller Ruby-utviklere bruker en vanlig hash som aggregator, og kanskje er det greit, men i denne artikkelen vil jeg vise deg at det ikke alltid trenger å være en hash.
Vi antar at alle filene er plassert i én katalog (mennesker
).
La oss si at vi har følgende people/people.csv
file:
Fornavn,Etternavn,Alder
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Hvis vi ønsker å finne det totale antallet rader og gjennomsnittsalderen, kan vi skrive følgende skript:
people/parser.rb
krever 'csv'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += rad['Alder'].toi
end
total = aggregert[:total]
gjennomsnittsalder = aggregert[:totalalder].to_f / total
puts "Total: #{total}"
puts "Gjennomsnittsalder: #{gjennomsnittsalder}"
Og ja, det gjør det, men å lese en slik kode er en tvilsom glede. Det føles som et for lavt nivå. Vi kan forbedre det ved å tilby en dedikert aggregator for sløyfe.
people/age_aggregator.rb
klasse AgeAggregator
attrreader :total, :totalage
def initialize
@total = 0
@total_age = 0
end
def increment!
@total += 1
end
def incrementage!(alder)
@totalage += alder
end
def averageage
totalage.to_f / total
end
end
Og da vil løkken vår se ut som nedenfor:
people/parser.rb
krever 'csv'
requirerelative './ageaggregator.rb'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.inkrement!
agg.incrementage!(rad['Alder'].to_i)
end
puts "Total: #{aggregated.total}"
puts "Gjennomsnittsalder: #{aggregated.average_age}"
Jeg synes det er mye tydeligere.
Vi har skrevet mer kode, men detaljene på lavere nivå er hentet ut til den separate klassen. Nå leser hovedskriptet mye bedre.
Du kan selvfølgelig hevde at eksempelet er for enkelt til å legge så mye arbeid i refaktorering, men kom igjen - det er bare et eksempel ;). Hvis du måtte aggregere mer data, er slike aggregatorobjekter virkelig veien å redde.
Les mer om dette:
Fordeler og ulemper med Ruby-programvareutvikling