<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gilles Gauthier</title>
    <description>The latest articles on DEV Community by Gilles Gauthier (@spike31).</description>
    <link>https://dev.to/spike31</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F377739%2F650ad578-e540-470f-95c3-de5c415402f4.png</url>
      <title>DEV Community: Gilles Gauthier</title>
      <link>https://dev.to/spike31</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spike31"/>
    <language>en</language>
    <item>
      <title>Transparence (1/1) - Organiser ses calculs </title>
      <dc:creator>Gilles Gauthier</dc:creator>
      <pubDate>Sat, 07 Nov 2020 14:20:43 +0000</pubDate>
      <link>https://dev.to/spike31/transparence-1-1-organiser-ses-calculs-1he</link>
      <guid>https://dev.to/spike31/transparence-1-1-organiser-ses-calculs-1he</guid>
      <description>&lt;p&gt;Etre transparent sur son travail ça n'est pas toujours simple et possible. Pour des questions évidentes de confidentialité.&lt;/p&gt;

&lt;p&gt;On peut néanmoins en extraire des morceaux à partager.&lt;/p&gt;

&lt;p&gt;Récemment j'ai eu à travailler sur un projet dans le domaine de l'agriculture, où le besoin était de fournir une interface pour saisir des données et afficher des calculs. &lt;/p&gt;

&lt;p&gt;Le soucis que l’on a rencontré, c'est que les calculs il y en avait beaucoup, pas très simple et pour ceux qui n'y connaissent rien, assez compliqué à vérifier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En effet comment savoir que tel résultat est juste si on a aucune idée de ce qu'on doit obtenir ? Surtout où les données sont des pourcentages, des nombres à virgules...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demander de l'aide à l'expert du domaine
&lt;/h2&gt;

&lt;p&gt;Ce que j'ai fais en premier lieu, c'est demander à "l'expert" du domaine chez le client de nous remplir un fichier yaml sous un format précis.&lt;/p&gt;

&lt;p&gt;Je lui demandais de me donner le nom du calcul, les valeurs en entrées et le résultat attendu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;calculs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;calcul_A&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;given&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;param_1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.2&lt;/span&gt;
      &lt;span class="na"&gt;param_2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.01&lt;/span&gt;
      &lt;span class="na"&gt;param_3&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ainsi on a pu tester automatiquement énormément de calculs, et s'il nous soumettait un nouveau fichier yaml, on pouvait le valider rapidement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implémenter les calculs
&lt;/h2&gt;

&lt;p&gt;Je me suis demandé comment organiser le code pour tous ses calculs.&lt;/p&gt;

&lt;p&gt;Mon architecture est basée sur le modèle hexagonale, et sur une philosophie DDD. J'ai donc un Dossier AgricultureContext (j'invente un nom pour l'article), et je ne voulais pas que les calculs fassent partie de ce contexte.&lt;/p&gt;

&lt;p&gt;Pourquoi ? et bien les calculs, c'est toute une connaissance à part entière à gérer, qui peut être indépendante du reste du projet. Je me suis dis, peut-être que je devrai penser comme si les calculs venaient d'ailleurs, comme une API externe.&lt;/p&gt;

&lt;p&gt;Du coup j'ai pensé, pourquoi ne pas faire un autre contexte dédié aux calculs. Au final tout ce qu'on veut c'est que pour des données en entrées, on souhaite obtenir un résultat. &lt;/p&gt;

&lt;p&gt;Dans ce contexte, on retrouvera des éléments commun en terme de nommage &lt;em&gt;(en DDD on parle tous le même language, mais selon les contextes on en fait pas la même chose)&lt;/em&gt;, mais le but de ce contexte, c'est d'effectuer des calculs et de savoir comment les faire. &lt;/p&gt;

&lt;p&gt;Je suis un fervent défenseur de "la responsabilité unique". Une classe ne doit faire qu'une seule chose et bien. On peut étendre ce concept à un niveau plus général, c'est pourquoi j'ai voulu sortir les calculs du contexte Agriculture. &lt;/p&gt;

&lt;p&gt;Ainsi on peut faire évoluer le code dans le CalculContext sans aucun impact sur le reste. On pourrait même un jour faire un autre projet séparé, reprenant le code du CalculContext, et pourquoi pas à la place de partager une interface dans un monoprojet, de passer par une API.&lt;/p&gt;

&lt;p&gt;En tout cas c'est la voie que j'ai choisi. Avec le recul, est-ce que j'aurai pu mettre tous les calculs dans le même contexte ? J'y ai pensé, mais à faire ça, je sais que j'aurai eu un code très couplé avec le domaine et moins simple à tester.&lt;/p&gt;

&lt;p&gt;Donc pour faire le lien entre les deux contextes, j'autorise un service à être appelé dans le contexte Agriculture. Pour cela j'utilise le concept "d'anti-corruption layer". C'est à dire transformer le model d'un domaine vers un autre. Par exemple traduire une classe vers une autre, du json vers une classe, ou une classe vers du xml etc. Le but étant de ne pas manipuler les données d'un autre domaine sans l'avoir transformé pour son propre domaine auparavant. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si je n'avais pas fais ça, je me serai retrouvé à manipuler des classes d'un autre domaine (un autre namespace), ce qui viendrait à coupler notre code très fortement et casser les barrières de nos contextes. Ne faites pas cela.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Concernant les calculs en eux mêmes, j’ai choisi de créer une classe par calcul, avec en paramètres un tableau de données, avec validation des noms et du type attendu.&lt;/p&gt;

&lt;p&gt;Et voilà, on arrive à la fin de cette petite transparence de code. &lt;/p&gt;

&lt;p&gt;J'essaierai d'en écrire d'autre, j'ai plein de sujet en tête.&lt;/p&gt;

</description>
      <category>ddd</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Pourquoi je n'aime plus trop faire du angular ?</title>
      <dc:creator>Gilles Gauthier</dc:creator>
      <pubDate>Tue, 22 Sep 2020 12:36:51 +0000</pubDate>
      <link>https://dev.to/spike31/pourquoi-je-n-aime-plus-trop-faire-du-angular-27n5</link>
      <guid>https://dev.to/spike31/pourquoi-je-n-aime-plus-trop-faire-du-angular-27n5</guid>
      <description>&lt;p&gt;J'ai beaucoup fais de javascript, de toute sorte. Vanilla, jquery, react, angular, vue, mootools...&lt;/p&gt;

&lt;p&gt;Faire du javascript c'est rarement expliqué et comprit par le client, lui tout ce qu'il veut c'est que son bouton bleu envoie un mail et affiche une notification verte.&lt;/p&gt;

&lt;p&gt;Ok ! traduisons ça en langue de développeur :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;j'ai un bouton bleu&lt;/li&gt;
&lt;li&gt;au clic, faire un appel ajax&lt;/li&gt;
&lt;li&gt;à la réponse, si tout va bien, afficher une notification verte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ok ça va ! c'est simple !&lt;/p&gt;

&lt;p&gt;J'ai fais d'autres projets plus complexe, dont un qui m'a épuisé mentalement et quasi dégouté de faire des applis angular. Surtout pour éviter à devoir gérer tous les problèmes que ça implique.&lt;/p&gt;

&lt;p&gt;C'était une appli pour gérer des voyages. Il fallait définir le pays, les lieux, en passant par la réservation d'hôtel, les tarifs, la location de véhicules, les visites groupées etc.&lt;/p&gt;

&lt;p&gt;En soit, dit comme ça, le genre de projet très intéressant à faire !&lt;/p&gt;

&lt;p&gt;En vrai, on a vu qu'on ne pourrait pas faire des pages php et des formulaires statiques. Il nous fallait du dynamique, de la réactivité, croiser les informations entre elles et afficher le tout...&lt;/p&gt;

&lt;p&gt;Coup de bol, on avait eu droit à une formation angular et typescript peu de temps avant, et j'avais très envie d'en refaire.&lt;/p&gt;

&lt;p&gt;Heureusement je ne m'occupais que de la partie angular et pas du code métier/api. &lt;/p&gt;

&lt;h1&gt;
  
  
  Organiser un voyage, comment ça se passe en coulisse ?
&lt;/h1&gt;

&lt;p&gt;Il faut un jour d'arrivée et un jour de départ. C'est des personnes, adultes ou enfants. Un pays, un lieu et des activités.&lt;/p&gt;

&lt;p&gt;Le client voulait une interface pour construire les étapes du voyage :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sur la gauche de l'écran, une liste verticale composée de journée&lt;/li&gt;
&lt;li&gt;sur la droite, une liste de produits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un produit c'était n'importe quoi, par exemple un safari en jeep, une balade sur le lac, une voiture de location etc.&lt;/p&gt;

&lt;p&gt;Les journées pouvaient être drag&amp;amp;n drop comme on le voulait, en effet on pouvait décider d'inverser des produits par exemple. Ou bien décider de partir une semaine plus tard..&lt;/p&gt;

&lt;p&gt;Certains produits étaient sur plusieurs jours, par exemple une sortie en mer pour faire le tour d'une île en 3 jours. Difficile d'inverser ces journées, il fallait les grouper.&lt;/p&gt;

&lt;p&gt;Sur chaque journée, on pouvait cliquer et afficher un formulaire pour modifier encore des données. Celui-ci s'affichait dans une fenêtre qui venait de la droite, et on pouvait en superposer à l'infini (vu que tout est en asynchrone, si on voulait créer une donnée non disponible, il fallait garder néanmoins le contexte où on était).&lt;/p&gt;

&lt;p&gt;Petite anecdote : je m'étais inspiré de google tag manager pour ceux qui connaissent, ça marchait bien et j'étais assez fier du résultat. J'étais même allé voir le javascript utilisé sur leur site...tiens tiens, du angular1. Oh tiens le code source non minifié. Bravo les gars ! Bon j'avais regardé comment ils avaient pensé la chose et je m'en suis sorti en angular2. Pas très professionnel de la part de Google.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les produits, tout et n'importe quoi !
&lt;/h2&gt;

&lt;p&gt;La création des produits étaient très complexe. On pouvait louer des voitures, mais pour ça il fallait un fournisseur, et définir les prix par saison et par année.&lt;/p&gt;

&lt;p&gt;Une sortie en mer, il fallait définir le prix, par groupe souvent, l'heure de départ et d'arrivée...&lt;/p&gt;

&lt;p&gt;Un aspect complexe et non détaillé par le client, c'était la description des produits. En effet il fallait une description côté commerciale, une description côté devis et une description complète avec souvent des photos pour donner à la fin, une sorte de gros PDF qui ajoute un "+" à la satisfaction du client.&lt;/p&gt;

&lt;p&gt;Je vous laisse imaginer les interfaces avec les formulaires.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les hôtels
&lt;/h2&gt;

&lt;p&gt;Les hôtels...j'ai appris beaucoup de chose, mais le calcul des prix des hôtels ça peut faire mal à la tête.&lt;/p&gt;

&lt;p&gt;Il y avait aussi la génération des vouchers. Quand vous réservez un hôtel, on vous donne des vouchers, avec le nom des personnes, date d'arrivée et départ et des informations sur l'hôtel...bref ! (à générer en pdf pour les imprimer)&lt;/p&gt;

&lt;p&gt;Il faut aussi contacter l'hôtel pour lui soumettre la réservation, et qu'il puisse y répondre favorablement ou non. Si l'hôtel était indisponible, il fallait automatiquement switcher vers un autre hôtel, ainsi de suite...&lt;/p&gt;

&lt;h2&gt;
  
  
  Itinéraire d'un voyage..
&lt;/h2&gt;

&lt;p&gt;Souvent les gens n'ont pas de GPS ou leur téléphone à l'étranger...donc il fallait pouvoir générer un itinéraire entre les produits, dans un PDF. (itinéraire généré via google maps). Ca veut dire que sur chaque produit, il fallait ajouter un lieu avec des coordonnées précises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et pour finir, le devis !
&lt;/h2&gt;

&lt;p&gt;Tout ça c'est pour générer un devis au final, avec le détail des prix de tous les produits.&lt;br&gt;
Avec des calculs alambiqués, des calculs de marges etc etc..&lt;/p&gt;

&lt;p&gt;Le devis pouvait s'afficher de manière complexe pour le commercial, ou simple pour le client. On pouvait aussi dupliquer des devis pour proposer plusieurs choix. Dupliquer un devis ça revenait à dupliquer le voyage, c'était pas anodin comme action.&lt;/p&gt;

&lt;h1&gt;
  
  
  Côté technique
&lt;/h1&gt;

&lt;p&gt;Beaucoup de données à gérer implique beaucoup de code ! pour le meilleur comme pour le pire...&lt;/p&gt;

&lt;h2&gt;
  
  
  RXJS
&lt;/h2&gt;

&lt;p&gt;Heureusement que cette librairie existe, c'est sûrement une des plus cool ! On peut vraiment gérer toutes les sources de données comme on le souhaite. Mélanger, mixer, trier, attendre, grouper... une pépite ! De plus elle est adoptée par angular.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redux...ou plutôt NGRX
&lt;/h2&gt;

&lt;p&gt;Aie, ouille...Super librairie également, par contre bourrée de BC breaks à l'époque, et pas du genre facilement résolvable sur un gros projet. &lt;/p&gt;

&lt;p&gt;Ils ont été capable de complètement changer leur api entre deux versions majeur et complètement délaisser l'ancienne version. Ce qui veut dire que pour continuer à utiliser les nouvelles versions d'angular, il fallait utiliser la nouvelle version de ngrx. &lt;/p&gt;

&lt;p&gt;C'est dommage d'avoir fait ça, bon nombre de gens ont été déçu. La migration, malgré leur fichier d'update, étaient très très compliqué..&lt;/p&gt;

&lt;h2&gt;
  
  
  Typescript
&lt;/h2&gt;

&lt;p&gt;Typescript est un super language, je ne reviendrai pas dessus pour vous dire pourquoi. &lt;/p&gt;

&lt;h2&gt;
  
  
  Un projet Angular
&lt;/h2&gt;

&lt;p&gt;Mais un gros projet comme celui-là impliquait d'avoir une organisation et une structure robuste !&lt;/p&gt;

&lt;p&gt;Angular raisonne en module, c'est très bien et on s'y retrouve facilement. Là où ça devenait plus épineux, c'était NGRX, parce qu'il fallait gérer la mise à jour du state, voir...des states.&lt;/p&gt;

&lt;p&gt;Le fichier devenait assez gros, il fallait gérer les erreurs etc. Dans l'ensemble tout fonctionnait bien, le state également. Mais dans le sous-sol, derrière la porte d'où sortait une petite lumière verte, on entendait un bruit incessant. Celui de tous ces rouages qui tournaient, et qu'il fallait connaître par coeur pour ne pas s'y perdre.&lt;/p&gt;

&lt;p&gt;Parce que finalement, des gros projects, aussi bien structuré qu'ils le soient, on s'y perds un jour ou l'autre. On se demande comment on a pu laisser ce fichier dépasser les 500 lignes, pourquoi ce template a été mal pensé et que fait ce Subject (rxjs) exactement déjà dans cette classe ?&lt;/p&gt;

&lt;p&gt;C'était mon premier gros projet angular, et on pouvait vraiment faire ce qu'on voulait avec. Ca implique de gagner en connaissance et d'en apprendre encore et encore.&lt;/p&gt;

&lt;p&gt;Angular est une grosse boîte à outils. Dedans il y a plein de chose à utiliser, les templates, les directives, le routing, l'authentification...&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Ce projet datait de 2017, depuis je n'ai plus refais d'angular, par crainte de devoir gérer des choses hallucinantes en javascript et typescript.&lt;/p&gt;

&lt;p&gt;Oui rien que de penser à l'idée de maintenir un projet angular sur le temps me pousse à fuir !&lt;/p&gt;

&lt;p&gt;Maintenant je fais un peu de vuejs, ça me semble plus simple. ReactJS, déjà fait, déjà re-fait...non merci ! faut aimer ça.&lt;/p&gt;

&lt;p&gt;Bref, voilà, c'était ma petite histoire et je voulais la partager...ça fait du bien d'en parler !&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>rxjs</category>
    </item>
  </channel>
</rss>
