![]() |
Code Smells
Hallo DP-Mitglieder,
Ich habe ein kleinen Kurs über das Thema "Code Smells" für euch vorbereitet. Das Ziel dieses Kurses ist das Verstehen was "Code Smells" sind. Denn jeder Programmierer hat (unbewusst) solche in seinem Code. Theorie: Das Wort "Code Smells" was übersetzt "(schlechter) Geruch" heißt, stammt von ![]() ![]() Code Smells ist ein schlecht strukturierter Programmcode. Der Code ist für den oder einen anderen Programmierer schwer zu verstehen. Bei Verbesserungen oder Erweiterungen kommen neue Fehler dazu. "Code Smells" wird erst erkannt bei einer Überarbeitung des Programmcodes. Welche "Code Smells" existieren? Es gibt eine Unmenge von schlecht-struktierter Programmcode-Beispiele. Hier einige Beispiele die sich auf die objektorientierte Programmierung (Java, Delphi, ...) beziehen:
![]() Natürlich gibt es noch mehrere Arten und interessante Bücher die das Thema detaillierter beschreiben wie z.B das Buch : "Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code" von Robert C. Martin. Beispiele/Tipps:
Schlusswort: Kennt man einige Code-Smells, so kann man diese vermeiden, damit der Programmcode nicht "schlecht riecht". Ich hoffe ich könnte euch ein bisschen über dieses interessante Thema erzählen. Bitte um konstruktive Kritik. :) Danke bis Bald. Mfg Coffeecoder |
AW: Code Smells
Hallo Coffeecoder,
gefällt mir ganz gut, fällst bei deinem Beispiel dann über die eigenen Regeln. ich denke
Delphi-Quellcode:
hier ist ch auch nicht gerade ein aussagekräftiger Parameter, könnte auch ein Char oder so sein :-D
procedure anpassenChart(ch : TChart);
Begin end; Gruß MrOuzo |
AW: Code Smells
Außerdem wird hier als Parameter eine Zeichenkette übergeben:
Delphi-Quellcode:
laut Deklaration müsste es aber ein Objekt vom Typ TChart sein. Mir ist zwar klar, was du aussagen willst, aber trotzdem sollte es doch ein Beispiel sein, was zumindest compiliert.
anpassenChart('Chart'+IntToStr(i));
|
AW: Code Smells
Zitat:
Zitat:
Delphi-Quellcode:
Wobei das leider nicht immer der Fall ist -- ist mir neulich allein schon mal wieder bei der Format-Funktion aufgefallen.
procedure anpassenChart(AChart: TChart);
Begin end; Ansonsten muss ich sagen, dass das ein interessanter Einstieg sein kann :thumb: |
AW: Code Smells
Dazu fällt mir folgende Aussage von einem Bekannten ein: "Wieso? Ich weiss doch, dass die Soundsystem-Klasse bei mir Peter heisst" :-D
|
AW: Code Smells
Zitat:
|
AW: Code Smells
Wenn schon Verbesserung, dann bitte verwende keine With-Statements und rueck den Code richtig ein :)
|
AW: Code Smells
Zitat:
|
AW: Code Smells
Man sieht nicht mehr auf was sich das with bezieht. Und mitunter kommt der Compiler schon mal durcheinander und dann sucht man sich dumm und dusselig.
|
AW: Code Smells
Außerdem habe ich die Erfahrung gemacht das sich die nachfolgenden Variablen schlecht Debugen lassen.
Da Sie wegen Optimierung unterdrückt werden. PS: Und Zeilen sparrt man sich dadurch auch nicht wirklich. gruss |
AW: Code Smells
Zitat:
|
AW: Code Smells
Zitat:
gruss |
AW: Code Smells
Zitat:
|
AW: Code Smells
Die "Notwendigkeit" für ein with ist wahrscheinlich Feature Envy, Indecent Exposure und/oder Message Chains
|
AW: Code Smells
Zitat:
Zitat:
Zitat:
Mein Code riecht immer dann gut, wenn ich keine Kommentare benötige, da der Code flüssig zu lesen ist (wie eine Beschreibung) und einfach zu verstehen ist. Weiterhin spüre ich, das ich in die richtige Richtung gehe, wenn die Klassen mit Scheuklappen durch die Gegend rennen, d.h. keine Abhängigkeiten zu anderen Klassen existieren. Dann kann ich mit den Klassen vieles anstellen, ohne mir einen abzubrechen. Eine schöne Beschreibung für eine gut implementierte Methode ist von Dr.Bob: "Wenn Du das, was die Methode macht, beschreibst, und ohne das Wörtchen 'und' auskommst, hast Du etwas richtig gemacht". |
AW: Code Smells
Uhu, bricht hier wieder mal ein With-Glaubenskrieg aus? *schon mal das Popcorn hol* :stupid:
|
AW: Code Smells
Delphi-Quellcode:
:mrgreen:
with Popcorn do
Mampf; |
AW: Code Smells
Hey,
Ich danke für eure Feedbacks. Es ist mir klar, dass es schon bisschen her ist. Zitat:
Delphi-Quellcode:
Weiter gehts :)
procedure anpassenChart(pchart : TChart);
Begin .... end; Zitat:
Also ich bedanke mich für eure Hinweise und Vorschläge, ich werde das Tutorial wohl einmal überarbeiten müssen und gebe es als PDF auch frei. Bis dahin, habt bisschen Geduld :) |
AW: Code Smells
Zitat:
|
AW: Code Smells
Zitat:
![]() |
AW: Code Smells
Zitat:
|
AW: Code Smells
Zitat:
Grüße Klaus |
AW: Code Smells
Zitat:
|
AW: Code Smells
Somit wäre dann aber ein PObject ein Pointer auf einen Pointer. Unschön, wenn nicht irgendwie beabsichtigt.
|
AW: Code Smells
Zitat:
|
AW: Code Smells
Zitat:
|
AW: Code Smells
Für mich sind Parameter mit Präfix einfach nur häßlich.
Typen mit T, Pointertypen mit P, Interfacetypen mit I, sowie Fields/Felder mit F, sind ja vollkommen OK, aber Property- und Parameternamen auch noch verschandeln? Aber wenn man schon soeinen Scheiß macht, dann sollte man das dann auch komplett durchzuiehen. Globale Variablen mit G, Lokale mit L, die Parameter/Argumente mit A, Constanten mit C und für die Property oder die Klassenvariablen (Class Var) fällt uns bestimmt auch noch was ein. Eventuell noch die nicht ganz "globalen" Variablen innerhalb der Implementation noch mit einem V davor :gruebel: Und zum Schluß überall noch den kranken ungarischen Dreck davor. Am Ende überlegt man sich das nameXCamelCase dann nochmal, findet es nun ebenfalls Scheiße und wechselt zu KA_WIE_DAS_HEISST. :angle2: Wer unbedingt will, kann intern ja eine Umleitung einrichten.
Delphi-Quellcode:
procedure MeineProzedur(MeinParameter: MeinTyp);
var Argument_MeinParameter: MeinTyp absolute MeinParameter; begin if Argument_MeinParameter = 0815 then end; |
AW: Code Smells
Es sind noch immer (nur) Konventionen ;)
[OT] In Java macht folgendes mit den Parameterübergabe:
Code:
Ohne Präfix :)
...
public void setName(String name) { this.name = name; } [/OT] |
AW: Code Smells
[OT] Das mach ich in Delphi genauso. :stupid:
|
AW: Code Smells
Du wirst lachen, aber lokale Variablen fangen bei mir tatsächlich mit (einem kleinen) L an. Wobei das nich ganz optimal ist, da man das "l" mit einer "1" (in Worten "Eins") verwechseln kann. Gibt auch einige Styleguides die das bemängeln. Da bei mir aber keine Variable mit einer Ziffer anfängt, kann ich das verschmerzen. Parameter/Argumente bekommen immer ein kleines "a". Hat den Vorteil, daß ich immer sehe, welche Variable lokal ist und welche von aussen kommt.
|
AW: Code Smells
Zitat:
Dies ist doch nicht erlaubt resp der Compiler meckert doch : 1int; |
AW: Code Smells
Das Einzige, was ich total bescheuert finde, das ist der string.
Ist erstmal eigenartig, daß diese (Basis)Typen kein T davor haben und dann das fette String. Auf Arbeit schreibe ich es (da es überall so ist) klein, aber privat lieber groß. :oops: Und warum schreibt man groß klein, aber das Kleine groß? Blau |
AW: Code Smells
Wenn keine Verwechslungsgefahr (z.B. mit Properties) besteht, dann lasse ich Präfixe bei Argumenten auch am liebsten weg, ansonsten sollte der Weg mit dem vorangestellten A meistens funktionieren (es sei denn, es besteht wieder Verwechslungsgefahr). Ganz blöde wird es bei solchen Konstrukten (das with ist in diesem Zusammenhang natürlich Absicht):
Delphi-Quellcode:
constructor TMeineKomponente.Create(AOwner: TComponent; Name: string);
begin FDings := TDings.Create; with FDings do begin Name := Name; end; |
AW: Code Smells
Zitat:
|
AW: Code Smells
Syntax für Alles ist [{Alpha}_][{AlphaNum}_]* aber eigentlich isses [{Letter}_][{Letter}{Digit}_]* und in ANSI-Delphis [a-zA-Z_][a-zA-Z0-9_]* bei Unitnamen und Componentennamen (TComponent.Name) [{Alpha}_][{AlphaNum}_.]* (früher waren keine Punkte erlaubt)
Aber dennoch besser keine mehrfach zusammenhängenden Punkte und keine Punkte am Ende. Ab Delphi 2009 darf ich also auch Müssen, Muß oder 秘密 als Name verwenden. :angle: Einige verdammen es, aber ich find's geil. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz