20 histoires avec 5 odeurs de code chacune sont 100 odeurs de code, n'est-ce pas ?
Odeurs de code précédentes
Nous allons continuer...
Code Smell 96 - Mes Objets
Vous ne possédez pas d'objets.
TL;DR : n'utilisez pas my comme préfixe de nom.
Problèmes
- Manque de contexte
- Défaut de bijection
Solutions
- Supprimer mon préfixe.
- Passez à un rôle suggérant un nom.
Le contexte
Plusieurs anciens tutoriels utilisent le mot "mon" comme un nom paresseux. Ceci est vague et conduit à des erreurs de contexte.
Exemple de code
Mauvais
MainWindow myWindow = Application.Current.MainWindow as MainWindow;
Droit
MainWindow salesWindow = Application.Current.MainWindow as MainWindow; /* Since window is instanciated, we are currently working with a specialized window playing a special role */
Détection
- [x] Automatique
Nous pouvons dire à nos linters et vérificateurs statiques de rechercher ce préfixe et de nous avertir.
Mots clés
- Appellation
Conclusion
Évitez d'utiliser mon . Les objets changent en fonction du contexte d'utilisation.
Plus d'informations
Crédits
Photo de Michał Bożek sur Unsplash
En pensant à mon expérience de modification de code, je vois que je passe beaucoup plus de temps à lire le code existant qu'à écrire du nouveau code. Si je veux rendre mon code bon marché, je dois donc le rendre facile à lire.
Kent Beck
Excellentes citations de génie logiciel
Code Smell 97 - Messages d'erreur sans empathie
Nous devons porter une attention particulière aux descriptions d'erreurs pour les utilisateurs (et nous-mêmes).
TL ; DR : Utilisez des descriptions significatives et suggérez des actions correctives.
Problèmes
- Le principe de la moindre surprise
Solutions
- Utiliser des messages d'erreur déclaratifs
- Afficher des actions de sortie claires
Le contexte
Les programmeurs sont rarement des experts UX.
Nous sous-estimons également le fait que nous pouvons être des deux côtés du comptoir.
Exemple de code
Mauvais
alert("Cancel the appointment?", "Yes", "No"); // No consequences // Options not clear
Droit
alert("Cancel the appointment? \n" + "You will lose all the history", "Cancel Appointment", "Keep Editing"); // Consequences are clear // Choice options have context
Détection
- [x] Manuel
Nous devons lire tous les messages d'exception dans les revues de code.
Mots clés
- Exceptions
- UX
Conclusion
Nous devons penser à nos utilisateurs finaux lorsque nous levons une exception ou affichons des messages.
Crédits
Photo par visuels sur Unsplash
Même s'il est bien connu que les programmeurs ne font jamais d'erreurs, c'est toujours une bonne idée de faire plaisir aux utilisateurs en vérifiant les erreurs aux points critiques de votre programme.
Robert D. Schneider
Code Odeur 98 - Fautes d'orthographe
L'orthographe et la lisibilité sont très importantes pour les humains et pas importantes pour les machines.
TL; DR : Faites attention à vos noms.
Problèmes
- Lisibilité
- Plus difficile de rechercher des termes dans le code.
Solutions
- Vérifiez l'orthographe de votre code.
- Utiliser un IDE avec vérification orthographique
Le contexte
Beaucoup d'entre nous ne parlent pas l'anglais comme première langue.
Nous devons apporter un soin particulier à nos textes et à nos noms.
Cet article a une faute de frappe dans son titre comme preuve de contexte et aussi un clickbait 😀
Exemple de code
Mauvais
comboFeededBySupplyer = supplyer.providers();
Droit
comboFedBySupplier = supplier.providers();
Détection
Mots clés
- Lisibilité
- Appellation
- Style de code
Conclusion
Portez une attention particulière à vos noms.
Vous serez probablement la personne qui lira le code dans quelques mois.
Rapports
Code Smell 48 - Code sans normes
Plus d'informations
Qu'est-ce qu'un nom exactement — Partie I La quête
Qu'est-ce qu'un nom exactement - Partie II Rehab
Crédits
Photo de Brett Jordan sur Unsplash
À l'intérieur de chaque grand programme bien écrit se trouve un petit programme bien écrit.
Voiture Hoare
Code Odeur 99 - Première Seconde
Combien de fois voyons-nous des noms d'arguments paresseux ?
TL;DR : Nommez vos arguments en fonction du rôle et non de la position accidentelle
Problèmes
- Lisibilité
- Noms révélateurs d'intention
Solutions
- Utilisez des noms significatifs
Le contexte
Lorsque nous écrivons des méthodes, nous ne nous arrêtons généralement pas pour trouver des noms décents.
Nous ne refactorisons jamais l'évidence non plus.
Exemple de code
Mauvais
class Calculator: def subtract(self, first, second): return first - second class CalculatorTest def test_multiply(): assert equals(first, second)
Droit
class Calculator: def subtract(self, minuend, subtrahend): return minuend - subtrahend class CalculatorTest def test_multiply(): assert equals(expectedValue, realValue)
Détection
- [x] Manuel
Nous pouvons avertir des mots interdits comme 'first' et 'second' comme noms d'arguments.
Mots clés
- Lisibilité
Conclusion
Suivez toujours la règle suggérant le paramètre.
Nommez vos collaborateurs selon le rôle.
Rapports
Code Smell 65 - Variables nommées d'après les types
Plus d'informations
Qu'est-ce qu'un nom exactement - Partie II Rehab
Crédits
Photo de Priscilla Du Preez sur Unsplash
Le code source final est la véritable conception du logiciel.
Jack Reeves
Code Odeur 100 - GoTo
GOTO était considéré comme nuisible il y a 50 ans
TL; DR : N'utilisez jamais GoTo.
Problèmes
- Lisibilité
- Code difficile à suivre
Solutions
- Remplacer GOTO par du code structuré
- Utiliser des exceptions
Le contexte
J'ai commencé à programmer en Basic.
GOTO y a été fortement abusé.
J'ai dû apprendre la programmation structurée à partir de zéro en mode Rehab.
Exemple de code
Mauvais
for x < 0 { if x > -1e-09 { goto small } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { goto small } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small: if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) }
Droit
for x < 0 { if x > -1e-09 { return small(x, z) } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { return small(x, z) } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small(x, z) { if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) } }
Détection
- [x] Automatique
Dans les langages supportant GOTO , nos linters peuvent nous mettre en garde contre son utilisation.
Mots clés
- Lisibilité
Conclusion
Nous avons reconnu les problèmes de GOTO il y a quelques décennies.
Le problème est toujours présent dans les langages modernes comme GoLang, PHP, Perl etc.
Heureusement, la plupart des programmeurs évitent la phrase GOTO. Le prochain objectif sera de considérer l'utilisation nuisible de null .
Courtoisie XKCD
Rapports
Plus d'informations
Crédits
Photo de Jens Johnsson sur Unsplash
Il est pratiquement impossible d'enseigner une bonne programmation à des étudiants qui ont déjà été exposés au BASIC : en tant que programmeurs potentiels, ils sont mentalement mutilés au-delà de tout espoir de régénération.
Edsger Dijkstra
Excellentes citations de génie logiciel
Et c'est tout pour l'instant, nous avons franchi le cap des 100.
Le prochain article expliquera 5 autres odeurs de code !