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

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

von Maximiliano Contieri7m2023/04/07
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 – XXXIII) finden Sie hier.
featured image - So finden Sie die stinkenden Teile Ihres Codes [Teil XXXIV]
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 – XXXIII) finden Sie hier .


Lass uns weitermachen...


Code Smell 166 – Low-Level-Fehler auf der Benutzeroberfläche

Schwerwiegender Fehler: Nicht erfasster Fehler: Klasse „logs_queries_web“ nicht in /var/www/html/query-line.php:78 gefunden


Stack-Trace: #0 {main} wird in /var/www/html/query-line.php in Zeile 718 geworfen


TL;DR: Erkennen Sie Ihre Fehler. Sogar die, die Sie nicht erwarten.

Probleme

  • Sicherheit


  • Fehlerbehandlung


  • Fehlerprotokollierung


  • Schlechte UX-Erfahrung

Lösungen

  1. Verwenden Sie einen Handler der obersten Ebene.


  2. Vermeiden Sie Sprachen, die Rückgabecodes bevorzugen.


  3. Erwarten Sie Datenbank- und Low-Level-Fehler.

Kontext

Selbst im Jahr 2022 können wir „seriöse“ Websites sehen, die gelegentlichen Benutzern eine Stack- oder Debugging-Meldung anzeigen.

Beispielcode

Falsch

 <? Fatal error: Uncaught Error: Class 'MyClass' not found in /nstest/src/Container.php:9

Rechts

 <? // A user-defined exception handler function function myException($exception) { logError($exception->description()) // We don't show Exception to final users } // Set user-defined exception handler function set_exception_handler("myException");

Erkennung

  • [x] Automatisch

Wir können Mutationstests verwenden, um Probleme zu simulieren und zu sehen, ob sie richtig behandelt werden.

Stichworte

  • Sicherheit

Abschluss

Wir müssen weiter reifen.


Unsere Lösungen sollten nicht schlampig sein.



Wir müssen unseren Ruf als seriöse Softwareentwickler verbessern.

Beziehungen

Code Smell 72 – Rückgabecodes

Mehr Info

Schnell scheitern

Haftungsausschluss

Code Smells sind nur meine Meinung .

Credits

Foto von Jesse Orrico auf Unsplash


80 Prozent meiner Probleme sind einfache Logikfehler. 80 Prozent der verbleibenden Probleme sind Zeigerfehler. Die verbleibenden Probleme sind schwierig.

Mark Donner

Tolle Zitate zum Thema Software-Engineering


Code Smell 167 – Hashing-Vergleich

Hashing garantiert, dass zwei Objekte unterschiedlich sind. Nicht, dass sie gleich wären.


TL;DR: Wenn Sie den Hash prüfen, sollten Sie auch die Gleichheit prüfen

Probleme

Lösungen

  1. Auf Hash prüfen (schnell) und dann auf Gleichheit prüfen (langsam)

Kontext

Am 7. Oktober 2022 musste eine der größeren Blockchains gestoppt werden.


Diese Nachricht war schockierend, da die meisten Blockchains per Definition dezentralisiert sind.


Den vollständigen Artikel können Sie hier lesen:

Wie ein Hacker 566 Millionen US-Dollar stahl, indem er einen Code-Smell ausnutzte

Beispielcode

Falsch

 public class Person { public String name; // Public attributes are another smell @Override public boolean equals(Person anotherPerson) { return name.equals(anotherPerson.name); } @Override public int hashCode() { return (int)(Math.random()*256); } // This is just an example of non-correlation // When using HashMaps we can make a mistake // and guess the object is not present in the collection }

Rechts

 public class Person { public String name; // Public attributes are another smell @Override public boolean equals(Person anotherPerson) { return name.equals(anotherPerson.name); } @Override public int hashCode() { return name.hashCode(); } // This is just an example of non-correlation }

Erkennung

  • [x] Halbautomatisch

Viele Linters haben Regeln für die Neudefinition von Hash und Gleichheit.


Mit Mutationstests können wir verschiedene Objekte mit demselben Hash versehen und unsere Tests überprüfen.

  • Identität
  • Sicherheit

Abschluss

Jede Leistungsverbesserung hat ihre Nachteile.


Caches und Replikationen sind bemerkenswerte Beispiele.


Wir können (müssen) sie mit Bedacht nutzen.

Beziehungen

Code Smell 49 – Caches

Code Smell 150 – Gleicher Vergleich

Mehr Info

Gleichheit und Hash

Hashcode in Java

Hashcode vs. Gleich

Haftungsausschluss

Code Smells sind nur meine Meinung .


Das wird einige Ihrer Leser überraschen, aber mein Hauptinteresse gilt nicht der Computersicherheit. Mein Hauptinteresse liegt darin, Software zu schreiben, die wie vorgesehen funktioniert.

Wietse Venema

Tolle Zitate zum Thema Software-Engineering


Code Smell 168 – Undokumentierte Entscheidungen

Wir müssen einige Änderungen vornehmen. Wir müssen uns darüber im Klaren sein, warum

TL;DR: Seien Sie bei Ihren Design- oder Implementierungsentscheidungen deklarativ.

Probleme

  • Codekommentare
  • Mangelnde Testbarkeit

Lösungen

  1. Machen Sie die Gründe deutlich.
  2. Konvertieren Sie den Kommentar in eine Methode.

Kontext

Manchmal finden wir, dass willkürliche Regeln nicht so leicht überprüfbar sind.


Wenn wir einen fehlgeschlagenen Test nicht schreiben können, benötigen wir anstelle eines Kommentars eine Funktion mit einem hervorragenden und deklarativen Namen.

Beispielcode

Falsch

 // We need to run this process with more memory set_memory("512k) run_process();

Rechts

 increase_memory_to_avoid_false_positives(); run_process();

Erkennung

  • [x] Halbautomatisch

Das ist ein semantischer Geruch.


Wir können Kommentare erkennen und uns warnen.

Stichworte

  • Kommentare

Abschluss

Code ist Prosa. Und Designentscheidungen sollten narrativ sein.

Beziehungen

Code Smell 05 – Kommentarmissbraucher

Code Smell 75 – Kommentare innerhalb einer Methode

Haftungsausschluss

Code Smells sind nur meine Meinung .

Credits

Foto von Goh Rhy Yan auf Unsplash


Programme altern, genau wie Menschen. Wir können die Alterung nicht verhindern, aber wir können ihre Ursachen verstehen, ihre Auswirkungen begrenzen und einen Teil der Schäden rückgängig machen.

Mario Fusco

Tolle Zitate zum Thema Software-Engineering


Code Smell 169 – Geklebte Methoden

Machen Sie nicht zwei oder mehr Dinge auf einmal.

TL;DR: Versuchen Sie, Ihre Methoden so atomar wie möglich zu gestalten

Probleme

  • Gekoppelter Code
  • Schwieriger zu testen
  • Schwerer zu lesen

Lösungen

  1. Brechen Sie die Methode

Refactorings

https://maximilianocontieri.com/refactoring-002-extract-method

Kontext

Wenn Sie eine Methode mit „Und“ benennen, verpassen Sie wahrscheinlich die Möglichkeit, eine Methode zu extrahieren und zu unterbrechen.

Beispielcode

Falsch

 calculatePrimeFactorsRemoveDuplicatesAndPrintThem() // Three responsibilities

Rechts

 calculatePrimeFactors(); removeDuplicates(); printNumbers(); // Three different methods // We can test them and reuse them

Erkennung

  • [x] Halbautomatisch

Einige Linters können uns vor Methoden warnen, die den Begriff „und“ enthalten.

Stichworte

  • Kupplung

Abschluss

Bei der Entwicklung von Methoden ist es sehr wichtig, eine Gummi-Enten-Geschichte zu spielen und uns selbst zu sagen, ob wir die Dinge richtig machen.

Beziehungen

%[ https://maximilianocontieri.com/code-smell-85-and-functions ]

Haftungsausschluss

Code Smells sind nur meine Meinung .

Credits

Foto von Scott Sanker auf Unsplash


Das Erlernen der Programmierkunst besteht wie bei den meisten anderen Disziplinen darin, zunächst die Regeln zu lernen und dann zu lernen, wann man sie brechen muss.

Joshua Bloch


Code Smell 170 – Refactor mit funktionalen Änderungen

Die Entwicklung ist großartig. Refactoring ist erstaunlich. Machen Sie es nicht gleichzeitig

TL;DR: Führen Sie nicht gleichzeitig eine Funktionsänderung und ein Refactoring durch.

Probleme

  • Schwer zu überprüfende Lösungen
  • Konflikte zusammenführen

Lösungen

  1. Ändern Sie niemals die Funktionalität während des Refactorings

Kontext

Manchmal stellen wir fest, dass für die weitere Entwicklung ein Refactoring erforderlich ist.


Wir sind Experten im Lernen.


Wir sollten unsere Lösung auf Eis legen. Arbeiten Sie an der Umgestaltung und fahren Sie mit unserer Lösung fort.

Beispielcode

Falsch

 getFactorial(n) { return n * getFactorial(n); } // Rename and Change factorial(n) { return n * factorial(n-1); } // This is a very small example // Things go works while dealing with huge code

Rechts

 getFactorial(n) { return n * getFactorial(n); } // Change getFactorial(n) { return n * getFactorial(n-1); } // Run the tests factorial(n) { return n * factorial(n-1); } // Rename

Erkennung

Das ist ein Refactoring-Geruch.

  • [x] Handbuch

Stichworte

  • Refactoring

Abschluss

Wir sollten einen physischen Token verwenden.


Entweder befinden wir uns in der Refactoring-Phase oder in der Entwicklungsphase.

Haftungsausschluss

Code Smells sind nur meine Meinung .

Credits

Foto von Dannie Jing auf Unsplash


Wenn ich Code studiere, führt mich Refactoring zu einem höheren Verständnisniveau, das mir sonst entgehen würde. Diejenigen, die Comprehension Refactoring als nutzloses Herumspielen am Code abtun, erkennen nicht, dass sie nie die Chancen erkennen, die sich hinter der Verwirrung verbergen.

Martin Fowler


5 weitere Code-Smells folgen in Kürze…