Décrire une transformation, au lieu de piloter une boucle.Describe a transformation, instead of driving a loop.
La fondation posée (un each débloque tout), voici le style qu'elle permet. Une boucle impérative dit comment : crée un accumulateur, parcours, teste, pousse, additionne. Une chaîne de transformations dit quoi : garde les payées, applique la TVA, fais la somme. Trois verbes couvrent l'essentiel — map transforme chaque élément (1 pour 1), select filtre (garde ou jette), reduce replie une collection en une seule valeur. Les chaîner, c'est écrire un pipeline qui se lit de gauche à droite comme une phrase, où chaque étape nomme son intention au lieu de la cacher dans la mécanique d'une boucle.With the foundation laid (one each unlocks everything), here's the style it enables. An imperative loop says how: create an accumulator, traverse, test, push, add. A chain of transformations says what: keep the paid ones, apply the tax, sum. Three verbs cover the essentials — map transforms each element (1 for 1), select filters (keep or drop), reduce folds a collection into a single value. Chaining them writes a pipeline that reads left to right like a sentence, where each step names its intent instead of hiding it in a loop's machinery.
# impératif : on accumule à la main, l'intention se devine totals = [] orders.each do |o| next unless o.paid? totals << o.amount * 1.2 end sum = 0 totals.each { |t| sum += t } # déclaratif : on DÉCRIT la transformation, l'intention se lit sum = orders.select(&:paid?) # garder les payées .map { |o| o.amount * 1.2 } # appliquer la TVA .sum # replier en un total
Chaque verbe a une forme reconnaissable : map conserve le nombre d'éléments, select le réduit, reduce l'écrase à une valeur. Lire une chaîne, c'est suivre ces formes — la donnée se transforme étape par étape, à vue.Each verb has a recognizable shape: map keeps the element count, select shrinks it, reduce collapses it to one value. Reading a chain is following these shapes — the data transforms step by step, in plain sight.
« Cette boucle accumule un résultat — quelle transformation décrit-elle ? » Si tu crées un tableau ou un total vide, que tu parcours et que tu pousses dedans, tu écris à la main un map, un select ou un reduce. Nomme-le : la chaîne dira l'intention que la boucle cachait."This loop accumulates a result — which transformation does it describe?" If you create an empty array or total, traverse, and push into it, you're hand-writing a map, a select or a reduce. Name it: the chain will state the intent the loop hid.
Une chaîne se lit, se relit et se modifie par étape : insérer un filtre, c'est ajouter un .select au bon endroit, sans toucher au reste. Une boucle impérative mêle parcours, condition et accumulation dans un même bloc — pour la changer, il faut tout relire. La transformation chaînée sépare les préoccupations que la boucle entremêle. C'est de la lisibilité, mais aussi de la modifiabilité.A chain reads, re-reads and changes step by step: inserting a filter means adding a .select at the right spot, untouched rest. An imperative loop mixes traversal, condition and accumulation in one block — to change it, you reread it all. The chained transformation separates the concerns the loop entangles. It's readability, but also modifiability.