<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Code-Smell</id>
	<title>Code-Smell - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Code-Smell"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Code-Smell&amp;action=history"/>
	<updated>2026-05-20T10:07:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Code-Smell&amp;diff=806325&amp;oldid=prev</id>
		<title>imported&gt;Niklas0960: /* growthexperiments-addlink-summary-summary:2|0|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Code-Smell&amp;diff=806325&amp;oldid=prev"/>
		<updated>2025-02-03T05:49:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|0|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Unter &amp;#039;&amp;#039;&amp;#039;Code-Smell&amp;#039;&amp;#039;&amp;#039;, kurz &amp;#039;&amp;#039;&amp;#039;Smell&amp;#039;&amp;#039;&amp;#039; ([[Englische Sprache|engl.]] ‚[schlechter] Geruch‘) oder deutsch &amp;#039;&amp;#039;&amp;#039;übelriechender Code&amp;#039;&amp;#039;&amp;#039; versteht man in der [[Programmierung]] ein [[Konstrukt]], das eine Überarbeitung des Programm-Quelltextes nahelegt. Dem Vernehmen nach stammt die [[Metapher]] &amp;#039;&amp;#039;Smell&amp;#039;&amp;#039; von [[Kent Beck]] und erlangte weite Verbreitung durch das Buch &amp;#039;&amp;#039;Refactoring&amp;#039;&amp;#039; von [[Martin Fowler]]. Unter dem Begriff sollten handfestere Kriterien für [[Refactoring]] beschrieben werden, als das durch den vagen Hinweis auf Programmästhetik geschehen würde.&lt;br /&gt;
&lt;br /&gt;
Bei Code-Smell geht es nicht um [[Programmfehler|Programm-]] oder gar [[Syntaxfehler]], sondern um funktionierenden Programmcode, der aber schlecht strukturiert ist. Das größte Problem liegt darin, dass der Code für den Programmierer schwer verständlich ist, so dass sich bei Korrekturen und Erweiterungen häufig wieder neue Fehler einschleichen. Code-Smell kann auch auf ein tieferes Problem hinweisen, das in der schlechten Struktur verborgen liegt und erst durch eine Überarbeitung erkannt wird.&lt;br /&gt;
&lt;br /&gt;
== Verbreitete Smells ==&lt;br /&gt;
Die folgenden von Martin Fowler und Kent Beck beschriebenen Smells&amp;lt;ref&amp;gt;{{Literatur | Autor=Martin Fowler | Titel=Refactoring. Wie Sie das Design vorhandener Software verbessern | Verlag=Addison-Wesley | Ort=München | Jahr=2000 | Seiten=67–82 | ISBN=3-8273-1630-8 | Originalsprache=en | Originaltitel=Refactoring. Improving The Design Of Existing Code | Übersetzer=Bernd Kahlbrandt}}&amp;lt;/ref&amp;gt; beziehen sich auf die [[objektorientierte Programmierung]], haben aber naheliegende Entsprechungen unter anderen Programmier-Paradigmen.&lt;br /&gt;
&lt;br /&gt;
;[[Code-Duplizierung]]: Der gleiche Code kommt an verschiedenen Stellen vor.&lt;br /&gt;
;Lange Methode: Eine [[Methode (Programmierung)|Methode]] (Funktion, Prozedur) ist zu lang.&lt;br /&gt;
;Große Klasse: Eine [[Klasse (Programmierung)|Klasse]] ist zu umfangreich, umfasst zu viele Instanzvariablen und duplizierten Code. Siehe auch [[Gottobjekt]].&lt;br /&gt;
;Lange Parameterliste: Anstatt ein Objekt an eine Methode zu übergeben, werden Objekt-Attribute extrahiert und der Methode als lange [[Parameter (Informatik)|Parameter]]liste übergeben.&lt;br /&gt;
;Divergierende Änderungen: Für eine Änderung muss eine Klasse an mehreren Stellen angepasst werden.&lt;br /&gt;
;Schrotkugeln herausoperieren (engl. Shotgun Surgery): Dieser Smell ist noch gravierender als divergierende Änderungen: Für eine Änderung müssen weitere Änderungen an vielen Klassen durchgeführt werden.&lt;br /&gt;
;Neid (engl. Feature Envy): Eine Methode interessiert sich mehr für die Eigenschaften – insbesondere die Daten – einer anderen Klasse als für jene ihrer eigenen Klasse.&lt;br /&gt;
;Datenklumpen: Eine Gruppe von Objekten kommt häufig zusammen vor: als Felder in einigen Klassen und als Parameter vieler Methoden.&lt;br /&gt;
;Neigung zu elementaren Typen (engl. Primitive Obsession): Elementare Typen werden benutzt, obwohl auch für einfache Aufgaben Klassen und Objekte aussagekräftiger sind.&lt;br /&gt;
;[[Case-Anweisung]]en in objektorientiertem Code: Switch-Case-Anweisungen werden benutzt, obwohl [[Polymorphie (Programmierung)|Polymorphismus]] sie weitgehend überflüssig macht und das damit zusammenhängende Problem des duplizierten Codes löst.&lt;br /&gt;
;Parallele Vererbungshierarchien: Zu jeder Unterklasse in der einen Hierarchie gibt es immer auch eine Unterklasse in einer anderen Hierarchie.&lt;br /&gt;
;Faule Klasse: Eine Klasse leistet zu wenig, um ihre Existenz zu rechtfertigen.&lt;br /&gt;
;Spekulative Allgemeinheit: Es wurden alle möglichen Spezialfälle vorgesehen, die gar nicht benötigt werden; solch allgemeiner Code braucht Aufwand in der Pflege, ohne dass er etwas nützt.&lt;br /&gt;
;Temporäre Felder: Ein Objekt verwendet eine Variable nur unter bestimmten Umständen – der Code ist schwer zu verstehen und zu [[debuggen]], weil das Feld scheinbar nicht verwendet wird.&lt;br /&gt;
;Nachrichtenketten: Das [[Gesetz von Demeter]] wird verletzt.&lt;br /&gt;
;Middle Man (Vermittler): Eine Klasse delegiert alle Methodenaufrufe an eine andere Klasse.&lt;br /&gt;
;Unangebrachte Intimität: Zwei Klassen haben zu enge Verflechtungen miteinander.&lt;br /&gt;
;Alternative Klassen mit verschiedenen Schnittstellen: Zwei Klassen machen das gleiche, verwenden hierfür aber unterschiedliche Schnittstellen.&lt;br /&gt;
;Inkomplette Bibliotheksklasse: Eine Klasse einer [[Programmbibliothek]] benötigt Erweiterungen, um in einem für sie geeigneten Bereich verwendet werden zu können.&lt;br /&gt;
;Datenklasse: Klassen mit Feldern und Zugriffsmethoden ohne Funktionalität.&lt;br /&gt;
;Ausgeschlagenes Erbe (engl. Refused Bequest): Unterklassen brauchen die Methoden und Daten gar nicht, die sie von den Oberklassen erben (siehe auch [[Liskovsches Substitutionsprinzip]])&lt;br /&gt;
;Kommentare: Kommentare erleichtern im Allgemeinen die Verständlichkeit. Kommentare scheinen jedoch häufig genau dort notwendig zu sein, wo der Code schlecht ist. Kommentare können somit ein Hinweis auf schlechten Code sein.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Smells und Programmierungs-Anti-Pattern ===&lt;br /&gt;
Neben den von Fowler erwähnte Smells gibt es noch eine Reihe von Code-Smells die oft auch unter [[Anti-Pattern#Programmierungs-Anti-Pattern|Programmierungs-Anti-Pattern]] erwähnt werden:&lt;br /&gt;
;Nichtssagender Name (engl. Uncommunicative Name): Name, der nichts über Eigenschaften oder Verwendung des Benannten aussagt. Aussagekräftige Namen sind wesentlich für das Verständnis von Programmcode.&lt;br /&gt;
;[[Redundanter Code]]: Mehrfach identisch vorhandene Quellcodeteile.&lt;br /&gt;
;Exhibitionismus (engl. Indecent Exposure): Interne Details einer Klasse sind unnötigerweise Teil ihrer Schnittstelle nach außen.&lt;br /&gt;
;Contrived complexity (engl.): Erzwungene Verwendung von [[Entwurfsmuster]]n, wo einfacheres Design ausreichen würde.&lt;br /&gt;
;Zu lange Namen: Insbesondere die Verwendung von Architektur- oder Designbestandteilen in den Namen von Klassen oder Methoden.&lt;br /&gt;
;Zu kurze Namen: Die Verwendung von „x“, „i“ oder Abkürzungen. Der Name einer Variable sollte ihre Funktion beschreiben.&lt;br /&gt;
;Über-Callback: Ein [[Rückruffunktion|Callback]], der versucht, alles zu tun.&lt;br /&gt;
;Komplexe Verzweigungen: Verzweigungen, die eine Menge von Bedingungen abprüfen, die mit der Funktionalität des Codeblocks nichts zu tun haben.&lt;br /&gt;
;Tiefe Verschachtelungen: Verschachtelte if/else/for/do/while-Statements. Sie machen den Code unlesbar.&lt;br /&gt;
&lt;br /&gt;
== Architektur-Smells ==&lt;br /&gt;
&lt;br /&gt;
Neben den von Beck und Fowler adressierten Smells im [[Quelltext]] von Anwendungen treten Smells auch in der Architektur von Softwaresystemen auf. Diese wurden von Stefan Roock und Martin Lippert beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zu den Architektur-Smells zählen unter anderem:&lt;br /&gt;
* Zyklische Benutzungsbeziehungen zwischen Paketen, Schichten und Subsystemen&lt;br /&gt;
* Größe und Aufteilung der Pakete oder Subsysteme&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Softwareerosion]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* {{Literatur|Autor=Martin Fowler|Titel=Refactoring. Wie Sie das Design vorhandener Software verbessern|Verlag=Addison-Wesley|Ort=München|Jahr=2000|Seiten=67–82|ISBN=3-8273-1630-8|Originalsprache=en|Originaltitel=Refactoring. Improving The Design Of Existing Code|Übersetzer=Bernd Kahlbrandt}}&lt;br /&gt;
* {{Literatur |Autor=Stefan Roock, Martin Lippert |Titel=Refactorings in großen Softwareprojekten: Komplexe Restrukturierungen erfolgreich durchführen |Verlag=dpunkt |ISBN=978-3898642071}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://ssw.jku.at/Teaching/Lectures/Sem/2002/reports/Stelzmueller/index.html Refactoring] Eine Überblicksarbeit, die im Abschnitt 2.3 unter dem Titel „Bad Smells“ einige wichtige Smells erklärt.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anti-Pattern]]&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Niklas0960</name></author>
	</entry>
</feed>