5 exemples de la meilleure utilisation de Ruby
Vous êtes-vous déjà demandé ce que l'on pouvait faire avec Ruby ? Eh bien, le ciel est probablement la limite, mais nous sommes heureux de parler de quelques cas plus ou moins connus...
Lisez un article de notre expert Ruby et apprenez pourquoi vous n'avez pas besoin de toujours utiliser votre hash.
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.
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.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 = 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
fin
def increment !
@total += 1
end
def incrementage !(age)
@totalage += age
end
def averageage
totalage.to_f / total
end
end
Notre boucle se présente alors comme suit :
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 "Total : #{aggregated.total}"
puts "Âge moyen : #{aggregated.average_age}"
Je pense que c'est beaucoup plus clair.
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