Das DRY-Prinzip: Das schwierige Gleichgewicht zwischen Wiederverwendbarkeit und Klarheit des Codes finden

· Imen Ezzine · 3 Minuten zum Lesen
Lego

Dieser Artikel befasst sich mit dem DRY-Prinzip (Don't Repeat Yourself) und seinen Auswirkungen auf die Codequalität. Er unterstreicht seine Bedeutung für die Vermeidung von Wiederholungen und die Erleichterung der Wartung, weist aber auch auf die Risiken einer übermäßigen Anwendung dieses Prinzips hin, die der Klarheit und der Projektentwicklung abträglich sein kann. Ziel ist es, das richtige Gleichgewicht zwischen Wiederverwendung und Einfachheit zu finden.

In diesem Artikel untersuchen wir das DRY-Prinzip (Don't Repeat Yourself) und seine Auswirkungen auf die Codequalität. Obwohl es zur Vermeidung von Redundanzen und zur Erleichterung der Wartung unerlässlich ist, kann seine übermäßige Anwendung manchmal das Verständnis und die Entwicklung eines Projekts erschweren. Lassen Sie uns herausfinden, wie wir das richtige Gleichgewicht zwischen Wiederverwendung und Klarheit finden können.

Das DRY-Prinzip: ein zweischneidiges Schwert.

Vor kurzem haben wir der ursprünglichen Version unseres aktuellen Projekts, das bald in Produktion gehen wird, den letzten Schliff gegeben. Da sich die Komplexität unseres Codes aufgrund der Natur des Projekts weiterentwickelt, legen wir großen Wert darauf, ihn einfacher und schlanker zu gestalten. Durch die Anwendung von Best Practices wie dem DRY-Prinzip (Don't Repeat Yourself) zur Vermeidung von Redundanzen streben wir eine hohe Qualität an.

Dies führt mich zu einer Diskussion über ein Prinzip, das ich für ein zweischneidiges Schwert halte, das man klug anwenden und gleichzeitig pragmatisch bleiben sollte.

Warum sollte man das DRY-Prinzip anwenden?

Das DRY-Prinzip „Don't Repeat Yourself“, ist eine Philosophie der Softwareentwicklung, die darauf abzielt, die Redundanz im Quellcode zu minimieren. Obwohl dieser Ansatz weithin für seine Effektivität bei der Bewältigung der Komplexität des Codes gelobt wird, ist es entscheidend zu verstehen, wie seine starre Anwendung manchmal zu Verwirrung führen kann.

Das Hauptziel von DRY ist es, die Wiederverwendung von Code zu fördern, wodurch potenzielle Fehler reduziert und die Wartung verbessert werden. Indem Entwickler die Duplizierung von Codeteilen vermeiden, können sie die Geschäftslogik zentralisieren und so Aktualisierungen und Korrekturen erleichtern.

Beispiel:

Nehmen wir einen Fall, in dem wir zwei Entitäten in einer Symfony-Anwendung haben: User und Admin. Diese beiden Einheiten haben gemeinsame Eigenschaften, als firstname, lastname, und email. Ohne Normalisierung würden wir diese Eigenschaften jedoch in jeder Entität duplizieren, was gegen das DRY-Prinzip verstößt. Hier ein Beispiel, wie es ohne Normalisierung aussehen würde :

// src/Entity/User.php

namespace App\Entity;

class User
{
    private string $firstname;
    private string $lastname;
    private string $email;
    private string $job;
}
// src/Entity/Admin.php

namespace App\Entity;

class Admin
{
    private string $firstname;
    private string $lastname;
    private string $email;
    private array $roles;
}

In diesem Fall würde der Inspektor von PhpStorm oder PHP Mess Detector eine Duplizierung der Eigenschaften melden firstname, lastname, und email in beiden Entitäten. Ein klassischer Vorschlag wäre, die Vererbung zu nutzen, um diese Eigenschaften in einer übergeordneten Klasse zu zentralisieren, Account, um die Duplikation zu eliminieren :

//src/Entity/Account.php

namespace App\Entity;

abstract class Account
{
    private string $firstname;
    private string $lastname;
    private string $email;
}

Dann vererben wir User und Admin dieser Klasse Account, und fügt gleichzeitig die spezifischen Eigenschaften jeder dieser Entitäten hinzu:

//src/Entity/User.php

namespace App\Entity;

class User extends Account
{
    private string $job;
}
//src/Entity/Admin.php

namespace App\Entity;

class Admin extends Account
{
    private array $roles;
}

Dieser Ansatz zentralisiert die gemeinsam genutzten Eigenschaften in einer Basisklasse. Er verbessert die Lesbarkeit und verringert die Fehleranfälligkeit durch Duplizierung. Es ist jedoch wichtig, daran zu denken, dass diese Lösung nicht immer mit einer ORM-Integration wie Doctrine gekoppelt werden muss. Manchmal ist es besser, direkt mit einem reinen Objektmodell zu arbeiten, um den Code unabhängig von einem Framework zu halten. Wenn die Verwendung von Doctrine später notwendig wird, können Sie diese Modelle immer noch mit Tools abbilden wie MappedSuperclass oder SingleTableInheritance.

Wenn die Abstraktion übermäßig wird

Dieses Streben nach weniger Redundanz kann jedoch manchmal zu übermäßiger Abstraktion führen. Wenn Entwickler zu schnell nach Verallgemeinerungen streben, wird der Code für diejenigen, die mit den spezifischen Details des Projekts nicht vertraut sind, schwerer verständlich. Komplexe Abstraktionen können Schichten von Indirektionen schaffen, die den Code nicht klarer machen, sondern zusätzliche Ebenen der Verwirrung einführen.

Ein weiterer Aspekt, den es zu berücksichtigen gilt, ist, dass die strikte Befolgung des DRY-Prinzips zu generischen Codestrukturen führen kann, die für den jeweiligen Einzelfall nicht optimal sind. Wenn man beispielsweise eine Eigenschaft wie eine eindeutige Kennung (ID) für verschiedene Entitäten faktorisiert, kann man feststellen, dass die zugehörigen Regeln je nach Geschäftskontext variieren. Nehmen wir den Fall eines Systems, in dem die Nutzer haben einfache numerische IDs, während die Klienten erfordern IDs mit einem regionalen Präfix (z. B, EU-12345). In diesem Fall kann der Versuch, die Verwaltung der IDs zu zentralisieren, den Code mit zusätzlichen Bedingungen komplexer machen. Manchmal kann die absichtliche Duplizierung von Teilen des Codes, die auf die jeweilige Entität zugeschnitten ist, die Lesbarkeit und Wartbarkeit verbessern, vor allem wenn in Zukunft mit spezifischen Variationen zu rechnen ist.

DRY im Kontext moderner Architekturen

In modernen Architekturen, insbesondere bei Microservices und Polyrepo-Strategien, wird manchmal dazu geraten, zwischen isolierten Diensten zu kopieren und einzufügen. Da jeder Dienst eigenständig und unabhängig ist, kann eine moderate Duplizierung von Code zwischen den einzelnen Diensten eine bessere Verwaltung lokaler Änderungen ermöglichen und die Bereitstellung erleichtern, ohne andere Teile des Systems zu beeinträchtigen.

Das richtige Gleichgewicht zwischen der Wiederverwendung von Code und der Übersichtlichkeit zu finden, ist eine ständige Herausforderung für die Entwickler. Es ist wichtig zu erkennen, dass DRY eine Richtlinie und keine absolute Regel ist. Möglicherweise müssen Kompromisse eingegangen werden, um den Code lesbar und verständlich zu halten und gleichzeitig die Vorteile der Wiederverwendung zu nutzen.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass das DRY-Prinzip zwar ein wertvoller Leitfaden zur Verbesserung der Codequalität ist, seine starre Anwendung jedoch manchmal zu Verwirrungen führen kann. Im Zusammenhang mit komplexen Architekturen wie Microservices können Entwickler sogar dazu angehalten werden, Code zu duplizieren, um die Unabhängigkeit der Dienste zu gewährleisten. Wichtig ist, sich des Projektkontexts bewusst zu bleiben und ein optimales Gleichgewicht zwischen Wiederverwendung, Lesbarkeit und Pflege des Codes zu finden.

Möchtest du das DRY-Prinzip anwenden, ohne die Lesbarkeit und Wartbarkeit deines Codes zu beeinträchtigen?

Unsere Symfony- und PHP-Experten bei SensioLabs helfen dir, deine Projekte effizient zu strukturieren: intelligentes Code Factoring, gute Entwicklungspraktiken und skalierbare Architektur.

Das könnte dich auch interessieren

Chart going up
Silas Joisten Neu

Warum Tests? Für das Management erklärt

Für Entscheidungsträger: Warum Tests wichtig sind mit Fokus auf ROI, Risikoreduktion und Agilität. Mit Zahlen, Fallstudien und Management-Perspektive.

Mehr erfahren
Code happy in lights
Imen Ezzine

Code-Review: Arten, Organisation und bewährte Verfahren

Der Code-Review ist ein wesentlicher Schritt im Softwareentwicklungszyklus, der es ermöglicht, die Qualität des Codes zu verbessern, Fehler zu reduzieren und den Wissensaustausch innerhalb des Teams zu fördern. GitLab und GitHub, zwei der beliebtesten Plattformen für die Codeverwaltung, bieten erweiterte Funktionen, um diesen Prozess zu vereinfachen. Dieser Artikel befasst sich mit den verschiedenen Arten von Code-Reviews, der Organisation und der Nutzung von Vorlagen und Checklisten zur Verbesserung der Effizienz von PRs (Pull Requests).

Mehr erfahren
Many Lego figurines on a white table with hands playing with them
Alexandre Nesson

Scrum Guide Expansion Pack (2025): Wichtige Erkenntnisse, die du kennen musst

Ein neuer Baustein bereichert den Scrum Guide! Ist das nur Fassade oder bietet es echten Mehrwert? Lass es uns gemeinsam in diesem Artikel herausfinden, der von einem unserer Experten verfasst wurde!

Mehr erfahren
The SensioLabs team celebrating the 20th anniversary of Symfony with balloons
Jules Daunay

Die Geschichte geht weiter: SensioLabs feiert 20 Jahre Symfony

Die Zeit vergeht wie im Flug – besonders, wenn man an der Zukunft der Entwicklung schreibt! Das SensioLabs-Team hat gerade die 20 Kerzen des Symfony-Frameworks ausgeblasen. Wir haben den Anlass im Büro gefeiert, doch die Party ist noch nicht vorbei. Das Datum für eine XXL-Feier steht bereits fest: die SymfonyCon Amsterdam vom 27. bis 28. November 2025.

Mehr erfahren
PHP 8.5 URI extension
Oskar Stark

PHP 8.5's neue URI-Erweiterung: Ein Game-Changer für URL-Parsing

PHP 8.5 führt eine leistungsstarke neue URI-Erweiterung ein, die die URL-Verarbeitung modernisiert. Mit Unterstützung für RFC 3986 und WHATWG-Standards bietet die neue Uri-Klasse unveränderliche Objekte, fluent Interfaces und korrekte Validierung - und behebt alle Einschränkungen der veralteten parse_url()-Funktion. Dieser Leitfaden zeigt praktische Vorher/Nachher-Beispiele und erklärt, wann welcher Standard zu verwenden ist.

Mehr erfahren
Open in new tab
Silas Joisten

Die Tab-Falle: Warum das Erzwingen neuer Tabs eine schlechte UX ist

Wir haben es alle schon getan — target="_blank" zu einem Link hinzugefügt, um „Benutzern zu helfen", auf unserer Website zu bleiben. Aber was sich wie eine harmlose Bequemlichkeit anfühlt, führt oft zu Verwirrung, beeinträchtigt die Barrierefreiheit und birgt versteckte Sicherheitsrisiken.

Mehr erfahren
3 dog heads
Mathieu Santostefano

Lass die Nutzer des SDK ihren eigenen HTTP-Client nutzen

Befreie dich von starren Abhängigkeiten in deinen PHP-SDKs. Erfahre, wie du die Standards PSR-7, PSR-17 und PSR-18 zusammen mit PHP-HTTP/Discovery nutzt, um deinen Benutzern die Verwendung ihres bevorzugten HTTP-Clients zu ermöglichen – sei es Guzzle, Symfony HttpClient oder ein anderes Tool. Ein Muss für PHP- und Symfony-Entwickler.

Mehr erfahren
Vegetables on a wooden board with a knife with a pan on top
Rémi Brière

Warum Scrum scheitert (und wie sich das ändern lässt) – Teil 2

Scrum gilt oft als das Framework der Wahl, um die Produktentwicklung – insbesondere die von digitalen Produkten – zu strukturieren und zu dynamisieren. Doch seine Einführung garantiert nicht automatisch Erfolg. Doch was genau ermöglicht Scrum? Und noch wichtiger: Welche Bedingungen sind für seine Wirksamkeit notwendig und welche Fallstricke sollten vermieden werden, um es zu einem echten Vorteil zu machen?

Mehr erfahren
Blue sign on a building with several Now What? letters
Thibaut Chieux

Wie man Nachrichten beim Aufbau asynchroner Anwendungen mit dem Symfony-Messenger priorisiert

Die asynchrone Verarbeitung bietet Vorteile wie entkoppelte Prozesse und schnellere Reaktionszeiten. Die Verwaltung von Nachrichtenprioritäten kann jedoch zu einer Herausforderung werden. Bei Aufgaben, die vom Zurücksetzen von Passwörtern bis hin zu komplexen Exporten reichen, ist die rechtzeitige Zustellung kritischer Nachrichten unerlässlich. Dieser Artikel befasst sich mit häufigen Problemen bei der asynchronen Verarbeitung und zeigt Lösungen mit Symfony Messenger auf, mit denen Sie Ihre Anwendung ohne umfangreiches Refactoring optimieren können.

Mehr erfahren
SensioLabs University Courses announcing the new level 3 Master training course now available
Jules Daunay

Wir stellen vor: Mastering Symfony 7

Wenn du deine Symfony-Kenntnisse verbessern möchtest, ist der neue Level-3 Trainingskurs bei SensioLabs vielleicht das Richtige für dich! Du meisterst komplexe Themen, optimierst die Leistung und wirst zum Symfony-Experten.

Mehr erfahren
PHP 8.5
Oskar Stark

Was ist neu in PHP 8.5: Ein umfassender Überblick

PHP 8.5 wird im November 2025 veröffentlicht und bringt mehrere nützliche neue Features und Verbesserungen mit sich. Diese Version konzentriert sich auf die Verbesserung der Developer Experience, neue Utility-Funktionen und bessere Debugging-Möglichkeiten.

Mehr erfahren
Two images: on the left many cars stuck in a traffic jam with the sign "All directions" above, on the right a blue car moving forward alone on the highway with the sign "Service Subscriber" and a Symfony logo above
Steven Renaux

Symfony Lazy Services mit Stil – Steigere deine Entwicklererfahrung mit Service Subscribers

Steigere die Performance und Developer Experience (DX) deiner Symfony-App! Erfahre, wie du Service Subscribers und Traits für das verzögerte Laden von Services verwendest, um die sofortige Instanziierung zu reduzieren, Abhängigkeiten zu vereinfachen und modularen, wartbaren Code zu schreiben.

Mehr erfahren
the surface of the earth seen from the space with city lights forming networks
Imen Ezzine

HTTP-Verben: Der ultimative Leitfaden

Hier erklären wir dir die Grundlagen von GET, POST, PUT, DELETE und mehr. In diesem Artikel erfährst du alles über die Funktionsweise, die Anwendungsmöglichkeiten und die Sicherheitsauswirkungen.

Mehr erfahren
Poster of Guillaume Loulier presentation
Salsabile El-Khatouri

Ein Symfony-Training bei SensioLabs: Hinter den Kulissen

Wie sieht die Symfony-Schulung bei SensioLabs aus? Erfahren Sie es im Interview mit Guillaume Loulier, einem leidenschaftlichen Entwickler und Trainer, der uns alles über die offiziellen Symfony-Schulungen erzählt.

Mehr erfahren
AI and Symfony
Silas Joisten

KI-gestützte Funktionen in Symfony entwickeln

KI verändert die Webentwicklung – und mit php-llm/llm-chain können PHP-Entwickler ganz einfach leistungsstarke LLM-Funktionen in Symfony-Anwendungen integrieren. Dieses Tutorial zeigt dir, wie du mit Chatbots, intelligenten Assistenten und mehr loslegst.

Mehr erfahren
Image