Lisez un article de notre expert Ruby et apprenez pourquoi vous n'avez pas besoin de toujours utiliser votre hash.
Introduction Lorsque nous voulons agréger certaines choses, nous utilisons très souvent 1TP61Enseigner avec un objet
ou de prolonger la durée régulière de la boucle en utilisant #avec_objet
. Mais dans la plupart des cas Développeurs Ruby utilisent un simple hash comme agrégateur et c'est peut-être bien, mais dans cet article, j'aimerais vous montrer qu'il n'est pas toujours nécessaire d'utiliser un hash.
Cas Nous supposons que tous les fichiers sont placés dans un seul répertoire (les personnes
).
Supposons que nous ayons les éléments suivants personnes/people.csv
file:
Prénom, Nom, Âge
John,Doe,24
Jane, Dee, 45 ans
Josh, Bee, 55 ans
Andrea, Boya, 34 ans
Andrew,Moore,54
Nous voulons trouver le nombre total de lignes et l'âge moyen - nous pourrions écrire le script suivant :
people/ parser. rbrequire 'csv' aggregated= CSV . foreach( 'people.csv' , headers: true )
. withobject( { total: 0 , totalage: 0 } ) do | row, agg| agg[ :total ] += 1 agg[ :totalage ] += row[ 'Age' ] . toiend total= agrégé[ :total ] averageage= aggregated[ :totalage ] . to_f/ total
puts"Total : #{ total } " puts"Âge moyen : #{ moyen_âge } "
Et oui, il le fait, mais la lecture d'une telle code est un plaisir douteux. On a l'impression d'être à un niveau trop bas. Nous pouvons l'améliorer en fournissant un agrégateur dédié pour les boucle .
people/ age_aggregator. rb
classe AgeAggregator
attrreader:total , :totalage
def initialize
@total = 0
@total_age = 0 findef increment !
@total += 1
end
def incrementage ! ( age)
@totalage += ageend
def averageage totalage. to_f/ totalend
end
Notre boucle se présente alors comme suit :
people/ parser. rbrequire '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"Total : #{ aggregated. total } " puts"Âge moyen : #{ aggregated. average_age } "
Je pense que c'est beaucoup plus clair.
Résumé Nous avons écrit plus de code, mais nos détails de bas niveau sont extraits dans une classe distincte. Le script principal se lit désormais beaucoup mieux.
Bien sûr, vous pouvez argumenter que l'exemple est trop simple pour mettre autant d'effort dans le refactoring, mais allez, ce n'est qu'un exemple ;). Si vous deviez agréger plus de données, de tels objets agrégateurs sont vraiment la solution.
En savoir plus :
Avantages et inconvénients du développement de logiciels en Rubis
Rails et autres moyens de transport
Développement Rails avec TMUX, Vim, Fzf + Ripgrep