Low-Level-Design (LLD) ist eine kritische Phase in der Softwareentwicklung, die die Lücke zwischen High-Level-Design und tatsächlicher Implementierung schließt. Während sich High-Level-Design auf architektonische Entwürfe konzentriert, beschäftigt sich LLD damit, wie jede Komponente, Klasse oder Funktion implementiert wird, um die Anforderungen des Gesamtsystems zu erfüllen.
Einfacher ausgedrückt umfasst LLD das Entwerfen von Klassen, Methoden, Schnittstellen und Interaktionen zwischen ihnen, um sicherzustellen, dass der Code effizient, wartbar und skalierbar ist. Es ist eine wesentliche Fähigkeit für Softwareentwickler, insbesondere wenn sie Systeme erstellen, die robust, wiederverwendbar und im Laufe der Zeit leicht zu ändern sein müssen.
Dieser Blog führt Sie in die wichtigsten Konzepte, Prinzipien und Techniken des Low-Level-Designs ein und zeigt, wie sie Ihnen dabei helfen können, besseren, wartbareren Code zu schreiben.
Die erste Frage, die uns in den Sinn kommt, ist:
Warum ist Low-Level-Design wichtig?
Um die Lücke zwischen LLD-Konzepten und echtem Code zu schließen, unterteilen wir den Prozess des Entwerfens eines Low-Level-Diagramms in die folgenden Schritte:
Schritt 1: Objektorientierte Prinzipien
Schritt 2: SOLIDE Prinzipien
Schritt 3:Entwurfsmuster
Die vier Säulen des objektorientierten Programmierkonzepts sind ein Muss, um mit dem Erlernen des Low-Level-Designs zu beginnen. Ich habe dieses Konzept bereits in einem kurzen Checkout-Blog behandelt
S: Single-Responsibility-Prinzip (SRP)
Beispiel: Stellen Sie sich eine Klasse vor, die sowohl die Benutzerauthentifizierung als auch die Protokollierung übernimmt. Wenn wir die Funktionsweise der Protokollierung ändern müssen, müssen wir letztendlich auch die Authentifizierungsklasse ändern. Dies verstößt gegen SRP. Stattdessen sollten wir zwei separate Klassen haben: eine für die Benutzerauthentifizierung und eine andere für die Protokollierung, sodass jede Klasse eine einzige Verantwortung hat.
O: Offenes/Geschlossenes Prinzip (OCP)
Beispiel: Stellen Sie sich ein Zahlungsverarbeitungssystem vor, das Zahlungen per Kreditkarte abwickelt. Wenn Sie Unterstützung für PayPal hinzufügen müssen, sollten Sie den vorhandenen Code nicht ändern, sondern erweitern, indem Sie eine neue Klasse für PayPal-Zahlungen hinzufügen. Dadurch wird sichergestellt, dass das bestehende System stabil bleibt und gleichzeitig neue Funktionen hinzugefügt werden können.
L: Liskov-Substitutionsprinzip (LSP)
Beispiel: Wenn wir eine Bird-Klasse haben, die über eine Methode fly() verfügt, und wir eine Unterklasse Penguin erstellen, die nicht fliegen kann, verstößt dies gegen LSP. Die Penguin-Klasse sollte fly() nicht erben, da sie das erwartete Verhalten ändert. Stattdessen sollte die Bird-Klasse umgestaltet werden, um mit Vögeln umzugehen, die unterschiedlich fliegen können und nicht fliegen können.
I: Interface Segregation Principle (ISP)
Beispiel: Angenommen, wir haben eine Schnittstelle Animal mit den Methoden fly(), swim() und walk(). Eine Klasse Dog, die Animal implementiert, wäre gezwungen, fly() zu definieren, was sie nicht benötigt. Um dem ISP zu entsprechen, sollten wir die Animal-Schnittstelle in kleinere Schnittstellen wie Flyable, Swimmable und Walkable aufteilen, um zu vermeiden, dass Klassen irrelevante Methoden aufgezwungen werden
D: Abhängigkeitsinversionsprinzip (DIP)
Beispiel: Wenn in einer E-Commerce-Anwendung der Checkout-Prozess (High-Level-Modul) direkt von einem bestimmten Zahlungs-Gateway wie PayPal (Low-Level-Modul) abhängt, erfordert die Änderung des Zahlungs-Gateways eine Änderung des Checkout-Prozesses. Durch die Einführung einer Abstraktion, beispielsweise einer PaymentProcessor-Schnittstelle, kann der Checkout-Prozess mit jeder Zahlungsmethode funktionieren, ohne dass die Besonderheiten von PayPal oder einem anderen Dienst bekannt sein müssen.
Designmuster sind bewährte Lösungen für häufige Probleme, die beim Softwaredesign auftreten. Dabei handelt es sich um Best Practices, die Entwickler befolgen können, um spezifische Designprobleme effizient und systematisch zu lösen. Anstatt das Rad neu zu erfinden, bieten Designmuster einen Standardansatz zur Lösung wiederkehrender Probleme.
Designmuster können in drei Typen eingeteilt werden:
Erstellungsmuster: Behandeln Sie die Objekterstellung
Strukturelle Muster: Umgang mit Objektzusammensetzung und -beziehungen
Verhaltensmuster: Umgang mit Objektinteraktion und Verantwortung
Da wir nun mit der Erkundung der SOLID-Prinzipien den Grundstein gelegt und die riesige Landschaft der Designmuster vorgestellt haben, sind wir bereit, tiefer einzutauchen! In der kommenden Serie werde ich jedes Designmuster anhand praktischer Beispiele und realer Szenarien aufschlüsseln. Ganz gleich, ob Sie gerade erst mit dem Entwerfen beginnen oder Ihre Fähigkeiten verbessern möchten: Diese Muster helfen Ihnen dabei, saubereren, besser skalierbaren Code zu schreiben. Seien Sie gespannt auf den nächsten Blog, in dem wir Schritt für Schritt das erste Designmuster entschlüsseln!
Wenn Sie es bis hierher geschafft haben, vergessen Sie nicht, auf „Gefällt mir“ zu klicken und unten einen Kommentar mit Fragen oder Gedanken zu hinterlassen. Ihr Feedback bedeutet mir sehr viel und ich würde gerne von Ihnen hören!
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3