5 przykładów najlepszego wykorzystania Rubiego
Czy kiedykolwiek zastanawiałeś się, co możemy zrobić z Ruby? Cóż, niebo jest prawdopodobnie granicą, ale chętnie porozmawiamy o kilku mniej lub bardziej znanych przypadkach...
Przeczytaj artykuł naszego eksperta Ruby i dowiedz się, dlaczego nie musisz zawsze używać tego hasha.
Kiedy chcemy zagregować jakieś rzeczy, bardzo często używamy #each_with_object
lub rozszerzyć regularne pętla przy użyciu #with_object
. Ale w większości przypadków Programiści Ruby używają zwykłego hasha jako agregatora i być może jest to w porządku, ale w tym artykule chciałbym pokazać, że nie zawsze musi to być hash.
Zakładamy, że wszystkie pliki są umieszczone w jednym katalogu (ludzie
).
Załóżmy, że mamy następujące dane people/people.csv
file:
Imię, Nazwisko, Wiek
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Chcemy znaleźć sumę wierszy i średni wiek - możemy napisać następujący skrypt:
people/parser.rb
require '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 "Łącznie: #{łącznie}"
puts "Średni wiek: #{średni_wiek}"
I tak, robi to, ale czytanie takiego kod to wątpliwa przyjemność. To zbyt niski poziom. Możemy to poprawić, dostarczając dedykowany agregator dla pętla.
people/age_aggregator.rb
class AgeAggregator
attrreader :total, :totalage
def initialize
@total = 0
@total_age = 0
end
def increment!
@total += 1
end
def incrementage!(age)
@totalage += age
end
def averageage
totalage.to_f / total
end
end
Wtedy nasza pętla wyglądałaby jak poniżej:
people/parser.rb
require '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 "Łącznie: #{aggregated.total}"
puts "Średni wiek: #{aggregated.average_age}"
Myślę, że jest to o wiele jaśniejsze.
Napisaliśmy więcej kodu, ale nasze szczegóły niższego poziomu zostały wyodrębnione do osobnej klasy. Teraz główny skrypt czyta się znacznie lepiej.
Oczywiście można argumentować, że przykład jest zbyt prosty, aby wkładać tyle wysiłku w refaktoryzację, ale c'mon - to tylko przykład ;). Gdybyś potrzebował zagregować więcej danych, takie obiekty agregujące są naprawdę ratunkiem.
Czytaj więcej:
Plusy i minusy tworzenia oprogramowania w Ruby