TODO : A TERMINER
Je suis un développeur de logiciels avec 8 ans d'expérience, avec des idées, des rêves et de la passion.
Je travaille sur des projets qui sont considérés comme « bloqués ». Je travaille généralement avec des codes hérités du passé. Où les bogues et les problèmes devraient être couverts par un nombre considérable d'heures humaines consacrées à leur résolution.
Et j'en ai assez.
Même si je sais qu'il est inévitable d'être à nouveau confronté à des codes hérités.
Pour ceux qui en sont fatigués comme moi... Je n'ai aucune idée de comment vous sauver de cela, et je suis désolé que vous perdiez votre temps ainsi.
Cependant, si vous faites partie de ces rares personnes qui n'ont pas peur de se salir les mains et de réparer les choses, ces outils et ces flux de travail d'entreprise devraient vous aider.
Application/Feature Code ReviewVous devez passer en revue l'ensemble des éléments avec lesquels vous travaillez, même si cela semble stupide et que vous y consacrerez un jour ou deux, il est important d'avoir une orientation et une connaissance du contexte auquel vous êtes confronté. C'est important ! Si l'application est trop grande, vous devez examiner autant que possible l'extérieur de la fonctionnalité développée et en repousser les limites autant que possible. Revue de l'analyse commerciale pour une application/fonctionnalité Cela implique que les deux travaillent en conjonction. Comme des jumeaux - parfois la révision du code, parfois la révision de l'analyse BA. Les deux doivent être effectués.
Analyse de l'écartdessiner l'état actuel, réfléchir et développer un modèle de l'état désiré et décrire les étapes qui devraient garantir la route vers le succès.
RefactoringNettoyer avant le travail, faire le travail et
Respecter le principe DRY
Ce principe DRY a été introduit en 1999 par Andy Hunt et Dave Thomas dans leur livre "The Pragmatic Programmer" qui rassemble de nombreux concepts et astuces pour produire de meilleurs logiciels. L'un des concepts de ce livre est donc la maxime "Don't Repeat Yourself" ou "Ne Te Répète Pas" en français et deviendra l'un des plus célèbres principe en programmation.
L'objectif est d'éliminer (ou d'éviter) toute répétition superflue dans un code appartenant à la même logique afin :
- D'optimiser le code
- Le rendre plus lisible, compréhensible et intuitif
- D'éviter les erreurs dûes à la recopie
- D'éviter les oublis
- De réduire le temps de développement
Pour mettre en place ce principe, Hunt et Thomas s'appuient sur deux concepts importants : L'abstraction et la normalisation de données. En créant suffisamment de couches d'abstraction (classes, fonctions), on sera capable de baisser le nombre d'opérations logiques différentes dans notre code, tandis que la normalisation des données offrira la possibilité de passer par ces opérations existantes sans avoir à en créer de nouvelles !
L'avantage de ce principe, ce n'est pas de développer forcément dire plus rapidement, mais plus durablement !
Exemples
Normalisation
Dans ce premier exemple très simple, nous avons deux classes distinctes qui sont caractérisées par un certains nombre de propriétés en commun. Nous allons donc normaliser ses données :
class User {
firstname = null;
lastname = null;
email = null;
job = null;
}
class Admin {
firstname = null;
lastname = null;
email = null;
roles = null;
}
Ici la normalisation passera par un simple héritage :
class Account {
firstname = null;
lastname = null;
email = null;
}
class User extends Account {
job = null;
}
class Admin extends Account {
roles = null;
}
La classe Account nous permet ici d'enlever toute redondance au code, le résultat est plus lisible, plus court et nous permettra de n'écrire les futures méthodes communes à User et Admin qu'une seule fois !
Abstraction
Reprenons notre classe User définie précédemment. Les contraintes métiers nous obligent à avoir deux méthodes distinctes :
Une pour inscrire un utilisateur uniquement avec son adresse e-mail L'autre pour réinitialiser son profil (à l'exception de son e-mail), comme pour l'anonymiser Voici la version redondante du code :
class User extends Account {
//...
save(){
// Save this user somewhere
}
createFromEmailOnly(email){
this.email = email;
this.firstname = "anonymous";
this.lastname = "anonymous";
this.avatar = "https://www.flaticon.com/free-icon/blank-user_16467";
this.job = "unknown";
this.save();
}
resetProfile(){
this.firstname = "anonymous";
this.lastname = "anonymous";
this.avatar = "https://www.flaticon.com/free-icon/blank-user_16467";
this.job = "unknown";
this.save();
}
// More functions...
}
Puis la version DRY, dans laquelle la mécanique de réinitialisation des champs a été rendue abstraite par une nouvelle méthode "setDefaultFields".
class User extends Account {
//...
save(){
// Save this user somewhere
}
setDefaultFields(){
this.firstname = "anonymous";
this.lastname = "anonymous";
this.avatar = "https://www.flaticon.com/free-icon/blank-user_16467";
this.job = "unknown";
}
createFromEmailOnly(email){
this.email = email;
this.setDefaultFields();
this.save();
}
resetProfile(){
this.setDefaultFields();
this.save();
}
// More functions...
}
En plus de rendre le code plus lisible, on facilite ici la maintenance car on pourra facilement réinitialiser d'autres attributs de la classe, beaucoup plus facilement.
De plus, le nommage a rendu le fonctionnement du code plus clair, car il fallait auparavant lire le contenu de chaque instruction pour comprendre qu'elles étaient identiques et qu'elles réinitialisaient les données.
Respecter les principes SOLID
Les principes S.O.L.I.D sont un ensemble de 5 concepts fondamentaux de programmation. Ils sont principalement appliqués en programmation orientée objet (POO). Ils peuvent également être appliqués ailleurs. Ils sont indispensables à l'architecture logicielle. Pour présenter ces principes, j'ai choisi d'utiliser Javascript plutôt que TypeScript afin de ne pas alourdir les exemples. Nous allons appliquer ces principes à une simple liste de tâches. Comprendre les 5 principes SOLID et les utiliser nous permettra de :
- comprendre des pratiques de programmation plus évolués,
- améliorer la qualité du code produit pour une plus grande évolutivité,
- réduire la dette technique des projets.
Pour aller plus loin
Vous pouvez explorer des dizaines d'autres patterns (React, Angular, Vue and TypeScript) sur le site de la Patterns.dev