9 Déc 2016

Retours sur un de nos dojo JS

Bonjour à tous,

L’autre jour, nous étions dix à nous réunir pour exécuter un kata.

kata_discountcampaign

L’objectif que nous nous étions fixé pour ce kata était la pratique de reduce et chain (via lodash)(ça vous rappelle quelquechose, non ? et oui, on a essayé de pratiquer ce dont nous parlions ici : chain et reduce-sont-sur-un-bateau. Concrètement l’unique contrainte que nous nous étions fixé était l’utilisation de _.chain ou du _.reduce.

Ce que je vous propose dans cet article est un petit retour sur dojo (si jamais vous voulez le faire à la maison) et des comparaisons avec lazy.js et ramda. En effet, nous avions choisi de reprendre le kata “The discount campaign” qui propose un exercice très bien adapté à la pratique de chain/reduce. La problématique de ce dojo est la suivante :

Le propriétaire d’un magasin de skateboard a besoin d’aide. En effet, dans l’objectif d’attirer plus d’étudiants et d’adolescents dans son magasin il souhaiterait lancer une campagne promotionnelle. Il voudrait offrir à une typologie de clients bien particulier un rabais en fonction du mois. Afin de l’aider, il vous fournit en entrée toutes les données qu’il faut pour définir la réduction à appliquer par mois.

Le propriétaire vous décrit les conditions pour sélectionner les clients dans sa base sont :

  1. Le client doit être student, pupil or apprentice (étudiant, élève ou apprenti),
  2. Il doit avoir 25 ans ou moins.

Il souhaiterait que les données de leurs commandes soient regroupés par mois et par année. Dans un premier temps, Il voudrait que vous vous concentriez sur l’année 2015

  1. Calcul de la dépense totale par mois de ces clients (De janvier à décembre 2015),
  2. La dépense totale à l’année.

Si vous voulez réaliser le kata voici un plus ample descriptif du kata ici : README

Bien sur, une implémentation avec des forEach est possible mais nous voulions vraiment sortir de cela. La majorité des participants sont partis sur une implémentation avec du _.chain ou du _.reduce (nous avons même eu un camarade qui a tenté une implémentation en ES6 full, bravo à lui !).

(Attention spoiler ci-dessous)

Pour informations, les données d’un client ressemble à :

L’ensemble du fichier de données est ici.

Pour l’implémentation, en mode _.chain (avec lodash), une des solutions peut être celle-ci :

Concrètement cet algorithme exécute les étapes suivantes :

  1. Conserver uniquement les utilisateurs répondant correctement aux contraintes de leur age et de leur job,
  2. Conserver uniquement les commandes des clients
  3. Conserver uniquement les commandes de 2015,
  4. Grouper les commandes par mois,
  5. Faire la somme par mois.

Personnellement, l’ensemble des participants ont estimé que l’écriture avec lodash était très lisible. Dans l’exemple ci-dessus, nous proposons d’écrire deux _.chain afin de bien distinguer les deux étapes de la problématique :

  1. Identifier les clients éligibles,
  2. Calculer le chiffre d’affaires 2015 par mois,

Si vous pensiez à écrire avec _.reduce la première partie de l’algorithme, voici une proposition :

Pour ceux qui se posent la question, l’équivalent en lazy.js pourrait être :

Vous retrouvez ainsi les mêmes étapes (et comme en plus nous avons utilisé la variable _ pour manipuler lazy.js la syntaxe “semble” identique. En exécution “unique” (sans faire de benchmark, le gap de performances promis ne nous a pas semble énorme, si l’un de vous se propose pour en faire un nous sommes preneurs :))

Et finalement en ramda :

Ici la syntaxe est différente même si nous retrouvons bien nos deux grandes étapes (identifier les clients, calculer les chiffres d’affaires mensuels). Comme nous pouvons le voir, ces trois syntaxes sont compréhensibles et ont une approche assez fonctionnels et nous permettent de se concentrer sur l’algorithme en tant que tel (idem pour nos tests). Ce que nous notons d’intéressant également, c’est que ces écritures sont très lisibles et maintenables.

Ce fut un kata très sympa à réaliser qui prend peu de temps (environ 1h) et est parfait pour vous entraîner sur ces méthodes chain/reduce. Nous vous le conseillons. En tous cas, nous nous sommes bien amusés.

 

Share