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.)
Alle bisherigen Code-Smells (Teil i – XXXI) finden Sie hier .
Lass uns weitermachen...
Wir lernen if/else an unserem ersten Programmiertag. Dann vergessen wir das andere.
TL;DR: Seien Sie explizit. Auch bei Else.
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.
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); }
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.
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.
Code Smell 36 – Switch/case/else if/else/if-Anweisungen
Hören Sie auf, implizites Else zu verwenden
Wann sollte implizites Else verwendet werden?
So werden Sie lästige IFs für immer los
Foto von Elena Mozhvilo auf Unsplash
Das größte Problem in Softwareteams besteht darin, sicherzustellen, dass jeder versteht, was alle anderen tun.
Martin Fowler
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.
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 💩
""" 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")
Das ist ein Designgeruch.
Wir können Muster finden, wenn eine Ausnahme oder ein Rückkehrcode ausgelöst und mit einer 0 maskiert wird.
Befolgen Sie stets das Prinzip „Das geringste Erstaunen“ als Leitfaden.
Code Smell 139 – Geschäftscode in der Benutzeroberfläche
Code Smell 73 – Ausnahmen für erwartete Fälle
Null: Der Milliarden-Dollar-Fehler
Foto von Jasmin Sessler auf Unsplash
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
Sie weisen einer Variablen einen Wert zu und verwenden ihn, ändern ihn jedoch nie.
TL;DR: Seien Sie deklarativ zur Veränderlichkeit.
Refactoring 003 – Konstante extrahieren
Refactoring 008 – Variablen in Konstanten konvertieren
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.
<?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
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.
Wir müssen uns selbst herausfordern und umgestalten, wenn der Variablenbereich klar ist und wir mehr über seine Eigenschaften und Veränderlichkeit erfahren.
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
Code Smells sind nur meine Meinung .
Foto von Noah Buscher auf Unsplash
Ein komplexes System, das funktioniert, hat sich immer aus einem einfachen, funktionierenden System entwickelt.
John Gall
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
Wählen Sie einen Gehäusestandard
Halte daran fest
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.
{ "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 }
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.
Wann immer wir mit Code interagieren müssen, der außerhalb unseres Geltungsbereichs liegt, sollten wir die Standards des Kunden verwenden, nicht unsere.
Der Umgang mit Standards ist einfach.
Wir müssen sie durchsetzen.
Code Smell 48 – Code ohne Standards
Was genau ist ein Name – Teil I Die Quest
Code Smells sind nur meine Meinung .
Foto von Wolfgang Hasselmann auf Unsplash
Wenn Sie zu viele Sonderfälle haben, machen Sie es falsch.
Craig Zerouni
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.
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
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.
#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)
Wir können im Code nach speziellen Konstanten und speziellen Werten suchen.
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.
Code Smell 120 – Sequentielle IDs
Null: Der Milliarden-Dollar-Fehler
Y2K22 – Der Fehler, der uns in Verlegenheit bringt
Code Smells sind nur meine Meinung .
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…