Es stinkt, weil es wahrscheinlich viele Fälle gibt, in denen es bearbeitet oder verbessert werden könnte.
Die meisten dieser Gerüche sind nur Hinweise darauf, dass etwas nicht stimmt. Daher ist es nicht erforderlich, sie per se zu reparieren ... (Sie sollten sich jedoch darum kümmern.)
Vorherige Code-Gerüche
Alle bisherigen Code-Smells (Teil i – XXXI) finden Sie hier .
Lass uns weitermachen...
Code Smell 156 – Implizites Else
Wir lernen if/else an unserem ersten Programmiertag. Dann vergessen wir das andere.
TL;DR: Seien Sie explizit. Auch bei Else.
Probleme
- Lesbarkeit
- Kognitive Belastung
- Unvorhergesehene Bedingungen
- Verstoß gegen das Fail-Fast-Prinzip
Lösungen
- Schreiben Sie das explizite else
Kontext
Wenn wir zu einem IF-Satz vorzeitig zurückkehren, können wir den else-Teil weglassen.
Anschließend entfernen wir das IF und verwenden Polymorphismus.
Dann verpassen wir die wahren Fälle.
Beispielcode
Falsch
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
Rechts
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
Erkennung
- [x] Automatisch
Wir können Syntaxbäume überprüfen, sie analysieren und vor fehlenden anderen Elementen warnen.
Wir können sie auch umschreiben und Mutationstests durchführen.
Stichworte
- Bedingungen
Abschluss
Diese Art von Geruch löst eine Menge öffentlicher Debatten und Hass aus.
Wir müssen Meinungen austauschen und alle Vor- und Nachteile abwägen.
Beziehungen
Code Smell 36 – Switch/case/else if/else/if-Anweisungen
Mehr Info
Hören Sie auf, implizites Else zu verwenden
Wann sollte implizites Else verwendet werden?
So werden Sie lästige IFs für immer los
Credits
Foto von Elena Mozhvilo auf Unsplash
Das größte Problem in Softwareteams besteht darin, sicherzustellen, dass jeder versteht, was alle anderen tun.
Martin Fowler
Code Geruch 157 – Gleichgewicht bei 0
Heute erwartete ich eine Zahlung in meinem Portemonnaie. Der Saldo war 0. Ich geriet in Panik.
TL;DR: Null ist nicht 0. Fehler ist nicht 0. Nur 0 ist 0.
Probleme
- Nullen
- UX
- Benutzerfreundlichkeit
Lösungen
- Unterscheiden Sie klar zwischen einer Null und einem Fehler.
Kontext
Ich habe viel über Sicherheitsthemen gelesen.
Besonders bei Krypto.
Letzte Woche habe ich von einem Krypto-Hack-Thread gelesen.
Als mein Geldbeutel 0 als Guthaben anzeigte, geriet ich in Panik.
Es war nur ein UX-Geruch.
Die Blockchain war nicht erreichbar 💩
Beispielcode
Falsch
""" 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
Rechts
""" 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")
Erkennung
- [x] Handbuch
Das ist ein Designgeruch.
Wir können Muster finden, wenn eine Ausnahme oder ein Rückkehrcode ausgelöst und mit einer 0 maskiert wird.
Stichworte
- UX
Abschluss
Befolgen Sie stets das Prinzip „Das geringste Erstaunen“ als Leitfaden.
Beziehungen
Code Smell 139 – Geschäftscode in der Benutzeroberfläche
Code Smell 73 – Ausnahmen für erwartete Fälle
Mehr Info
Null: Der Milliarden-Dollar-Fehler
Kredit
Foto von Jasmin Sessler auf Unsplash
Haftungsausschluss
Code Smells sind nur meine Meinung .
Mein wirklicher Kritikpunkt an Null ist, dass es unnötigerweise die ganze Qual wieder mit sich bringt, entscheiden zu müssen, ob man sein Programm schnell ohne Überprüfung oder langsam mit Überprüfung ausführen möchte.
Tony Hoare (Null-Erfinder)
Tolle Zitate zum Thema Software-Engineering
Code Smell 158 – Variablen nicht variabel
Sie weisen einer Variablen einen Wert zu und verwenden ihn, ändern ihn jedoch nie.
TL;DR: Seien Sie deklarativ zur Veränderlichkeit.
Probleme
- Lesbarkeit
- Ehren Sie die Veränderlichkeit der Bijektion .
- Mögliche Leistungs- und Speicherprobleme.
Lösungen
- Ändern Sie die Variable in eine Konstante und machen Sie sich über ihren Gültigkeitsbereich klar.
Refactorings
Refactoring 003 – Konstante extrahieren
Refactoring 008 – Variablen in Konstanten konvertieren
Kontext
Wir lernen immer aus der Domäne.
Manchmal vermuten wir, dass sich ein Wert mit dem MAPPER ändern kann.
Später erfahren wir, dass sich daran nichts ändern wird.
Deshalb müssen wir es zu einer Konstante hochstufen.
Dadurch werden auch magische Konstanten vermieden.
Beispielcode
Falsch
<?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 }
Rechts
<?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
Erkennung
- [x] Automatisch
Viele Linters prüfen, ob die Variable nur eine Zuweisung hat.
Wir können auch Mutationstests durchführen und versuchen, die Variable zu ändern, um zu sehen, ob die Tests fehlschlagen.
Stichworte
- Wandlungsfähigkeit
Abschluss
Wir müssen uns selbst herausfordern und umgestalten, wenn der Variablenbereich klar ist und wir mehr über seine Eigenschaften und Veränderlichkeit erfahren.
Beziehungen
Code Smell 116 – Mit „var“ deklarierte Variablen
Code Smell 127 – Veränderliche Konstanten
Code Smell 107 – Wiederverwendung von Variablen
Code Smell 02 – Konstanten und magische Zahlen
Mehr Info
Haftungsausschluss
Code Smells sind nur meine Meinung .
Credits
Foto von Noah Buscher auf Unsplash
Ein komplexes System, das funktioniert, hat sich immer aus einem einfachen, funktionierenden System entwickelt.
John Gall
Code SmElL 159 - Mixed_CASeI
Eine ernsthafte Entwicklung wird von vielen verschiedenen Menschen durchgeführt. Wir müssen anfangen, uns zu einigen.
TL;DR: Mischen Sie nicht verschiedene Groß-/Kleinschreibungsumwandlungen
Probleme
- Lesbarkeit
- Wartbarkeit
Lösungen
Wählen Sie einen Gehäusestandard
Halte daran fest
Kontext
Wenn verschiedene Menschen gemeinsam Software entwickeln, kann es zu persönlichen oder kulturellen Unterschieden kommen.
Einige bevorzugen CamelCase 🐫, andere Snake_Case 🐍, MACRO_CASE🗣️ und viele andere .
Der Code sollte einfach und lesbar sein.
Beispielcode
Falsch
{ "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" }
Rechts
{ "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 }
Erkennung
- [x] Automatisch
Wir können unsere Linters über die allgemeinen Namensstandards unseres Unternehmens informieren und diese durchsetzen.
Immer wenn neue Leute in der Organisation ankommen, sollte ein automatisierter Test sie/ihn höflich auffordern, den Code zu ändern.
Ausnahmen
Wann immer wir mit Code interagieren müssen, der außerhalb unseres Geltungsbereichs liegt, sollten wir die Standards des Kunden verwenden, nicht unsere.
Stichworte
- Benennung
Abschluss
Der Umgang mit Standards ist einfach.
Wir müssen sie durchsetzen.
Beziehungen
Code Smell 48 – Code ohne Standards
Mehr Info
Was genau ist ein Name – Teil I Die Quest
Haftungsausschluss
Code Smells sind nur meine Meinung .
Credits
Foto von Wolfgang Hasselmann auf Unsplash
Wenn Sie zu viele Sonderfälle haben, machen Sie es falsch.
Craig Zerouni
Codegeruch 160 – Ungültige ID = 9999
Maxint ist eine sehr gute Nummer für eine ungültige ID. Wir werden es nie erreichen.
TL;DR: Koppeln Sie keine echten IDs mit ungültigen. Tatsächlich: Vermeiden Sie Ausweise.
Probleme
- Möglicherweise erreichen Sie die ungültige ID früher als Sie denken.
- Verwenden Sie auch keine Nullen für ungültige IDs.
- Kopplungsflags vom Aufrufer an Funktionen.
Lösungen
Modellieren Sie Sonderfälle mit besonderen Objekten.
Vermeiden Sie 9999, -1 und 0, da es sich dabei um gültige Domänenobjekte und Implementierungskopplungen handelt.
Nullobjekt einführen
Kontext
In den Anfängen der Informatik waren die Datentypen streng.
Dann haben wir den Milliarden-Dollar-Fehler erfunden.
Dann sind wir erwachsen geworden und haben spezielle Szenarien mit polymorphen Sonderwerten modelliert.
Beispielcode
Falsch
#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)
Rechts
#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)
Erkennung
- [x] Halbautomatisch
Wir können im Code nach speziellen Konstanten und speziellen Werten suchen.
Stichworte
- Null
Abschluss
Wir sollten Zahlen verwenden, um uns auf die externen Identifikatoren zu beziehen.
Wenn keine externe Kennung vorhanden ist, handelt es sich nicht um eine Zahl.
Beziehungen
Code Smell 120 – Sequentielle IDs
Mehr Info
Null: Der Milliarden-Dollar-Fehler
Y2K22 – Der Fehler, der uns in Verlegenheit bringt
Haftungsausschluss
Code Smells sind nur meine Meinung .
Credits
Foto von Markus Spiske auf Unsplash
Käfer lauern in Ecken und versammeln sich an Grenzen.
Boris Beizer
5 weitere Code-Smells folgen in Kürze…