Definition „Code Smell“ Was sind Code Smells?

Von Gedeon Rauch

Anbieter zum Thema

Den Begriff „Code Smell“ prägte Kent Beck, der Urheber des Extreme Programming, als aussagekräftige Metapher. Wie in der realen Welt ist ein Geruch im Falle von Code ein Hinweis darauf, dass Handlungsbedarf besteht.

Wer einen Code Smell frühzeitig wahrnimmt, kann auf lange Sicht sogar Bugs verhindern,
Wer einen Code Smell frühzeitig wahrnimmt, kann auf lange Sicht sogar Bugs verhindern,
(Bild: Chris F (@chris-f-38966) / Pexels)

Fast jedem unangenehmen Geruch liegt ein Problem zugrunde – und so bezog sich Kent Beck mit dem Begriff „Code Smell“ auch auf den Geruch einer vollen Windel. Wie eine volle Windel zeigt so mancher Code am unangenehmen Code Smell mehr oder weniger subtil an, dass etwas ausgetauscht, gewechselt oder grundlegend verändert werden muss.

Anders als bei klar festgesetzten Begriffen wird die Benutzung einer Metapher etwas legerer gehandhabt. Klare Richtlinien, wann es sich bei einem schlecht optimierten Quellcode um einen Code Smell handelt und wann nicht, gibt es folglich nicht. Sowohl in den Programmiersprachen als auch für einzelne Developer scheiden sich da die Geister.

In der agilen Entwicklung wird Code Smell aber besonders häufig genutzt, deswegen lohnt sich ein tieferes Verständnis. Der Code Smell hat seinen Ursprung zumeist in einem Konflikt mit den klassischen Designprinzipien von Code und verstößt gegen einige grundlegende Regeln. Die Folge ist aber kein Programmfehler oder Systemausfall, sondern eine schlechtere Optimierung oder Wartbarkeit.

Nun ließe sich also argumentieren, so schlecht sei ein Code Smell ja nicht, da das Programm dennoch irgendwie lauffähig ist. Im agile Development ist diese Herangehensweise aber fatal, da folgende Iterationen und Wartungen nicht mehr so leicht durchgeführt werden können wie mit optimiertem Code.

Woher kommt der „stinkige“ Code?

Der Grund für einen Code Smell kann daher beispielsweise eine schnelle Fehlerbehebung sein. Dadurch wird ein Programm irgendwie lauffähig gemacht und der eigentliche Fehler überbrückt. Wird weiter auf diesem wackeligen Fundament gebaut, wird die Wartung und Kontrolle von Version zu Version aufwendiger.

Der Druck, der häufig auf Programmierer*innen lastet, schnell neue Versionen zu liefern oder Updates lauffähig zu machen, sorgt für unsauberen Code. Für die Kund*innen ist der Unterschied zunächst nicht bemerkbar und so ist die Priorisierung von Time-to-Market über einer eleganten Lösung für den Code häufig die Ursache für Probleme beim Code.

Refaktorisierung – Lösungen für Code Smells

In der Regel werden Code Smells durch Refactoring in kurzen Feedbackzyklen (ideal also für agile Development) aufgelöst. Durch kleine und kontrollierte Arbeitsschritte und eine gezielte Isolation bei der Refaktorisierung kann der Code Smell entfernt werden.

Allerdings entsteht hierbei ein interessanter Feedbackloop. Denn Refactoring löst auf der einen Seite Code Smells auf, auf der anderen Seite ist es gerade der Code Smell, der entscheidende Hinweise für das Refactoring gibt. Welche Teile eines Codes refaktorisiert werden müssen und welche Techniken hierfür zum Einsatz kommen, ist maßgeblich vom Code Smell abhängig.

Ohne passendes Problem keine passende Lösung.

Grob werden Code Smells in unterschiedliche Kategorien eingeteilt. Die Application Level Smells, die Class Level Smells und die Method Level Smells. Je nach Stufe äußern Code Smells sich unterschiedlich.

Beispiele auf dem Application Level:

  • Funktionen, Module oder Klassen, die nicht korrekt benannt sind, was ihre Funktion unkenntlich macht
  • Duplizierter Code
  • Identische Veränderungen an mehreren Klassen gleichzeitig (Shotgun Surgery)

Beispiele auf dem Class Level:

  • Eine Klasse, die zu wenig macht (Freeloader)
  • Eine Gruppe von Variablen, die gemeinsam durch mehrere Teile einer Applikation gereicht werden (Data Clump), ohne dass sie zu einem Objekt gemacht wurden
  • Eine abgeleitete Klasse, die die Methoden einer Basisklasse bricht und damit Design by Contract verletzt

Beispiele auf dem Method Level:

  • Eine übergroße Methode (Long Method), die besser geteilt werden sollte und schwer lesbar ist
  • Eine überlange Codezeile, die nur schwer zu lesen, refaktorisieren oder zu verstehen ist (God Line)
  • Eine exzessive Rückgabe von Daten, die mehr Daten bereit stellt als benötigt/angefordert

Darum sollten üble Gerüche beim Coden vermieden und beseitigt werden

Wie bereits erwähnt, muss ein Code Smell noch lange nicht in einem nicht lauffähigen oder eingeschränkten Programm enden. Tatsächlich sind die Ursachen für Code Smells tatsächlich eher darin zu finden, dass eine Applikation noch mit allen Mitteln lauffähig gemacht wurde. Auch Robert C. Martins Ansicht, man finde in den Code Smells ein Wertesystem für die handwerklichen Fertigkeiten von Programmiererinnen und Programmierern, wirkt hier übermäßig wertend.

Die Wahrheit ist, dass ein Code Smell in der Theorie durchaus vermeidbar ist, die praktischen Erfordernisse der Softwareauslieferung aber oftmals Code Gerüche mit sich bringen. Dennoch sollten Smells im Code schnell ausgeräumt werden, da sie die perfekte Nährgrundlage für zukünftige Bugs liefern und das Risiko erhöhen, dass spätere Versionen Probleme bekommen. Sauberer Code durch Reviews und Refaktorisierung ist das beste Mittel gegen Code Smell und für einen simplen und optimierten Code.

(ID:48586964)

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung