Informationen zur objektorientierten Programmierung

Es wird angenommen, dass die objektorientierte Programmierung auf drei SĂ€ulen basiert, die dem Programmierer Vorteile gegenĂŒber dem prozeduralen Ansatz bieten. Sie sind Verkapselung, Vererbung und Polymorphismus.Durch die Vererbung können Sie die Codeduplizierung bei Verwendung des objektorientierten Ansatzes erheblich beseitigen. Wenn Sie es jedoch verwenden, sollten Sie sich immer an eines der Prinzipien von SOLID erinnern, das als Liskov-Substitution bezeichnet wird und das, sofern Sie nicht auf Details eingehen, besagt, dass Vererbung nur als Implementierung der Is-Beziehung verwendet werden sollte. Das heißt, die Klasse des Nachkommen muss eine Unterart des Elternteils sein. Beispielsweise könnten Sie die Bird-Klasse und ihre Unterklassen Sparrow (Sparrow) und Raven (Raven) haben, die beispielsweise die fly-Methode erben (und erweitern oder Ă€ndern können). Wenn Sie jedoch einen Nachkommen von Bird namens Penguin (Pinguin) erstellen und dessen Flugmethode beispielsweise eine Ausnahme auslöst (weil Pinguine nicht fliegen), verstĂ¶ĂŸt dies gegen das Liskov-Substitutionsprinzip. Apropos Vererbung,ErwĂ€hnenswert ist auch ein wichtiges Prinzip, an das sich die Viererbande (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides) in seinem Buch Design Patterns: Elements of Reusable Object-Oriented Software (1994) hĂ€lt, das besagt, dass Sie es versuchen sollten Verwenden Sie Komposition (wenn ein Objekt ein anderes Objekt „enthĂ€lt“), anstatt so viel wie möglich zu erben. TatsĂ€chlich basieren viele der von der „Gang of Four“ erfundenen Entwurfsmuster genau auf diesem Prinzip.TatsĂ€chlich basieren viele der von der „Gang of Four“ erfundenen Entwurfsmuster genau auf diesem Prinzip.TatsĂ€chlich basieren viele der von der „Gang of Four“ erfundenen Entwurfsmuster genau auf diesem Prinzip.

In der Praxis wird Vererbung im Allgemeinen nicht so oft verwendet, obwohl gute Programmierer sie in den meisten FĂ€llen durch eine Komposition ersetzen. HĂ€ufiger gibt es mehrere Implementierungen einer Schnittstelle, die als AbhĂ€ngigkeiten in Clientklassen angegeben werden. Damit können Sie die zweite SĂ€ule des OOP nutzen - den Polymorphismus. Dadurch können Sie verschiedene AbhĂ€ngigkeitsimplementierungen an den Clientcode ĂŒbergeben. Aufgrund der Tatsache, dass die ĂŒbertragenen AbhĂ€ngigkeiten dieselbe Schnittstelle haben, ist es dem Client (abhĂ€ngig von der Schnittstelle) egal, welches Objekt zu ihm gekommen ist, und dies ermöglicht es dem Programmierer, wĂ€hrend der AusfĂŒhrung des Programms zu Ă€ndern, auf welche Weise (welche Implementierung der Schnittstelle) die endgĂŒltige Aufgabe gelöst wird. Apropos OOP, man kann nur die Kapselung erwĂ€hnen. Dies ist ein wesentliches Element von OOP,Dies bietet die Möglichkeit, Abstraktionen zu erstellen, um Implementierungsdetails auf niedriger Ebene auszublenden und gleichzeitig die KomplexitĂ€t der Entwicklung zu verringern. Implementierungsdetails werden durch Zugriffsmodifikatoren auf Methoden wie privat und geschĂŒtzt ausgeblendet. Wenn Sie Klassen erstellen, mĂŒssen Sie sie so erstellen, dass ihre Schnittstellen (zugĂ€ngliche öffentliche Methoden) eine konsistente Abstraktion bieten.sonst ist es nicht mehr OOP (!) . Nehmen wir zum Beispiel an, wir entwickeln ein Programm, das das KĂŒhlsystem eines Kernreaktors steuert. Dann kann die vereinbarte Abstraktion der Schnittstelle wie folgt aussehen.

CoolingSystem::getTemperature()
CoolingSystem::SetCirculationRate($rate)
CoolingSystem::OpenValve($valveNumber)
CoolingSystem::CloseValve($valveNumber)

Dank einer kurzen ausdrucksstarken OberflĂ€che, die eine kohĂ€rente Abstraktion bildet, können wir mit dem ReaktorkĂŒhlsystem arbeiten, ohne die geringste Ahnung von den Implementierungsdetails auf niedriger Ebene zu haben, die fĂŒr die ausgewĂ€hlte Technologie charakteristisch sind. Die Verwendung von Abstraktionen kann die KomplexitĂ€t des entwickelten Systems erheblich reduzieren. Und der Kampf gegen die KomplexitĂ€t ist das wichtigste technische Gebot der Entwicklung. Hier einige weitere Beispiele fĂŒr konsistente Abstraktionen:

Geschwindigkeitsregelungssystem:

  • Geschwindigkeit einstellen
  • Aktuelle Einstellungen abrufen
  • Stellen Sie den vorherigen Geschwindigkeitswert wieder her
  • System deaktivieren

KaffeemĂŒhle:

  • Aktivieren
  • Ausschalten
  • Geschwindigkeit einstellen
  • Fangen Sie an, Kaffee zu mahlen
  • Hör auf, Kaffee zu mahlen

Treibstofftank:

  • FĂŒllen Sie den Kraftstofftank
  • Kraftstoff ablassen
  • Holen Sie sich die KapazitĂ€t des Kraftstofftanks
  • Holen Sie sich den Tankstatus

Lampe:

  • Aktivieren
  • Ausschalten

Deklarieren Sie beim Entwerfen der Schnittstelle eines Objekts nur die Methoden als öffentlich, die der Client verwalten muss, und verbergen Sie alles andere. Als Ergebnis sollten Sie Blackboxen erhalten, deren GerĂ€t Sie nach dem HinzufĂŒgen des Klassencodes vergessen können. Dieser Ansatz kann die KomplexitĂ€t des entwickelten Systems erheblich reduzieren.

All Articles