Der folgende Herausgeber bringt Ihnen einen Artikel, in dem das Konzept von OO in Java und Designprinzipien kurz erläutert werden (unbedingt lesen). Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen
1. Die Designbasis von OO (Objektorientiert)
Objektorientiert (OO): Es basiert auf dem Objektkonzept, objektzentriert, Klasse und VererbungFür den Konstruktionsmechanismus nutzen Sie Schnittstellen und Polymorphismus voll aus, um Flexibilität zum Erkennen, Verstehen und Charakterisieren der objektiven Welt sowie zum Entwerfen und Erstellen entsprechender Softwaresysteme zu bieten. Objektorientierte Funktionen: Obwohl sich verschiedene objektorientierte Programmiersprachen voneinander unterscheiden, können sie alle die Grundfunktionen der objektorientierten
unterstützen, nämlich „Abstraktion“. , Kapselung, Vererbung, Polymorphismus“:
– Abstraktion, Berücksichtigen Sie nicht zuerst die Details
– Kapselung, Interne Implementierung ausblenden
– Vererbung, Vorhandenen Code wiederverwenden
– Polymorphismus, Objekt neu schreiben Verhalten
ObjektorientiertEntwurfsmuster: Es handelt sich um „gutes objektorientiertes Design“ sind jene Designs, die „ auf Änderungen reagieren und die Wiederverwendung verbessern“. Objektorientierte Entwurfsmuster beschreiben Softwaredesign und sind daher unabhängig von Programmiersprachen. Die endgültige Implementierung objektorientierter Entwurfsmuster muss jedoch weiterhin mithilfe objektorientierter Programmiersprachen ausgedrückt werden. Objektorientierte Entwurfsmuster sind keine algorithmischen Techniken, die kopiert und verwendet werden können. Es handelt sich um ein empirisches Verständnis, das auf einem kompetenten und tiefgreifenden Verständnis von „objektorientiert“ basiert.
Das Obige enthält eine umfassende Beschreibung der Konzepte und Beziehungen zwischen objektorientierten Mustern und Designmustern. Wenn wir entwerfen, müssen wir die vier Grundmerkmale von OO vollständig verstehen und nutzen, um das Design zu entwickeln. Daher muss jeder mit der objektorientierten Technologie vertraut sein und diese beherrschen. Ich werde sie hier nicht im Detail vorstellen, aber für Designmuster Stellen Sie uns beim Entwerfen ein Referenz- Modell zur Verfügung. Die Voraussetzung für die Beherrschung objektorientierter Entwurfsmuster besteht darin, zunächst die „objektorientierte“ Technologie zu beherrschen.
2. OO (objektorientierte) Designziele
※Erweiterbarkeit: Mit neuen Anforderungen kann neue Leistung einfach hinzugefügt werden. Dies hat keine Auswirkungen auf die bestehende Leistung beeinträchtigen oder neue Mängel in das System einbringen.
※Änderungsflexibilität: Wenn der Code eines Teils des Systems geändert wird, wird dadurch weder die bestehende Struktur des Systems zerstört noch hat es Auswirkungen auf Andere Teil.
※Pluggability: Einige Codes im System können durch andere Klassen derselben Schnittstelle ersetzt werden, ohne das System zu beeinträchtigen.
3. Die fünf Prinzipien des OO-Designs und ihre Beziehungen
3.1 Zusammenfassung der OO-Designprinzipien
※Prinzip der Einzelverantwortung:Was eine Klasse betrifft, sollte es nur einen Grund für ihre Änderung geben. Singleness ist gutes Design für eine Klasse. Gemischte und unklare Verantwortlichkeiten lassen den Code besonders umständlich aussehen, wirken sich auf den gesamten Körper aus, verlieren an Ästhetik und führen unweigerlich zum Risiko hässlicher Systemfehler.
※Offen-Geschlossen-Prinzip: bedeutet, dass Softwareeinheiten (Klassen, Module, Funktionen usw.) erweiterbar, aber nicht veränderbar sein sollten . Die Kernidee bei der Verwirklichung des offenen und geschlossenen Prinzips besteht darin, abstrakt und nicht konkret zu programmieren, da die Abstraktion relativ stabil ist. Lassen Sie die Klasse von einer festen Abstraktion abhängen, sodass Änderungen durch objektorientierte Vererbungs- und Polymorphismusmechanismen möglich sind. Sie können die abstrakte Klasse erben und das inhärente Verhalten ändern, indem Sie ihre Methoden überschreiben , also ist es offen. „Anforderungen ändern sich ständig“ und es gibt keine unveränderliche Software. Daher ist es notwendig, das geschlossene und offene Prinzip zu verwenden, um Änderungen entsprechend den Anforderungen zu schließen und gleichzeitig die Stabilität des Verpackungssystems innerhalb der Software aufrechtzuerhalten und nicht durch Änderungen in der Software beeinträchtigt zu werden Anforderungen.
※Prinzip der Abhängigkeitsumkehr: Verlassen Sie sich auf die Abstraktion, nicht auf die Konkretheit. Die Stabilität der Abstraktion bestimmt die Stabilität des Systems, da die Abstraktion unveränderlich ist und die Abhängigkeit von der Abstraktion die Essenz des objektorientierten Designs und den Kern des Abhängigkeitsinversionsprinzips darstellt. Sich auf die Abstraktion zu verlassen ist ein allgemeines Prinzip, aber manchmal ist es unvermeidlich, sich auf Details zu verlassen. Der Kompromiss zwischen Abstraktion und Konkretheit muss abgewogen werden, und die Methode ist nicht statisch. Sich auf Abstraktion zu verlassen bedeutet, die Schnittstelle zu programmieren, nicht die Implementierung.
※Das Liskov-Substitutionsprinzip: Untertypen müssen durch ihren übergeordneten Typ ersetzt werden können. Das Liskov-Substitutionsprinzip konzentriert sich hauptsächlich auf den Aufbau von Abstraktion und Polymorphismus auf der Grundlage der Vererbung. Daher kann die Wiederverwendung der Vererbung nur durch die Befolgung des Liskov-Substitutionsprinzips zuverlässig sichergestellt werden. Die Implementierungsmethode ist schnittstellenorientierte Programmierung: Abstrahieren Sie den öffentlichen Teil in eine Basisklassenschnittstelle oder eine abstrakte Klasse, verwenden Sie ExtractAbstractClass und implementieren Sie neue Methoden in der Unterklasse, indem Sie die übergeordnete Klasse überschreiben Klassenmethode, um die gleichen Verantwortlichkeiten zu unterstützen. Das Liskov-Substitutionsprinzip kann eine gute Skalierbarkeit des Systems gewährleisten und gleichzeitig einen auf Polymorphismus basierenden Abstraktionsmechanismus implementieren, der die Coderedundanz reduzieren und Typdiskriminierung während der Laufzeit vermeiden kann.
※Prinzip der Schnittstellenisolation: Mehrere kundenbezogene Schnittstellen sind besser als eine allgemeine Schnittstelle. Es gibt zwei Hauptmethoden zur Trennung: 1. Delegationstrennung, indem ein neuer Typ zum Delegieren der Clientanforderung hinzugefügt wird, wodurch die direkte Abhängigkeit des Clients und der Schnittstelle isoliert wird, aber der Systemaufwand erhöht wird. 2. Trennen Sie die Mehrfachvererbung und realisieren Sie die Kundenanforderungen durch Schnittstellen-Mehrfachvererbung. Diese Methode ist besser.
Die folgenden zwei Prinzipien wurden bisher noch nicht erwähnt und sind ebenfalls wichtige Prinzipien, die beim Entwerfen zu berücksichtigen sind.
※Demeters Gesetz: Interagieren Sie nicht direkt zwischen Klassen, die nicht direkt miteinander kommunizieren. Wenn zwei Klassen nicht direkt miteinander kommunizieren müssen, sollten die beiden Klassen nicht direkt interagieren. Wenn eine Klasse eine Methode einer Klasse aufrufen muss, kann der Aufruf über einen Dritten weitergeleitet werden. Die erste im Demeter-Gesetz betonte Prämisse besteht darin, dass bei der Gestaltung von Klassen jede Klasse die Zugriffsrechte der Mitglieder minimieren sollte. Seine Grundidee besteht darin, die lose Kopplung zwischen Klassen zu betonen.
※Synthese/AggregationWiederverwendungsprinzip: Verwenden Sie Zusammensetzung/Aggregation so weit wie möglich und versuchen Sie, keine Vererbung zu verwenden. Zusammensetzung (ComPosition) und Aggregation (Aggregation) sind beides spezielle Arten der Assoziation; Zusammensetzung ist eine starke Eigentumsbeziehung, die strikte Teile und Ganzes verkörpert gleichen Lebenszyklus. Die Bevorzugung von Kompositions- oder Aggregationsprinzipien trägt dazu bei, dass jede Klasse gekapselt bleibt und sich auf eine einzelne Aufgabe konzentriert. Auf diese Weise bleiben Klassen und Klassenvererbungshierarchien klein und entwickeln sich weniger wahrscheinlich zu unkontrollierbaren Giganten
3.2 Beziehung zwischen OO-Designprinzipien
1. Der entscheidende Schritt zur Verwirklichung des „Open-Closed“-Prinzips (OCP) ist die Abstraktion. Die Vererbungsbeziehung zwischen Basisklassen und Unterklassen ist ein Spiegelbild der Abstraktion. Daher ist das Liskov-Substitutionsprinzip eine Spezifikation der spezifischen Schritte zur Erzielung einer Abstraktion. Ein Verstoß gegen das Liskov-Substitutionsprinzip bedeutet einen Verstoß gegen das „Offen-Geschlossen“-Prinzip, aber nicht unbedingt umgekehrt.
2. Das „Offen-Geschlossen“-Prinzip und das Abhängigkeitsinversionsprinzip (DIP) sind die Beziehung zwischen Zielen und Mitteln. Wenn das Prinzip des Öffnens und Schließens das Ziel ist, ist das Prinzip der Abhängigkeitsumkehr das Mittel, um das Prinzip des „Öffnens und Schließens“ zu erreichen. Wenn Sie das beste „Öffnen und Schließen“-Prinzip erreichen möchten, müssen Sie sich so weit wie möglich an das Abhängigkeitsinversionsprinzip halten. Das Abhängigkeitsinversionsprinzip ist die beste Spezifikation für „Abstraktion“.
3. Das Liskov-Substitutionsprinzip (LSP) ist die Grundlage des Abhängigkeitsinversionsprinzips, und das Abhängigkeitsinversionsprinzip ist eine wichtige Ergänzung zum Liskov-Substitutionsprinzip.
4. Das Schnittstellentrennungsprinzip (ISP) ist ebenfalls ein wichtiges Mittel, um das „Offen-Geschlossen“-Prinzip sicherzustellen.
5. Was das Single-Responsibility-Prinzip (SRP) betrifft, halte ich es persönlich für das Beste, es so weit wie möglich umzusetzen. Je einfacher die Verantwortung, desto einfacher ist die Umsetzung. schließen" und Liskov-Ersatz.
4. Die Beziehung zwischen OO-Designprinzipien und -Zielen
1. Erweiterbarkeit: Ermöglicht eine neue Klasse mit derselben Schnittstelle, um die alte Klasse zu ersetzen. Es handelt sich um die Wiederverwendung abstrakter Schnittstellen. Der Client ist auf eine abstrakte Schnittstelle und nicht auf eine konkrete Implementierungsklasse angewiesen, sodass diese konkrete Klasse durch andere konkrete Klassen ersetzt werden kann, ohne dass sich dies auf den Client auswirkt. Die folgenden Prinzipien ermöglichen Skalierbarkeit.
※Offenes/Geschlossenes Prinzip
※Richter-Substitutionsprinzip
※Abhängigkeitsumkehrprinzip
※Zusammensetzungs-/Aggregationswiederverwendungsprinzip
2. Flexibilität: Module sind relativ unabhängig und kommunizieren so wenig wie möglich. Auf diese Weise hat die Änderung eines Moduls nur geringe Auswirkungen auf andere Module.
Die folgenden Prinzipien ermöglichen die Modifizierbarkeit.
※Offenes/Geschlossenes Prinzip
※Demeter-Gesetz
※Schnittstellenisolationsprinzip
3. Substituierbarkeit Steckbarkeit: Wenn ein Teil Wenn das Bauteil nicht mehr den Anforderungen entspricht, kann das alte Teil herausgezogen und das neue Teil eingesetzt werden.
Die folgenden Prinzipien erreichen die Ersetzbarkeit.
※Offenes/Geschlossenes Prinzip
※Richter-Substitutionsprinzip
※Abhängigkeitsumkehrprinzip
※Zusammensetzungs-/Aggregationswiederverwendungsprinzip
5 . OO (objektorientierter) Designprozess
1. Analysieren Sie den Stil und klassifizieren Sie die Funktionen.
2. Abstrakte Klassen basierend auf Funktionen.
※ Klassenabstraktion – In diesem Schritt können wir eine spezifische Abstraktion der Klasse basierend auf dem „Prinzip der Einzelverantwortung“ durchführen. Versuchen Sie, die Funktionen der Klasse einfach und klar zu gestalten.
※ Kapselungsänderungspunkte – Verwenden Sie die Kapselung, um eine Grenzschicht zwischen Objekten zu erstellen , sodass Designer Änderungen auf einer Seite der Grenzschicht vornehmen können, ohne dabei unerwünschte Auswirkungen auf die andere Seite zu haben Erzielung einer losen Kopplung zwischen den Schichten.
3. Entwerfen Sie abstrakte Basisklassen und Schnittstellenklassen.
※ Bei der Abstraktion der Basisbasisklasse und der Definition der Schnittstelle muss bei der Abstraktion der Schnittstelle das „Schnittstellentrennungsprinzip“ befolgt werden.
※ Achten Sie beim Entwerfen von Schnittstellen und Basisklassen nicht immer auf Details. Denken Sie daran, für die Schnittstelle zu programmieren, nicht für die Implementierung.
※ Die Anforderungen des „Richter-Substitutionsprinzips“ müssen zwischen abstrakten Basisklassen und abgeleiteten Klassen erfüllt sein.
4. Bestimmen Sie die Kopplungsbeziehung zwischen Klassen.
4.1 Was ist die Grundlage für die Bestimmung des Kopplungsgrades?
※ Einfach ausgedrückt wird der Grad der Kopplung anhand der Stabilität der Nachfrage bestimmt.
※ Für Anforderungen mit hoher Stabilität und Anforderungen, die sich nicht leicht ändern lassen, können wir verschiedene Typen vollständig so entwerfen, dass sie eng gekoppelt sind, da dies die Effizienz verbessern kann, und wir können auch einige bessere Technologien verwenden, um die Effizienz zu verbessern oder Code vereinfachen.
※ Wenn sich die Anforderungen sehr wahrscheinlich ändern, müssen wir das Kopplungsproblem zwischen Klassen vollständig berücksichtigen. Wir können verschiedene Möglichkeiten finden, den Kopplungsgrad zu verringern, aber zusammenfassend ist es nichts weiter als Zunehmend Die Abstraktionsebene wird verwendet, um verschiedene Klassen zu isolieren. Diese Abstraktionsebene kann eine abstrakte Klasse, eine konkrete Klasse, eine Schnittstelle oder eine Gruppe von Klassen sein. Wir können die Idee der Reduzierung der Kopplung in einem Satz zusammenfassen: „Programmieren für Schnittstellen, nicht Programmieren für die Implementierung.“
※ Versuchen Sie bei der Bestimmung der Kopplungsbeziehung von Klassen, „Dimiters Gesetz“ und „Synthese“ zu berücksichtigen. / Aggregation Reuse Principle".
4.2 Wie erreicht man eine Abhängigkeitsumkehr?
※ Die abstrakte Kopplung ist der Schlüssel zur Abhängigkeitsumkehr Prinzip: Abstrakte Kopplungsbeziehungen beinhalten immer konkrete Klassen, die von abstrakten Klassen erben, und es muss sichergestellt werden, dass jeder Verweis auf eine Basisklasse auf ihre Unterklasse geändert werden kann Basis.
※ Abhängig von der Abstraktion: Es wird empfohlen, sich nicht auf konkrete Klassen zu verlassen, d. h. alle Abhängigkeiten im Programm sollten an abstrakten Klassen oder Schnittstellen enden. Versuchen Sie Folgendes:
Variable sollte einen Zeiger oder Verweis auf eine konkrete Klasse enthalten. (2) Keine Klasse sollte von einer konkreten Klasse abgeleitet werden eine konkrete Klasse. Sie sollten die implementierten Methoden in keiner ihrer Basisklassen überschreiben
5. Verwenden Sie die 5 Prinzipien des OO-Designs, um das Design weiter zu optimieren ※ Für die Abstraktion und Funktionen der Klasse, ob sie das „Single-Responsibility-Prinzip“ erfüllt.
※ Für Vererbungsbeziehungen und Verweise auf Basisklassen, ob sie das „Liskov-Substitutionsprinzip“ und die „Abhängigkeitsinversion“ erfüllt Prinzip“※ Ob für Schnittstellen und Basisklassen das „Interface-Isolationsprinzip“ erfüllt ist
※ Ob das „Open-Close-Prinzip“ generell erfüllt ist
Im Allgemeinen beim Entwerfen Beim objektorientierten Design ist es notwendig, die fünf Hauptprinzipien des Designs vollständig zu berücksichtigen, aber das blinde Verfolgen des Prinzips der Zufriedenheit kann auch zu einem Leistungs- und Ressourcenverbrauch des entworfenen Systems führen Die Gestaltung kann je nach Situation erfolgen
Das obige ist der detaillierte Inhalt vonEine kurze Einführung in die Konzepte und Designprinzipien von OO in Java (Sammlung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!