paint-brush
So finden Sie die stinkenden Teile Ihres Codes [Teil XXXII]von@mcsee
806 Lesungen
806 Lesungen

So finden Sie die stinkenden Teile Ihres Codes [Teil XXXII]

von Maximiliano Contieri9m2023/03/08
Read on Terminal Reader
Read this story w/o Javascript

Zu lang; Lesen

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. Deshalb müssen sie nicht per se behoben werden ... (Sie sollten sich jedoch damit befassen.) Vorherige Code-SmellsAlle vorherigen Code-Smells (Teil i – XXXI) finden Sie hier.
featured image - So finden Sie die stinkenden Teile Ihres Codes [Teil XXXII]
Maximiliano Contieri HackerNoon profile picture

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

Lösungen

  1. 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 102 – Pfeilcode

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?

Schnell scheitern

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

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

Codegeruch 12 – Null

Code Smell 139 – Geschäftscode in der Benutzeroberfläche

Code Smell 73 – Ausnahmen für erwartete Fälle

Code Smell 72 – Rückgabecodes

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

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

Die böse Macht der Mutanten

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

  1. Wählen Sie einen Gehäusestandard


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

Alle Namenskonventionen

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

  1. Modellieren Sie Sonderfälle mit besonderen Objekten.


  2. Vermeiden Sie 9999, -1 und 0, da es sich dabei um gültige Domänenobjekte und Implementierungskopplungen handelt.


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

Codegeruch 12 – Null

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…