Zatrudnianie programistów wewnętrznych vs. zewnętrznych
Zatrudniać wewnętrznie czy zewnętrznie? To ostateczny dylemat! Poznaj zalety outsourcing lub budowania zespołu wewnętrznego w poniższym artykule.
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 Ruby deweloperzy 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 daj spokój - to tylko przykład ;). Gdyby trzeba było zagregować więcej daneTakie obiekty agregujące są naprawdę dobrym rozwiązaniem.

Czytaj więcej:
Plusy i minusy tworzenia oprogramowania w Ruby