Ça sent mauvais parce qu'il y a probablement de nombreux cas où il pourrait être modifié ou amélioré.
La plupart de ces odeurs ne sont que des indices de quelque chose qui pourrait ne pas fonctionner. Par conséquent, ils ne sont pas tenus d'être corrigés en soi… (Vous devriez cependant y jeter un coup d'œil.)
Vous pouvez trouver toutes les odeurs de code précédentes (Partie I - XXIX) ici
Nous allons continuer...
Les commentaires sont un code Odeur. Les getters sont une autre odeur de code. Devine quoi?
TL;DR : N'utilisez pas de getters. Ne commentez pas les getters
Il y a quelques décennies, nous avions l'habitude de commenter chaque méthode. Même les plus anodins.
Le commentaire doit décrire uniquement une décision de conception critique.
pragma solidity >=0.5.0 <0.9.0; contract Property { int private price; function getPrice() public view returns(int) { /* returns the Price */ return price; } }
pragma solidity >=0.5.0 <0.9.0; contract Property { int private _price; function price() public view returns(int) { return _price; } }
Nous pouvons détecter si une méthode est un getter et a un commentaire.
La fonction a besoin d'un commentaire, qui est accidentellement un getter et le commentaire est lié à une décision de conception
Ne commentez pas les getters.
Ils n'ajoutent aucune valeur réelle et gonflent votre code.
Code Smell 05 - Agresseurs de commentaires
Code Smell 01 - Modèles anémiques
Photo de Reimond de Zuñiga sur Unsplash
Le code doit être remarquablement expressif pour éviter la plupart des commentaires. Il y aura quelques exceptions, mais nous devrions considérer les commentaires comme un "défaut d'expression" jusqu'à preuve du contraire.
Robert Martin
Excellentes citations de génie logiciel
Les classes Util sont idéales pour rassembler le protocole.
TL; DR : N'ajoutez pas de protocole accidentel à vos cours
Refactoring 007 - Classe d'extraction
Nous avons tendance à mettre un protocole dans la première classe que nous trouvons.
Ce n'est pas un problème.
Nous avons juste besoin de refactoriser.
public class MyHelperClass { public void print() { } public void format() { } // ... many methods more // ... even more methods public void persist() { } public void solveFermiParadox() { } }
public class Printer { public void print() { } } public class DateToStringFormatter { public void format() { } } public class Database { public void persist() { } } public class RadioTelescope { public void solveFermiParadox() { } }
La plupart des linters comptent les méthodes et nous avertissent.
Code Odeur 124 - Changement divergent
Code Smell 143 - Amas de données
Code Smell 94 - Trop d'importations
Code Smell 34 - Trop d'attributs
Le fractionnement des classes et du protocole est une bonne pratique pour privilégier les objets petits et réutilisables.
Photo de Marcin Simonides sur Unsplash
Il n'y a pas de code si gros, tordu ou complexe que la maintenance ne puisse pas l'aggraver.
Gérald M. Weinberg
Nous achetons des dettes pour notre futur. C'est le temps de la récupération.
TL;DR : Ne laissez pas de TODO dans votre code. Répare les!
Nous rencontrons des TODO dans notre code. Nous les comptons.
Nous l'abordons rarement.
Nous avons commencé à devoir la dette technique.
Ensuite, nous payons la dette + les intérêts.
Quelques mois après, nous payons plus d'intérêts que la dette initiale.
public class Door { private Boolean isOpened; public Door(boolean isOpened) { this.isOpened = isOpened; } public void openDoor() { this.isOpened = true; } public void closeDoor() { // TODO: Implement close door and cover it } }
public class Door { private Boolean isOpened; public Door(boolean isOpened) { this.isOpened = isOpened; } public void openDoor() { this.isOpened = true; } public void closeDoor() { this.isOpened = false; } }
Nous pouvons compter les TODO.
Nous pouvons compter les TODO.
La plupart des linters le font.
Nous avons besoin de la politique pour les réduire.
Si nous utilisons TDD, nous écrivons immédiatement le code manquant.
Dans ce contexte, les TODO ne sont valables que lors d'un développement Depth First pour se souvenir des chemins ouverts à visiter.
Photo par Eden Constantino sur Unsplash
Après avoir terminé les premiers 90 % d'un projet, vous devez terminer les 90 % restants.
Michel Abrash
Notre code est plus robuste et lisible. Mais nous cachons NULL sous le tapis.
TL ; DR : évitez les valeurs nulles et indéfinies. Si vous les évitez, vous n'aurez jamais besoin d'options.
Le chaînage facultatif, les options, la coalescence et de nombreuses autres solutions nous aident à gérer les tristement célèbres valeurs nulles.
Il n'est pas nécessaire de les utiliser une fois que notre code est mature, robuste et sans null.
const user = { name: 'Hacker' }; if (user?.credentials?.notExpired) { user.login(); } user.functionDefinedOrNot?.(); // Seems compact but it is hacky and has lots // of potential NULLs and Undefined
function login() {} const user = { name: 'Hacker', credentials: { expired: false } }; if (!user.credentials.expired) { login(); } // Also compact // User is a real user or a polymorphic NullUser // Credentials are always defined. // Can be an instance of InvalidCredentials // Assuming we eliminated nulls from our code if (user.functionDefinedOrNot !== undefined) { functionDefinedOrNot(); } // This is also wrong. // Explicit undefined checks are yet another code smell
Il s'agit d'une fonctionnalité linguistique .
Nous pouvons le détecter et le supprimer.
De nombreux développeurs se sentent en sécurité en polluant le code avec des transactions nulles.
En fait, c'est plus sûr que de ne pas traiter du tout les NULL.
Les valeurs nulles , le vrai et le faux sont aussi des odeurs de code.
Nous devons viser plus haut et créer un code plus propre.
Le bon : supprimez tous les nulls de votre code.
Le mauvais : utilisez le chaînage optionnel.
Le laid : ne pas traiter du tout les nulls.
Code Smell 145 - Hack de court-circuit
Code Smell 69 - Big Bang (JavaScript Ridicule Castings)
Null : l'erreur d'un milliard de dollars
Comment se débarrasser des IF ennuyeux pour toujours
Photo par engin akyurt sur Unsplash
Celui qui se bat avec des monstres pourrait prendre garde de ne pas devenir un monstre. Et si tu regardes longtemps dans un abîme, l'abîme te regarde aussi.
Nietzsche
Chaque développeur compare les attributs de manière égale. Ils se trompent.
TL;DR : N'exportez pas et ne comparez pas, comparez simplement.
La comparaison d'attributs est fortement utilisée dans notre code.
Nous devons nous concentrer sur le comportement et les responsabilités.
C'est la responsabilité d'un objet de se comparer à d'autres objets. Pas le nôtre.
Les optimiseurs prématurés nous diront que c'est moins performant.
Nous devrions leur demander des preuves réelles et opposer la solution la plus maintenable.
if (address.street == 'Broad Street') { if (location.street == 'Bourbon St') { // 15000 usages in a big system // Comparisons are case sensitive
if (address.isAtStreet('Broad Street') { } // ... if (location.isAtStreet('Bourbon St') { } // 15000 usages in a big system function isAtStreet(street) { // We can change Comparisons to // case sensitive in just one place. }
Nous pouvons détecter les comparaisons d'attributs à l'aide d'arbres de syntaxe.
Il peut y avoir de bonnes utilisations pour les types primitifs comme pour de nombreuses autres odeurs.
Nous devons regrouper les responsabilités en un seul endroit.
La comparaison en est une.
Si certaines de nos règles commerciales changent, nous devons changer un seul point .
Code Smell 63 - Envie de fonctionnalité
Code Smell 101 - Comparaison avec les booléens
Code Smell 122 - Obsession primitive
Photo de Piret Ilver sur Unsplash
Le comportement est la chose la plus importante à propos des logiciels. C'est ce dont dépendent les utilisateurs. Les utilisateurs aiment que nous ajoutions un comportement (à condition que ce soit ce qu'ils voulaient vraiment), mais si nous modifions ou supprimons un comportement dont ils dépendent (introduisons des bogues), ils cessent de nous faire confiance.
Michel Plumes
Article suivant : 5 autres odeurs de code.