5 voorbeelden van het beste gebruik van Ruby
Heb je je ooit afgevraagd wat we met Ruby kunnen doen? Nou, de sky is waarschijnlijk de limit, maar we praten graag over een aantal min of meer bekende gevallen...
Lees een artikel van onze Ruby Expert en leer waarom je deze hash niet altijd hoeft te gebruiken.
Als we iets willen samenvoegen, gebruiken we vaak 1TP63Onderwijzen_met_voorwerp
of de reguliere lus met #met_voorwerp
. Maar in de meeste gevallen Ruby ontwikkelaars gebruiken een gewone hash als aggregator en misschien is dat prima, maar in dit artikel wil ik je laten zien dat het niet altijd een hash hoeft te zijn.
We nemen aan dat alle bestanden in één map staan (mensen
).
Laten we zeggen dat we het volgende hebben mensen/mensen.csv
file:
Voornaam,Achternaam,Leeftijd
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
We willen het totaal aantal rijen en de gemiddelde leeftijd vinden - we zouden het volgende script kunnen schrijven:
mensen/parser.rb
vereist 'csv'.
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({totaal: 0, totaal: 0 }) do |row, agg|
agg[:totaal] += 1
agg[:totalage] += rij['Leeftijd'].toi
einde
totaal = geaggregeerd[:totaal]
gemiddelde leeftijd = agg[:totalage].to_f / totaal
puts "Totaal: #{totaal}"
puts "Gemiddelde leeftijd: #{gemiddelde_leeftijd}"
En ja, het doet het ding, maar het lezen van zo'n code is een twijfelachtig plezier. Het voelt als een te laag niveau. We kunnen het verbeteren door een speciale aggregator voor de lus.
mensen/leeftijd_aggregator.rb
klasse Leeftijdsaggregator
lezer :totaal, :totale leeftijd
def initialiseren
@totaal = 0
@totaal_leeftijd = 0
einde
def increment!
@totaal += 1
einde
def increment!(age)
@totaal += leeftijd
einde
def gemiddelde
totaal.tot_f / totaal
einde
einde
En dan zou onze lus er als volgt uitzien:
mensen/parser.rb
vereist 'csv
requirerative './leeftijdaggregator.rb'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.increment!
agg.incrementage!(rij['Leeftijd'].to_i)
einde
puts "Totaal: #{geaggregeerd.totaal}"
puts "Gemiddelde leeftijd: #{aggregated.average_age}"
Ik denk dat het veel duidelijker is.
We hebben meer code geschreven, maar onze details op lager niveau zijn in een aparte klasse ondergebracht. Nu leest het hoofdscript veel beter.
Natuurlijk kun je aanvoeren dat het voorbeeld te simpel is om zoveel moeite te steken in het refactoren, maar kom op - het is maar een voorbeeld ;). Als je meer gegevens moet aggregeren, zijn zulke aggregatorobjecten echt de manier om te redden.
Lees meer:
Voor- en nadelen van Ruby softwareontwikkeling