5 esempi di utilizzo ottimale di Ruby
Vi siete mai chiesti cosa possiamo fare con Ruby? Beh, il cielo è probabilmente il limite, ma siamo felici di parlare di alcuni casi più o meno noti...
Leggete l'articolo del nostro esperto di Ruby e scoprite perché non è necessario avere sempre questi hashish.
Quando si vuole aggregare qualcosa, molto spesso si usa il metodo 1TP63Insegnare_con_oggetto
o estendere il regolare anello utilizzando #con_oggetto
. Ma nella maggior parte dei casi Sviluppatori Ruby si usa un semplice hash come aggregatore e forse va bene, ma in questo articolo vorrei mostrarvi che non sempre deve essere un hash.
Si presume che tutti i file siano collocati in una directory (persone
).
Supponiamo di avere quanto segue persone/persone.csv
file:
Nome, Cognome, Età
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrea,Moore,54
Se vogliamo trovare il totale delle righe e l'età media, possiamo scrivere il seguente script:
people/parser.rb
richiedere 'csv'
aggregato = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += riga['Età'].toi
fine
totale = aggregato[:totale]
averageage = aggregated[:totalage].to_f / total
mette "Totale: #{totale}"
puts "Età media: #{età_media}"
E sì, fa il suo dovere, ma la lettura di tale codice è un piacere dubbio. Sembra un livello troppo basso. Possiamo migliorarlo fornendo un aggregatore dedicato per il anello.
people/age_aggregator.rb
classe AgeAggregator
attrreader :total, :totalage
def initialize
@totale = 0
@età_totale = 0
fine
def incremento!
@totale += 1
fine
def incremento!(età)
@totale += età
fine
def averageage
totalage.to_f / totale
fine
fine
Il nostro ciclo sarà quindi come quello che segue:
people/parser.rb
richiedere 'csv'
requirerelative './ageaggregator.rb'
aggregato = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.increment!
agg.incrementage!(row['Age'].to_i)
fine
mette "Totale: #{aggregato.totale}".
puts "Età media: #{età_media_aggregata}"
Penso che sia molto più chiaro.
Abbiamo scritto più codice, ma i dettagli di livello inferiore sono stati estratti in una classe separata. Ora lo script principale si legge molto meglio.
Certo, si può obiettare che l'esempio è troppo semplice per impegnarsi così tanto nella rifattorizzazione, ma suvvia, è solo un esempio ;). Se si dovessero aggregare più dati, questi oggetti aggregatori sono davvero la via di salvezza.
Per saperne di più:
Pro e contro dello sviluppo software in Ruby