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
Verwenden Sie einen Handler der obersten Ebene.
Vermeiden Sie Sprachen, die Rückgabecodes bevorzugen.
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
Mehr Info
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
- 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 150 – Gleicher Vergleich
Mehr Info
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
- Machen Sie die Gründe deutlich.
- 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
- 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
- Ä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…