Ç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.)
Odeurs de code précédentes
Vous pouvez trouver toutes les odeurs de code précédentes (Partie I - XXXI) ici .
Nous allons continuer...
Code Odeur 156 - Autre implicite
Nous apprenons si/sinon lors de notre premier jour de programmation. Puis on oublie le reste.
TL;DR : Soyez explicite. Même avec Else.
Problèmes
- Lisibilité
- Charge cognitive
- Conditions imprévues
- Violation du principe Fail Fast
Solutions
- Ecrire le else explicite
Contexte
Si nous revenons tôt sur une phrase SI, nous pouvons omettre la partie else.
Ensuite, nous supprimons le SI et utilisons le polymorphisme.
C'est alors que nous passons à côté des cas réels.
Exemple de code
Faux
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
Droite
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
Détection
- [x] Automatique
Nous pouvons vérifier les arborescences de syntaxe et les analyser et avertir s'il manque autre chose.
Nous pouvons également les réécrire et effectuer des tests de mutation.
Mots clés
- Conditionnels
Conclusion
Ce genre d'odeur suscite beaucoup de débats publics et de haine .
Nous devons échanger des opinions et évaluer chaque pour et contre.
Rapports
Code Smell 36 - Switch/case/else if/else/if instructions
Plus d'informations
Arrêtez d'utiliser implicitement Else
Quand utiliser un autre implicite
Comment se débarrasser des IF ennuyeux pour toujours
Crédits
Photo par Elena Mozhvilo sur Unsplash
Le plus gros problème des équipes logicielles est de s'assurer que tout le monde comprend ce que font les autres.
Martin Fowler
Code Odeur 157 - Solde à 0
Aujourd'hui, j'attendais un paiement dans mon portefeuille. Le solde était à 0. J'ai paniqué.
TL;DR : Null n'est pas 0. Error n'est pas 0. juste 0 est 0.
Problèmes
- Nuls
- UX
- Convivialité
Solutions
- Faites une distinction claire entre un zéro et une erreur.
Contexte
Je lis beaucoup sur les problèmes de sécurité.
Surtout sur les cryptos.
La semaine dernière, j'ai lu sur un fil de piratage crypto .
Quand mon portefeuille m'a montré 0 comme solde, j'ai paniqué.
C'était juste une odeur UX.
La blockchain était inaccessible 💩
Exemple de code
Faux
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable show 0 as the balance """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: return 0
Droite
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable throw an error """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: raise BlockchainNotReachableError("Error reaching blockchain")
Détection
- [x] Manuel
C'est une odeur de design.
Nous pouvons trouver des modèles lorsqu'une exception ou un code de retour est généré et masqué par un 0.
Mots clés
- UX
Conclusion
Suivez toujours le principe du moindre étonnement comme guide.
Rapports
Code Smell 139 - Code commercial dans l'interface utilisateur
Code Smell 73 - Exceptions pour les cas attendus
Code Odeur 72 - Codes de retour
Plus d'informations
Null : l'erreur d'un milliard de dollars
Crédit
Photo de Jasmin Sessler sur Unsplash
Clause de non-responsabilité
Code Smells n'est que mon avis .
Ma vraie critique avec Null est qu'il ramène inutilement toute l'agonie d'avoir à choisir d'exécuter votre programme rapidement sans vérification ou de l'exécuter lentement avec vérification.
Tony Hoare (inventeur nul)
Excellentes citations de génie logiciel
Code Odeur 158 - Variables non variables
Vous affectez une valeur à une variable et l'utilisez mais ne la modifiez jamais.
TL;DR : Soyez déclaratif sur la mutabilité.
Problèmes
- Lisibilité
- Honorez la mutabilité de la bijection .
- Problèmes potentiels de performances et de mémoire.
Solutions
- Remplacez la variable par une constante et soyez clair sur sa portée.
Refactorisations
Refactoring 003 - Extraire la constante
Refactoring 008 - Convertir des variables en constante
Contexte
Nous apprenons toujours du domaine.
Parfois on devine qu'une valeur peut changer avec le MAPPER .
Plus tard, nous apprenons que cela ne changera pas.
Par conséquent, nous devons en faire une constante.
Cela évitera également les constantes magiques .
Exemple de code
Faux
<?php function configureUser() { $password = '123456'; // Setting a password on a variable is another vulnerability // And Code Smell $user = new User($password); // Notice Variable doesn't change }
Droite
<?php define("USER_PASSWORD", '123456') function configureUser() { $user = new User(USER_PASSWORD); } // or function configureUser() { $user = new User(userPassword()); } function userPassword() : string { return '123456'; } // Case is an oversimplification as usual
Détection
- [x] Automatique
De nombreux linters vérifient si la variable n'a qu'une seule affectation.
Nous pouvons également effectuer des tests de mutation et essayer de modifier la variable pour voir si les tests se cassent.
Mots clés
- Mutabilité
Conclusion
Nous devons nous remettre en question et refactoriser lorsque la portée de la variable est claire et que nous en apprenons davantage sur ses propriétés et sa mutabilité .
Rapports
Code Smell 116 - Variables déclarées avec 'var'
Code Smell 127 - Constantes Mutables
Code Smell 107 - Réutilisation des variables
Code Smell 02 - Constantes et nombres magiques
Plus d'informations
Le pouvoir maléfique des mutants
Clause de non-responsabilité
Code Smells n'est que mon avis .
Crédits
Photo de Noah Buscher sur Unsplash
Un système complexe qui fonctionne se révèle invariablement avoir évolué à partir d'un système simple qui fonctionnait.
Jean Gall
CoDe SmElL 159 - mIxEd_cASeI
Le développement sérieux est fait par de nombreuses personnes différentes. Nous devons commencer à nous mettre d'accord.
TL ; DR : ne mélangez pas différentes conversions de casse
Problèmes
- Lisibilité
- Maintenabilité
Solutions
Choisissez une norme de cas
Tiens bon
Contexte
Lorsque différentes personnes créent des logiciels ensemble, elles peuvent avoir des différences personnelles ou culturelles.
Certains préfèrent camelCase 🐫, d'autres snake_case 🐍, MACRO_CASE🗣️, et bien d'autres .
Le code doit être simple et lisible.
Exemple de code
Faux
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2022-01-07T02:23:41.305Z", "created_at": "2019-01-07T02:23:41.305Z", "deleted at": "2022-01-07T02:23:41.305Z" }
Droite
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2022-01-07T02:23:41.305Z", "createdAt": "2019-01-07T02:23:41.305Z", "deletedAt": "2022-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one }
Détection
- [x] Automatique
Nous pouvons informer nos linters des normes générales de dénomination de notre entreprise et les faire respecter.
Chaque fois que de nouvelles personnes arrivent dans l'organisation, un test automatisé doit lui demander poliment de changer le code.
Des exceptions
Chaque fois que nous devons interagir avec du code hors de notre portée, nous devons utiliser les normes du client, pas les nôtres.
Mots clés
- Appellation
Conclusion
La gestion des normes est facile.
Nous devons les faire respecter.
Rapports
Code Smell 48 - Code sans normes
Plus d'informations
Qu'est-ce qu'un nom exactement - Partie I La quête
Toutes les conventions de nommage
Clause de non-responsabilité
Code Smells n'est que mon avis .
Crédits
Photo de Wolfgang Hasselmann sur Unsplash
Si vous avez trop de cas particuliers, vous vous trompez.
Craig Zerouni
Code Odeur 160 - Identifiant invalide = 9999
Maxint est un très bon nombre pour un ID invalide. Nous ne l'atteindrons jamais.
TL ; DR : Ne couplez pas les identifiants réels avec des identifiants invalides. En fait : évitez les pièces d'identité.
Problèmes
- Violation de la bijection .
- Vous pourriez atteindre l'ID invalide plus tôt que vous ne le pensez.
- N'utilisez pas non plus de valeurs nulles pour les ID non valides.
- Drapeaux de couplage de l'appelant aux fonctions.
Solutions
Modélisez des cas spéciaux avec des objets spéciaux.
Évitez 9999, -1 et 0 car ce sont des objets de domaine valides et un couplage d'implémentation.
Introduire un objet nul
Contexte
Au début de l'informatique, les types de données étaient stricts.
Puis nous avons inventé l'erreur d'un milliard de dollars .
Ensuite, nous avons grandi et modélisé des scénarios spéciaux avec des valeurs spéciales polymorphes.
Exemple de code
Faux
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999 int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; } int get_value() { // something bad happened return INVALID_VALUE; } // returns EXIT_FAILURE (1)
Droite
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; } get_value() { // something bad happened return false; } // returns EXIT_FAILURE (1)
Détection
- [x] Semi-automatique
Nous pouvons vérifier les constantes spéciales et les valeurs spéciales dans le code.
Mots clés
- Nul
Conclusion
Nous devrions utiliser des nombres pour faire le lien avec les identifiants externes.
S'il n'existe aucun identifiant externe, il ne s'agit pas d'un numéro.
Rapports
Code Smell 120 - ID séquentiels
Plus d'informations
Null : l'erreur d'un milliard de dollars
Y2K22 - L'erreur qui nous embarrasse
Clause de non-responsabilité
Code Smells n'est que mon avis .
Crédits
Photo de Markus Spiske sur Unsplash
Les insectes se cachent dans les coins et se rassemblent aux limites.
Boris Beizer
5 autres odeurs de code arrivent bientôt…