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, befasst 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. Dies 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: Open/Closed-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: Prinzip der Abhängigkeitsumkehr (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.
Entwurfsmuster sind bewährte Lösungen für häufige Probleme, die beim Software-Design 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.
Entwurfsmuster können in drei Typen eingeteilt werden:
Erstellungsmuster: Befassen Sie sich mit der Objekterstellung
Strukturelle Muster: Behandeln Sie die Zusammensetzung und Beziehungen von Objekten
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. Egal, ob Sie gerade erst mit Ihrer Designreise beginnen oder Ihre Fähigkeiten verbessern möchten, diese Muster helfen Ihnen dabei, saubereren, skalierbareren Code zu schreiben. Seien Sie gespannt auf den nächsten Blog, in dem wir Schritt für Schritt das erste Designmuster entwirren!
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!
Das obige ist der detaillierte Inhalt vonLow-Level-Design und SOLID-Prinzipien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!