paint-brush
Comment trouver les parties puantes de votre code [Partie XXXII]par@mcsee
806 lectures
806 lectures

Comment trouver les parties puantes de votre code [Partie XXXII]

par Maximiliano Contieri9m2023/03/08
Read on Terminal Reader

Trop long; Pour lire

Ç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 n'ont pas besoin d'être corrigés en soi… (Vous devriez cependant y jeter un coup d'œil.) Odeurs de code précédentesVous pouvez trouver toutes les odeurs de code précédentes (Partie I - XXXI) ici.
featured image - Comment trouver les parties puantes de votre code [Partie XXXII]
Maximiliano Contieri HackerNoon profile picture

Ç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

Solutions

  1. 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 Odeur 102 - Code fléché

Code Smell 36 - Switch/case/else if/else/if instructions

Plus d'informations

Arrêtez d'utiliser implicitement Else

Quand utiliser un autre implicite

Échec rapide

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

  1. 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 Odeur 12 - Nulle

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

  1. 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

  1. Choisissez une norme de cas


  2. 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


  • Vous pourriez atteindre l'ID invalide plus tôt que vous ne le pensez.



  • Drapeaux de couplage de l'appelant aux fonctions.

Solutions

  1. Modélisez des cas spéciaux avec des objets spéciaux.


  2. Évitez 9999, -1 et 0 car ce sont des objets de domaine valides et un couplage d'implémentation.


  3. 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

Code Odeur 12 - Nulle

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…