Cédric BRASSEUR
Mis à jour le 18/11/2024
Introduction
Clean Code
TDD
Clean Architecture
Clean
(Entreprise & Clean Code)
Chaque développeur a son propre point de vue sur ce qu'est un code propre. La plupart du temps, on a plus une liste de choses que l'on ne veut pas voir plutôt qu'une recette miracle.
Attention :
Dans l'idéal, il faudrait toujours coder le plus proprement possible, quelque soit le développement en cours. Mais dans la réalité d'une entreprise, on ne peut pas travailler uniquement la qualité.
Mise en garde :
Savoir être
Savoir faire
Savoir penser
Savoir structurer
Le savoir être englobe plusieurs softskills, élever le niveau, savoir communiquer, savoir tirer profit de l'expérience des autres et apporter son expérience aux autres, et ça ne concerne pas que vous...
Ethique et attitude de codeur responsable :
Développeurs heureux, code fabuleux !
Se regarder dans le miroir avant de critiquer les autres ! Souvent, c'est par manque de connaissance, ou parce que le contexte ne permettait pas de réaliser du clean code qu'on livre du code sale.
Donc soyez indulgent avec les autres, mais ne le soyez pas avec vous-même.
Si ça ne vous est pas encore arrivé, ça vous arrivera un jour !
Don't blame !
Blame, but efficiently
Agilité et feedback en continue
Rappels sur les méthodes agiles
Pourquoi la qualité
&
Pourquoi l'agilité ?
Vu comme ça, c'est beau, mais il y a des entraves au clean code.
Mise en garde :
Le nombre de développeurs dans le monde a une courbe de croissance extrêmement élevée au fil des années.
Environ un facteur double tous les 5 ans.
Ceci engendre que :
Un des pionnier du Clean Code (Robert C. Martin) propose une façon simple d'analyser si du code est propre ou non. Il suffit de compter le nombre de "WTF" / minute lors d'une revue de code.
Exercice solo :
Le but de cet exercice n'est pas de réaliser du code complexe, il est de réaliser l'exercice en essayant d'avoir le code le plus "Clean" possible selon votre expérience personnelle actuelle.
Je propose une simple simulation de jeu du serpent : 2 joueurs lancent un dé (1-6) au tour par tour, ils doivent arriver à la case 50. S'ils dépassent 50, le joueur retourne directement à la case 25. Jusqu'à ce qu'un des deux gagne la partie.
Le jeu acclame le joueur par son nom à la fin.
(Aucune interaction utilisateur nécessaire, juste de l'affichage en ligne de commande ou autre selon vos envies)
Envoyez moi les exercices tout au long de la formation
(cdric.brasseur@gmail.com)
Exercice duo :
Le but de cet exercice est de prendre 20 minutes pour faire une revue de code réalisé par son voisin.
On ne critique pas le code du voisin, on propose des améliorations et son point de vue.
Car le voisin va également faire une revue de votre code de 20 minutes également.
Mettez sur un fichier les différentes remarques que vous vous faites entre vous !
Envoyez moi les exercices tout au long de la formation
(cdric.brasseur@gmail.com)
L'utilisation de tests est primordiale ! Une technique que l'on va approfondir plus tard durant la formation : le TDD.
Et dans une future formation, le BDD également !
On test en mode agile, dans le but d'avoir un test en continu et présent dans notre intégration continue.
Plusieurs principes sont clés pour ce savoir :
Ce sont des principes que l'on va parcourir et aborder dans la dernière partie de la formation (Clean architecture)
Encore un savoir assez abstrait, un peu comme le savoir être. Nous aborderons plus en détail ce savoir en conclusion de la formation, sûrement même après l'évaluation !
Un avant goût de ce que l'on verra :
On l'a dit précédemment mais le clean code est assez subjectif, dans cette partie je vais vous proposer une vision des choses que j'applique et complétée par celle qui est proposée par Robert C. Martin.
Quel est votre avis sur les commentaires dans le code ?
Quand faut-il en mettre ? Quel pourcentage par rapport au code ?
?
?
?
Ne jamais tout commenter
Un exemple de code commenté intégralement, regardez bien :
Deux remarques à faire !
Maintenance des commentaires ?
Dans la réalité des choses, les commentaires ne sont pas maintenus, il arrive même qu'ils n'aient plus rien à voir avec la ligne en dessous, suite à un refactoring ou autre raison.
Le conseil qui est donné par Robert C. Martin est de ne pas commenter son code, si un commentaire est nécessaire autant le factoriser et le rendre plus clair !
"Un commentaire est un échec dans la clarification de votre code"
Il faut nuancer un peu quand même, certains commentaires ont leurs places dans votre code. Et parfois nous n'avons pas le temps ou pas les connaissances pour rendre le code plus clair, donc le commentaire reste intéressant.
Les commentaires utiles
Le commentaire informatif : Celui qui donne une information sur un format d'entrée accepté par une méthode par exemple.
Les commentaires sur des conditions : Ici on ne commente pas, on créer une méthode dont le nom explique la condition.
Les commentaires utiles
Le commentaire clarifiant : Dans le cas de suite d'opérations arithmétiques par exemple pour un test.
Le commentaire utile : Dans le cas de la réalisation d'une opération non compréhensible par le contexte
Les commentaires obligatoires
Le commentaire copyrights : Il est fréquent que le copyright d'entreprise soit nécessaire sur vos développements
Le commentaire pour la documentation automatisée : Si le besoin d'avoir une doc est présent, faites le... Mais excepté pour la doc, on est vraiment dans le commentaire complètement inutile.
Les mauvais commentaires
Quelques exemples de mauvais commentaires :
Bien nommer ses variables
Aujourd'hui, il est possible de nommer les variables comme on le souhaite, profitons-en pour les nommer correctement !
En C# la convention est d'utiliser le PascalCase pour quasiment tout, les classes, les propriétés, les méthodes,...
Dans d'autres langages on va plus utiliser le camelCase.
Chaque variable doit représenter ce qu'elle va contenir : parfois on va même mettre le type de la donnée dans le nom de la variable (mais souvent l'IDE sait vous donner l'information, donc elle serait redondante dans ce cas)
Anecdote Fortran
Bien nommer ses variables
J'espère que ça vous semble logique de bien nommer vos variables, mais si ça semble annodin c'est nécessaire et mérite de la réflexion.
Bien nommer ses fonctions / méthodes
Les méthodes sont des actions, lorsque l'on verra le principe du découplage, nous verrons que chaque méthode devrait en principe faire qu'une seule chose.
Une méthode représente une action, elle doit donc avoir un contexte verbeux et il faut choisir un nom révélateur.
Exemples :
Une fonction doit faire une seule chose et doit la faire bien (SRP)
Selon Robert C. Martin, les fonctions devraient réaliser qu'une et uniquement une seule chose. Il faudrait donc extraire chaque "chose" pour en faire une fonction. Il en décrit copieusement les avantages et la clarté de code qui en découle. La difficulté réside dans le fait de savoir quand est-ce que l'on fait une seule chose.
TODO : Faire cette slide correctement
Une fonction doit faire une seule chose exemple (SRP)
Ce bout de code est fréquent à voir, mais il est complexe à tester efficacement et il fait plusieurs choses...
La méthode ProcessFile devient presque discutable pour le coup, mais afin de ne pas laisser le client pouvoir faire ce qu'il veut avec nos méthodes, c'est envisageable
Un exemple de principe SOLID non respecté
Ce bout de code est simple, il modifie la valeur d'un argument passé en paramètre. Mais c'est que l'on appel un side effect.
Le code appelant n'a l'info que les données sont changées par la méthode que par le nom (et le out, en .Net)
Le code appelant sait que la donnée qu'il veut est retournée et il en fait ce qu'il veut lui-même !
Les arguments d'une fonction
Personnellement, j'essaye de limiter au maximum le nombre d'arguments dans mes fonctions (3 max)
A savoir aussi sur les arguments :
Faites des classes !
Ne pas avoir de paramètre avec un booléen
On se retrouve avec un if dans notre méthode et ça n'est pas très clair. Souvent ça implique d'avoir un if dans le code utilisateur également, ce qui n'est pas top.
Ne pas avoir de paramètre avec un booléen
Ici, on a appliqué deux actions pour rendre le code plus Clean :
Les instructions avec accolades
Une instruction avec accolade (if, foreach,...) devrait dans l'idéal ne jamais être utilisé avec des accolades, ceci forçant cette instruction à faire une seule chose.
Vous l'aurez compris, la plupart du temps, on va développer une fonction et appeler cette fonction en passant à la ligne avec une tabulation.
Attention à l'instruction switch !
Un switch ne peut par définition pas réaliser qu'une seule chose. Ils sont donc déconseillé (pas interdit).
Déconseillé car :
Un switch devrait être cloisonné, placé derrière une fabrique abstraite et nous verrons ça quand nous parlerons de Design Patterns. (Même si j'admets encore en utiliser parfois)
Un exemple de code et de simplification
Ce bout de code est pas simple à comprendre, vous ne trouvez pas ? Et pourtant...
Comment l'améliorer ? Le rendre compréhensible ?
Deux étapes pour améliorer le code précédent
On comprend déjà beaucoup plus de quoi on parle et quel est l'objectif de ce bout de code
Deux étapes pour améliorer le code précédent
Il n'y a pas vraiment plus de ligne de code et aucun besoin de commentaire pour comprendre ce que cette méthode fait.
Un exemple de refactoring de conditions imbriquées
Un exemple de refactoring de conditions imbriquées
Un exemple de refactoring de conditions imbriquées
DRY Principle
Ne vous répétez pas
Un code propre est un code qui ne contient pas de répétition. Lorsqu'une répétition se trouve dans votre code il vous faut factoriser en créant une fonction et remplacer les doublons par un appel à cette fonction.
En tant que développeurs, nous avons souvent tendance à utiliser le copier coller, il faut être vigilant...
C'est très simple à mettre en place mais pas toujours à identifier il faut donc être attentif ou utiliser un outil d'analyse de code tel que SonarQube pour détecter ça.
L'avantage principal : Une erreur dans le code dupliqué n'est pas à corriger à plusieurs endroits, elle n'est à corriger que dans la fonction factorisée.
Un exemple de DRY Principle
Un exemple de DRY Principle
Et encore... Les méthodes LogLogin(), LogLogout(), LogSignUp() sont un peu inutiles maintenant, mais pourquoi pas...
Introduction et importance
En début de formation nous avons parlé du nombre de WTF pour évaluer le Clean Code. La mise en forme de votre code est très importante pour la compréhension du code et donc la qualité de celui ci.
Soyons clairs, le formatage du code est extrêmement important, la fonction que vous développez aujourd'hui va évoluer et doit être maintenable, pensez à celui qui passera derrière vous.
Nous allons voir comment mettre en forme sur deux axes :
La mise en forme verticale
Exemple : La mise en forme verticale
La mise en forme horizontale
Exemple : La mise en forme horizontale
Exemple : La mise en forme horizontale
Pour définir les normes : Appliquez des règles d'équipe
Exemple de code arithmétique et compréhensibilité
Voici un code que j'ai récupéré et que j'ai adapté pour le rendre plus lisible en termes d'arithmétique :
Attention au Linter dans ce cas !
Retrouver le code de base ou le recoder
Outil d'analyse automatisé et Linter
Un linter va analyser syntaxiquement votre code selon certaines règles (Exemple Resharper, ESLint,...) que vous mettez en place au fur et à mesure avec votre équipe de développement.
Durant la phase d'intégration continue il est fréquent d'utiliser un outil d'analyse de la qualité de votre projet. Exemple SonarQube, qui calcul des métriques de qualité de code souvent très utiles.
Nous allons voir comment mettre en place cet outil, avec SonarCloud, en ligne, simple à associer à un repo github.
Outil de versionning
Nous n'allons pas voir comment fonctionne un gestionnaire de code source (même si durant les exercices je peux vous aider à prendre en main git, si besoin).
Je tiens juste à rappeler les avantages en termes de Clean Code :
Systématique !
La CI pour le bien de tous
L'intégration continue a pour objectif de faciliter la tâche aux développeurs pour gérer leur code source et réaliser les tâches tout en rajoutant une couche de sureté avec différents tests automatisés lors des merge (ou commit d'ailleurs).
Pour notre CI, on va mettre en place des étapes supplémentaires à notre validation de merge (déploiement impossible si rouge) :
Systématique !
L'objectif premier de réaliser des tests sur son application est de limité d'envoyer des erreurs en production.
On va donc tester les développements réalisés à chaque changement et surtout avant chaque mise en production, ce qui rend l'application plus robuste mais ne la rend pas infaillible.
Il existe de nombreux types de tests, nous allons essentiellement travailler les tests unitaires lors de cette formation. Et les tests d'acceptation dans la prochaine (BDD)
Une pratique de plus en plus courante...
Une pratique a émergé suite à ce besoin grandissant en termes de tests unitaires sur l'intégralité de notre projet
Systématique !
Le TDD : Test Driven Development
Nous allons voir les règles et pratiquer le TDD dans la partie suivante de la formation et pour le reste de la formation
Rendu obligatoire dans le process de CI/CD !
Quelques règles pour la revue de code :
Autres conseils selon mon point de vue
Le design simple et incrémental
Pensez simple votre design simple et incrémental. Ici je parle plus d'architecture de projet que de design (interface) mais c'est valable également pour l'interface.
La partie Clean Architecture sera abordée après le TDD durant la formation.
Votre objectif est de maîtriser les différents principes et outils présentés précédemment. En tant que développeur vous devez vous assurer vous même de la qualité de votre code.
Aparté : Le QA et sa place en entreprise
Le but de l'exercice est simple : Choisir parmi un des sujet proposé et appliquer au maximum les principes de Clean Code vu ensemble
Envoyer la liste des sujets potentiels
Revue de code sur les développements réalisés
J'hésite encore entre prendre un de vos projet et faire la revue de code avec vous ou vous faire faire la revue entre vous.
Je déciderai en fonction de la qualité des projets proposés par les étudiants.
Add enum + state sample
Les métriques analysées
Les smells applicatifs
Dans la couche applicative, on retrouve des smells qui impactent une solution sur plusieurs modules, classes et méthodes en étant associés à plusieurs emplacements dans l’application. Quelques exemples marquants :
Les métriques analysées
Les smells de classe
Les classes smells regroupent tous les anti-patterns inhérents à une classe. Pour en énumérer quelques-uns :
Les métriques analysées
Les smells de méthode
Allons voir la doc de SonarCloud
SonarLint
Installation & présentation de SonarLint
Revue de code
Voyons comment mettre en place les pull request et les revues de code sur notre repository Github...
Exercice SonarCloud
Mettez en place l'intégration continue avec SonarCloud sur votre projet (ou sinon, réalisez une analyse sur votre poste avec SonarQube) regardez et corrigez un maximum des code smells / bugs qui vous sont remontés.
Prenez le temps de bien faire cet exercice, le but est vraiment de ne plus avoir de smells à cette version de votre code
Et les 4 axes qui sont analysés
Analyse des performances du site, temps de chargement, taille des images, premier affichage de la page d'accueil etc...
Analyse de l'accessibilité à votre site, ça passe par les variances de couleurs, la taille des caractères, la police choisie, etc...
Un peu comme ce que propose Sonar sur votre site web, ici ça analyse le code source disponible et fait des retours dessus
"Search Engine Optimization", des retours directs sur votre ranking dans les recherches google.
A savoir : Les autres axes améliorent aussi votre SEO
Exemple & utilisation
Définition, utilité et réalité
Nous allons entamer votre apprentissage du TDD, mais sachez que vous ne serez sûrement pas encore experts à la fin de cette formation, à vous d'être assidu et pratiquer quand vous en avez la possibilité
Le TDD est une pratique qui a commencé à être réellement utilisée en 1999. Peu répandu en France à ma connaissance et pourtant... C'est un point si important ! On en parler juste avant, trop d'entreprise demandent à la QA pour réaliser des tests.
NON ! C'est à nous de tester nos développements
Il y a trois grandes règles à respecter pour faire correctement du TDD
Les règles :
Les tests et le code sont écrits ensemble, en commençant par les tests.
Maintenir ses tests c'est maintenir son code
Tous les concepts et conseils vu dans la partie précédente sont à appliquer dans vos tests unitaires. C'est important de le comprendre car c'est également un des avantages de l'utilisation de la méthode TDD.
Pourquoi le TDD ?
Tout code doit être testé et en agile on doit être prêt à déployer toutes les 2 semaines (ou semaine). ça ne veut pas dire qu'on va forcément toujours délivrer tout ce qui est développé, mais on va déployer que des choses prêtes à être déployées et ce à un certain rythme (comparé à avant, ou on livrait tous les 3 mois)
Attention, la couverture de tests voulue est 100% mais c'est la valeur théorique quasi inatteignable
L'objectif des tests est de permettre n'importe quelle modification sans avoir peur de casser quelque chose.
Votre premier objectif est de tester chaque portion de code que vous développez
Les avantages de la méthodologie
Je vais faire un exemple en l'expliquant pas à pas devant vous
Exercice très simple mais qui permet d'appliquer facilement (même si pour le cas d'usage un peu bêtement) le TDD.
Réalisez une calculatrice simple, qui prend deux entiers en paramètres et qui retourne le résultat des opérations suivantes :
L'objectif est donc d'avoir une classe Calculator qui contient 4 méthodes entièrement testé en TDD (en démarrant par des tests en échec,...)
Faites en sorte que les paramètres ne puissent pas être négatifs et faites en sorte qu'une exception custom (Ou ArgumentException) soit levée si on tente de diviser par zéro.
Vous allez devoir développer en TDD le célèbre FizzBuzz :
Essayez de réaliser la méthodologie TDD la plus complète possible pour cet exercice.
Tutoriel à suivre :
Pour celles et ceux qui finissent vite, quelques conseils pratiques peuvent être récupérés de ce lien, parcourez le :
Refaites exactement les étapes réalisées avec vous pour la classe Stack, en démarrant le tout en TDD.
Rappelez-vous, on démarre par du code bête et méchant, jusqu'à ce que le besoin de faire évoluer le code projet (via un test) se fasse ressentir.
Envoyez moi les exercices tout au long de la formation, j'utiliserai ces éléments pour la notation.
Pour comprendre un peu le TDD, je vais vous envoyer un exercice un peu plus complexe que ceux que l'on a fait jusqu'à maintenant.
Le but est de vraiment prendre le temps de penser en TDD et de réaliser cet exercice en respectant toutes les règles proposées.
Envoyer Exercice_TDD_medium.md
Pour cet exercice, vous allez devoir implémenter un jeu dont les règles se trouvent ici
https://www.codewars.com/kata/5941c545f5c394fef900000c
Votre objectif est d'implémenter le jeu en réalisant une TDD la plus complète possible.
Petite mise en garde
Le TDD n'est pas simple à apprendre et à mettre en place. Prenez le temps d'apprendre ça sur des projets personnels avant d'emmener ça au travail.
Ce serait contre productif. Et vous l'avez expérimenté, la première fois c'est pas facile le TDD.
Un dernier exercice vous attend pour le Workshop final.
TODO
Ajouter un ensemble d'action chaîné à la stack, afin de pouvoir faire aucune de ces actions si par exemple il y a plus de pop que de push dans l'ensemble des actions.
+ Gérer le fait qu'il y a tjr plus de push avant chaque ensemble de pop
Voir si c'est en combien de temps c'est faisable, la difficulté et si possible en faire un exercice complémentaire
Un autre objectif a atteindre pour réaliser du Clean Code est de réaliser également une Clean Architecture.
Nous sommes tous des architectes en un sens, les architectes de nos développements (Design Architecture / Software architecture)
L'architecture permet de prendre les décisions critiques le plus tard possible dans le projet. (Exemple : Base de données)
Gestion de la dette technique
Une fois de plus l'utilisation d'un outil d'analyse qualité est de mise ici : SonarQube
Les métriques analysées
Les smells applicatifs
Dans la couche applicative, on retrouve des smells qui impactent une solution sur plusieurs modules, classes et méthodes en étant associés à plusieurs emplacements dans l’application. Quelques exemples marquants :
Les métriques analysées
Les smells de classe
Les classes smells regroupent tous les anti-patterns inhérents à une classe. Pour en énumérer quelques-uns :
Les métriques analysées
Les smells de méthode
Introduction au DDD
Plusieurs principes peuvent vous permettre de réaliser une architecture clean. Nous n'allons pas aborder en détail ce point car il sera abordé lors d'une prochaine formation Architecture.
C'est assez explicite par son nom, mais ça doit être précisé pour éviter de passer à côté de quelque chose d'important : On veut effectivement que chaque élément ne soit responsable que d'une chose et qu'il la fasse bien. Mais on souhaite aussi séparer les "choses faites" par acteur, c'est important pour éviter les soucis.
Prenons un exemple...
Vous avez trois services (d'entreprise) :
Si vous réalisez une seule méthode pour calculer le salaire des employés, vous ne respectez pas le SRP. Imaginez que le calcul change pour le service Cadre uniquement, si le code a été factorisé, vous allez modifier le calcul de salaire de tous les services et causer des effets de bords sur les salaires des RH et Employés...
Votre programme doit être ouvert aux extensions mais fermé aux modifications. C'est à dire que l'on va utiliser des abstractions afin de faire évoluer le code existant plutôt que de le modifier ! Ainsi que gérer les injections de dépendances dans un sens particulier pour diminuer les impacts en modifications.
Comment gérer les dépendances ?
L'objectif est de respecter ce que l'on a vu dans la partie précédente, afin de rendre la partie Domain la moins sujette aux modifications impactantes, contrairement à la partie Presentation qui elle risque des modifications régulières mais ayant peu d'impacts sur le système.
Prenons un exemple...
Dans cet exemple, l'objectif est d'afficher des stats sur un support différent.
Il faut donc noter surtout le sens des dépendances ainsi que les interfaces utilisées pour cloisonner, et savoir que l'on pointe le plus possible vers l'Interactor (Buisness Rules) pour que cette partie soit la moins ouverte aux modifications.
Les interfaces doivent êtres utilisées de manière à s'assurer que chaque cas d'utilisation correspond bien aux attentes. Pour mieux comprendre prenons un contre-exemple bien connu.
Prenons un contre-exemple...
Admettons que nous avons une projet qui permet un User de travailler avec un Rectangle, puis par la suite on souhaite le faire travailler également avec un carré.
Ici, on peut imaginer que ça peut factoriser le code de réaliser quelque chose de ce style, mais ça ne respecte pas le LSP.
Vous voyez pourquoi ?
Les interfaces doivent êtres utilisées de manière à s'assurer que chaque cas d'utilisation correspond bien aux attentes ET soient substituables (remplaçable)
Prenons un exemple architectural...
Pour le projet Collect&Verything, vous passez par des API REST, admettons une URI comme ceci :
collect.com/enterprise/cora/pickupaddress/57000 Metz.../products/123
Imaginons qu'une entreprise (Click) réutilise notre système sans lire correctement les specs et décide de mettre en place ce système, mais en utilisant pickup à la place de pickupaddress.
Ceci nous forcerait à avoir un if (enterprise == "Click") dans le code et dont des conditions à gérer. Ici, bien utiliser une interface permettrait d'éviter ce problème architectural
Ce principe a pour objectif d'éviter de vous trimballer des choses dont vous ne dépendez pas (dans votre classe).
Prenons un exemple...
Prenons ce diagramme de classes et imaginons que OPS soit une liste d'opérations et que chaque User utilise l'opération correspondant à son chiffre (U1 => op1,...)
Il est nécessaire d'ajouter des interfaces afin de limiter les dépendances des Users vers les opérations qui l'intéressent
Ce principe dit d'abord que les programmes les plus flexibles sont les programmes dont le source code dépend d'abstractions et non d'éléments concrets. Plus directement, chaque import devrait être une abstraction et jamais une classe concrète. (Bien que ce soit impossible dans les faits, c'est une règle à appliquer au maximum)
Quel est l'objectif ?
Les éléments concrets sont plus volatiles & un changement dans une classe concrète nécessite forcément une modification dans la classe qui en dépend. Ce n'est pas (forcément) vrai dans le cas d'une modification d'abstraction.
Ne jamais faire référence à un élément volatile !
D'accord, mais comment faire ça ?
Pour éviter ces dépendances que l'on souhaite ne jamais mettre dans notre code, nous devons utiliser les "Abstract Factories",
La ligne rose est une barrière entre les abstractions et les implémentations concrètes
Prenons un exemple...
Remarquez les dépendances de chaque côté de la ligne rose sont dans des sens opposés (d'où le nom de DIP)
Par contre, l'élément concret ici ne respecte pas le DIP, on répète que le DIP n'est pas applicable à 100%
Sans rentrer dans le détail car vous le verrez dans une autre formation (en tous cas, si le formateur ne vous parle pas d'architecture hexagonale, demandez lui)
Pour faire simple :
Celle-ci, c'est sûr que vous la verrez car elle fait partie d'une grande partie de votre cours Architecture : Création de services Cloud (échanges réseaux) et orchestration de ses service + User interface.
Image from redhat
Envoyer fichier clean_code_test
Je vais vous envoyer deux propositions de sujet sur un fichier .md
Vous pouvez choisir la proposition que vous voulez et normalement toutes les règles et choses à respecter pour l'évaluation sont présentes sur ce fichier.
BON COURAGE !
(après c'est fini)
Envoyer Evaluation_CleanCode.md
BON COURAGE !
(après c'est fini)
Exercice de TDD en appliquant au maximum les principes de Clean Code que l'on a vu ensemble.
Veille technologique en continue
Le savoir pensé est un état d'esprit, c'est pourquoi je l'utilise en conclusion, je ne peux que vous encourager sur le chemin du Clean Code.