Contratação de programadores internos vs. externos
Contratar internamente ou externamente? É o derradeiro dilema! Descubra as vantagens da outsourcing ou da criação de uma equipa interna no artigo seguinte.
Leia um artigo do nosso especialista em Ruby e saiba porque é que não precisa de usar sempre o seu hash.
Quando queremos agregar algumas coisas, é muito frequente utilizarmos 1TP69Ensinar_com_objecto ou alargar o período normal de laço utilizando #com_objecto. Mas na maioria dos casos Rubi criadores estão a utilizar um hash simples como agregador e talvez não haja problema, mas neste artigo gostaria de mostrar que nem sempre tem de ser um hash.
Assumimos que todos os ficheiros são colocados num diretório (pessoas).
Digamos que temos o seguinte pessoas/pessoas.csv file:
Nome, Apelido, Idade
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Queremos encontrar o total de linhas e a idade média - poderíamos escrever o seguinte script:
pessoas/parser.rb
requerer 'csv'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += row['Age'].toi
fim
total = aggregated[:total]
averageage = aggregated[:totalage].to_f / total
coloca "Total: #{total}"
puts "Idade média: #{idade média}"
E sim, faz a coisa, mas ler uma código é um prazer duvidoso. Parece um nível demasiado baixo. Podemos melhorá-lo fornecendo um agregador dedicado para o laço.
people/age_aggregator.rb
classe AgeAggregator
attrreader :total, :totalage
def initialize
@total = 0
@total_idade = 0
fim
def incrementar!
@total += 1
fim
def incrementage!(idade)
@totalage += idade
fim
def averageage
totalage.to_f / total
fim
fim
E então o nosso loop ficaria como abaixo:
pessoas/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)
fim
puts "Total: #{agregado.total}"
puts "Idade média: #{agregado.idade_média}"
Penso que é muito mais claro.
Escrevemos mais código, mas os nossos detalhes de nível inferior são extraídos para a classe separada. Agora o guião principal lê-se muito melhor.
É claro que se pode argumentar que o exemplo é demasiado simples para se fazer tanto esforço na refacção, mas vá lá - é apenas um exemplo ;). Se tivesses de agregar mais dados, esses objectos agregadores são realmente o caminho a seguir.

Ler mais:
Prós e contras do desenvolvimento de software Ruby