Ç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 - XXXI) ici .
Nous allons continuer...
Nous apprenons si/sinon lors de notre premier jour de programmation. Puis on oublie le reste.
TL;DR : Soyez explicite. Même avec Else.
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.
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
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.
Ce genre d'odeur suscite beaucoup de débats publics et de haine .
Nous devons échanger des opinions et évaluer chaque pour et contre.
Code Smell 36 - Switch/case/else if/else/if instructions
Arrêtez d'utiliser implicitement Else
Quand utiliser un autre implicite
Comment se débarrasser des IF ennuyeux pour toujours
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
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.
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 💩
""" 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
""" 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")
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.
Suivez toujours le principe du moindre étonnement comme guide.
Code Smell 139 - Code commercial dans l'interface utilisateur
Code Smell 73 - Exceptions pour les cas attendus
Code Odeur 72 - Codes de retour
Null : l'erreur d'un milliard de dollars
Photo de Jasmin Sessler sur Unsplash
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
Vous affectez une valeur à une variable et l'utilisez mais ne la modifiez jamais.
TL;DR : Soyez déclaratif sur la mutabilité.
Refactoring 003 - Extraire la constante
Refactoring 008 - Convertir des variables en constante
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 .
<?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 }
<?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
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.
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é .
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
Le pouvoir maléfique des mutants
Code Smells n'est que mon avis .
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
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
Choisissez une norme de cas
Tiens bon
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.
{ "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" }
{ "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 }
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.
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.
La gestion des normes est facile.
Nous devons les faire respecter.
Code Smell 48 - Code sans normes
Qu'est-ce qu'un nom exactement - Partie I La quête
Toutes les conventions de nommage
Code Smells n'est que mon avis .
Photo de Wolfgang Hasselmann sur Unsplash
Si vous avez trop de cas particuliers, vous vous trompez.
Craig Zerouni
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é.
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
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.
#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)
#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)
Nous pouvons vérifier les constantes spéciales et les valeurs spéciales dans le code.
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.
Code Smell 120 - ID séquentiels
Null : l'erreur d'un milliard de dollars
Y2K22 - L'erreur qui nous embarrasse
Code Smells n'est que mon avis .
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…