Duplicate Code (auf Deutsch: "doppelter Code" oder "Code-Duplizierung") bezeichnet das mehrfache Vorhandensein identischer oder sehr ähnlicher Codeabschnitte in einem Programm. Es wird als schlechte Praxis angesehen, weil es zu Problemen in der Wartbarkeit, Lesbarkeit und Fehleranfälligkeit des Codes führen kann.
1. Exakter Duplikat: Der Code ist vollständig identisch. Dies tritt häufig auf, wenn ein Entwickler denselben Code kopiert und an mehreren Stellen einfügt.
Beispiel:
def calculate_area_circle(radius):
return 3.14 * radius * radius
def calculate_area_sphere(radius):
return 3.14 * radius * radius # Identischer Code
2. Strukturelle Duplikate: Der Code ist nicht exakt gleich, aber in seiner Struktur und Funktionalität ähnlich. Lediglich Variablen oder Namen wurden geändert.
Beispiel:
def calculate_area_circle(radius):
return 3.14 * radius * radius
def calculate_area_square(side):
return side * side # Ähnlich strukturiert
3. Logische Duplikate: Der Code macht funktional das Gleiche, sieht aber syntaktisch unterschiedlich aus.
Beispiel:
def calculate_area_circle(radius):
return 3.14 * radius ** 2
def calculate_area_circle_alt(radius):
return 3.14 * radius * radius # Funktional gleich, aber anderer Stil
1. Refactoring: Ähnlichen oder identischen Code in eine gemeinsame Funktion oder Methode auslagern.
Beispiel:
def calculate_area(shape, dimension):
if shape == 'circle':
return 3.14 * dimension * dimension
elif shape == 'square':
return dimension * dimension
2. Modularisierung: Funktionen und Klassen verwenden, um Wiederholungen zu reduzieren.
3. DRY-Prinzip anwenden: "Don't Repeat Yourself" – Entwickle so, dass keine Information oder Logik doppelt implementiert wird.
4. Tools verwenden: Tools wie SonarQube oder CodeClimate können Duplicate Code automatisch erkennen.
Duplicate Code zu reduzieren, verbessert die Codequalität, erleichtert die Wartung und minimiert das Risiko von Fehlern in der Software.
Magic Numbers sind Zahlen, die im Code ohne ausreichende Erklärung oder Kontext verwendet werden. Sie sind oft direkt in den Code geschrieben, ohne dass sie durch eine benannte Konstante oder Variable ersetzt werden, was es schwierig macht, ihre Bedeutung oder ihren Zweck zu verstehen. Die Verwendung von Magic Numbers kann die Lesbarkeit und Wartbarkeit des Codes erheblich beeinträchtigen.
Hier sind einige der Hauptmerkmale und Probleme von Magic Numbers:
Unklarheit: Die Bedeutung einer Magic Number ist oft nicht sofort ersichtlich. Ohne eine erklärende Konstante oder Variable weiß man nicht, warum diese Zahl gewählt wurde oder was sie repräsentiert.
Schwierige Wartung: Wenn dieselbe Magic Number an mehreren Stellen im Code verwendet wird, müssen alle Vorkommen aktualisiert werden, wenn sich der Wert ändert. Das kann fehleranfällig sein und führt leicht zu Inkonsistenzen.
Verletzung der DRY-Prinzipien (Don't Repeat Yourself): Das wiederholte Verwenden der gleichen Zahlen an verschiedenen Stellen im Code verstößt gegen das DRY-Prinzip, das empfiehlt, wiederverwendbaren Code zentral zu definieren.
Beispiel für Magic Numbers:
int calculateArea(int width, int height) {
return width * height * 3; // 3 ist eine Magic Number
}
Besseres Vorgehen: Statt die Zahl direkt im Code zu verwenden, sollte sie durch eine benannte Konstante ersetzt werden:
const int FACTOR = 3;
int calculateArea(int width, int height) {
return width * height * FACTOR;
}
In diesem verbesserten Beispiel ist FACTOR
eine benannte Konstante, die die Bedeutung der Zahl 3
klarer macht. Dies verbessert die Lesbarkeit des Codes und erleichtert die Wartung, da der Wert nur an einer Stelle geändert werden muss, falls erforderlich.
Zusammenfassung: Magic Numbers sind direkte numerische Werte im Code, die durch benannte Konstanten ersetzt werden sollten, um die Klarheit, Wartbarkeit und Verständlichkeit des Codes zu verbessern.
DRY steht für "Don't Repeat Yourself" und ist ein fundamentales Prinzip in der Softwareentwicklung. Es besagt, dass jede Wissenseinheit innerhalb eines Systems eine eindeutige, unzweideutige Darstellung haben sollte. Das Ziel ist es, Redundanzen zu vermeiden, um die Wartbarkeit und Erweiterbarkeit des Codes zu verbessern.
Einmalige Darstellung von Wissen:
Vermeidung von Redundanzen:
Erleichterung von Änderungen:
Funktionen und Methoden:
validateInput()
zusammengefasst.Klassen und Module:
Konfigurationsdaten:
Bessere Wartbarkeit:
Erhöhte Konsistenz:
Zeiteffizienz:
Lesbarkeit und Verständlichkeit:
Stellen wir uns vor, ein Team entwickelt eine Anwendung, die Benutzereingaben validieren muss. Anstatt die Validierungslogik in jeder Eingabemethode zu duplizieren, kann das Team eine allgemeine Validierungsfunktion schreiben:
def validate_input(input_data):
if not isinstance(input_data, str):
raise ValueError("Input must be a string")
if len(input_data) == 0:
raise ValueError("Input cannot be empty")
# Additional validation logic
Diese Funktion kann dann überall dort verwendet werden, wo eine Validierung erforderlich ist, anstatt die gleichen Prüfungen mehrmals zu implementieren.
Das DRY-Prinzip ist ein wesentliches Konzept in der Softwareentwicklung, das dazu beiträgt, die Codebasis sauber, wartbar und konsistent zu halten. Durch die Vermeidung von Redundanzen können Entwickler effizienter arbeiten und die Qualität ihrer Software verbessern.