5 esimerkkiä Rubyn parhaasta käytöstä
Oletko koskaan miettinyt, mitä voimme tehdä Rubylla? No, taivas on luultavasti rajana, mutta puhumme mielellämme muutamista enemmän tai vähemmän tunnetuista tapauksista....
Lue Ruby-asiantuntijamme artikkeli ja opi, miksi sinun ei tarvitse aina youse hash.
Kun haluamme koota jotakin, käytämme hyvin usein 1TP61Opeta_esineellä_opettaminen
tai laajentaa säännöllistä silmukka käyttämällä #kohteen kanssa
. Mutta useimmissa tapauksissa Ruby-kehittäjät käyttävät pelkkää hash-tietoa aggregaattorina, ja ehkä se on hyvä, mutta tässä artikkelissa haluan näyttää, että sen ei aina tarvitse olla hash-tieto.
Oletamme, että kaikki tiedostot on sijoitettu yhteen hakemistoon (ihmiset
).
Sanotaan, että meillä on seuraavat tiedot ihmiset/ihmiset.csv
file:
Etunimi,Sukunimi,Ikä
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Haluamme löytää rivien kokonaismäärän ja keski-ikä - voimme kirjoittaa seuraavan skriptin:
people/parser.rb
vaadi 'csv'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += row['Age'].toi
end
total = aggregated[:total]
averageage = aggregated[:totalage].to_f / total
puts "Total: #{total}"
puts "Keskimääräinen ikä: #{average_age}"
Ja kyllä, se tekee asian, mutta lukeminen tällainen koodi on epäilyttävä ilo. Se tuntuu liian alhaiselta tasolta. Voimme parantaa sitä tarjoamalla oman aggregaattorin silmukka.
people/age_aggregator.rb
luokka AgeAggregator
attrreader :total, :totalage
def initialize
@total = 0
@total_age = 0
end
def increment!
@total += 1
end
def incrementage!(ikä)
@totalage += ikä
end
def averageage
totalage.to_f / total
end
end
Silmukan ulkoasu on sitten seuraava:
people/parser.rb
vaadi '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 "Yhteensä: #{aggregated.total}"
puts "Keski-ikä: #{aggregated.average_age}"
Mielestäni se on paljon selkeämpi.
Olemme kirjoittaneet enemmän koodia, mutta alemman tason yksityiskohdat on siirretty erilliseen luokkaan. Nyt pääkomentosarjaa voi lukea paljon paremmin.
Voit tietysti väittää, että esimerkki on liian yksinkertainen, jotta sen korjaamiseen kannattaisi nähdä niin paljon vaivaa, mutta se on vain esimerkki ;). Jos sinun pitäisi aggregoida enemmän tietoja, tällaiset aggregaattoriobjektit ovat todella oikea tapa pelastaa.
Lue lisää:
Ruby-ohjelmistokehityksen hyvät ja huonot puolet