Was hat Ihrer Meinung nach die objektorientierte Programmierung so erfolgreich gemacht?
- Message Passing
- Erbe
- Polymorphismus
- Verkapselung
Oder eine andere Funktion, die Sie vielleicht vorstellen möchten.
Ich möchte auch wissen, in welchem Zusammenhang Abstract Data Type und Object Oriented Programming stehen.
object-oriented
Tony
quelle
quelle
Antworten:
Ich würde vorschlagen, dass das wichtigste Merkmal der objektorientierten Programmierung das Komplexitätsmanagement ist .
Das menschliche Gehirn kann nur so viele Konzepte gleichzeitig speichern - die oft zitierte Grenze, sich an 7 +/- 2 unabhängige Elemente zu erinnern, fällt ein.
Wenn ich bei der Arbeit an einem 600-Kloc-System arbeite, kann ich nicht alles auf einmal im Kopf behalten. Wenn ich das tun müsste, würde ich nur auf viel kleineren Systemen arbeiten.
Zum Glück muss ich nicht. Die verschiedenen Entwurfsmuster und anderen Strukturen, die wir in diesem Projekt verwendet haben, bedeuten, dass ich mich nicht sofort mit dem gesamten System befassen muss - ich kann einzelne Teile aufnehmen und daran arbeiten, da ich weiß, dass sie in die breitere Anwendung passen auf genau definierte Weise.
Alle wichtigen OO-Konzepte bieten Möglichkeiten zum Verwalten der Komplexität.
Kapselung - Lassen Sie mich mit einer externen API umgehen, die mir verschiedene Dienste zur Verfügung stellt, ohne sich Gedanken darüber zu machen, wie diese Dienste implementiert werden.
Abstraktion - lassen Sie mich auf die wesentlichen Merkmale konzentrieren und ignorieren, was nicht relevant ist.
Komposition - Lassen Sie mich Komponenten wiederverwenden, die bereits in neuen Kombinationen erstellt wurden
Polymorphismus - lassen Sie mich nach einem Dienst fragen, ohne sich Gedanken darüber zu machen, wie verschiedene Objekte ihn auf unterschiedliche Weise bereitstellen könnten.
Vererbung - Lassen Sie mich eine Schnittstelle oder Implementierung wiederverwenden und nur die Teile bereitstellen, die sich von den vorherigen unterscheiden.
Prinzip der Einzelverantwortung - Lässt den Zweck für jedes Objekt klar und prägnant sein, sodass es einfach ist, darüber nachzudenken
Liskov Substitution Prinicple - lasst uns nicht Fallen füreinander legen, indem wir ungerade Abhängigkeiten einführen
Open / Closed-Prinzip - Lassen Sie uns die Erweiterung und Änderung auf eine Weise zulassen, bei der wir nicht riskieren müssen, vorhandenen Code zu beschädigen
Abhängigkeitsinjektion - Lassen Sie uns die Komposition auf die nächste Ebene heben und die Komponenten erst viel später zusammenbauen.
Schnittstellenorientierte Entwicklung - Lasst uns die Abstraktion auf die nächste Ebene heben und nur von der Abstraktion abhängen, niemals von einer konkreten Implementierung.
quelle
Grafische Benutzeroberflächen. In den späten achtziger, frühen neunziger Jahren, als Macs, Amigas, Atari STs, Windows und GEM anfingen, zeichenbasierte Benutzeroberflächen zu ersetzen, wurde deutlich, dass Sprachen wie C nicht gut zum Schreiben von GUI-Programmen geeignet sind. Während die traditionelle Datenverarbeitung als "Eingabedaten -> Verarbeitung -> Ausgabedaten" -Schema betrachtet wird, was auch in einer prozeduralen Sprache möglich ist, haben sich die OO-Funktionen als nützlich erwiesen, um die inhärente Komplexität einer GUI zu bewältigen.
quelle
Das von Encapsulation bereitgestellte Ausblenden von Daten.
quelle
Eine Funktion, die in keiner der anderen Antworten erwähnt wurde: die Domänenmodellierung . Da die Leute dazu neigen, über das Tun von Dingen mit oder an Objekten und über Objekte mit intrinsischen Eigenschaften nachzudenken, ist es sehr einfach, ein Problem oder einen Workflow mit objektorientierter Software zu modellieren. Im Wesentlichen ermöglicht es uns, unsere vorhandenen Fähigkeiten zu nutzen, um mit Substantiven, Verben und Adjektiven im Code umzugehen.
quelle
Ich denke, Vererbung ist der wichtigste Punkt von OOP.
[aus der Spieleentwicklung] Sie können so etwas wie eine Drawable-Klasse mit Rendermethoden und -attributen erstellen und eine Spaceship- und Planet-Klasse erstellen, die von Drawable erbt. Nehmen Sie alle Objekte von diesen [und anderen Sprite-Kindern], werfen Sie ein drawableObjArray ein und rufen Sie einfach die draw-Methode für jedes Objekt auf. Sie müssen nur wissen, dass es ein Drawable ist.
quelle
Abstraktion
Bereitstellung der notwendigen Dienste, um das Unnötige zu verbergen. Siehe meine Erklärung hier - Was ist Abstraktion?
quelle
Es ist einigermaßen erfolgreich, weil es die Verwendung der Organisation von Dingen in Objekten durch den menschlichen Geist fördert. Menschen sind im Allgemeinen gut darin, Zusammenhänge von Dingen zu erkennen - Unterschiede, Ähnlichkeiten und Verhaltensweisen. OO ermutigt zur Entwicklung von Software, um die menschliche Konzeptualisierung der Welt nachzuahmen.
Indem wir die Softwareentwicklung so gestalten, wie wir die Welt sehen, fällt es unseren Köpfen leichter, mit der Komplexität umzugehen.
quelle
" ADT vs objects " wurde hier schon mehrmals gefragt. Die einzeilige Antwort lautet: "ADTs und Objekte sind die Umkehrung voneinander - was einer ordentlich abstrahiert, kann der andere nicht; jeder lässt Flexibilität auf unterschiedliche Weise zu."
Eine längere Antwort finden Sie in William Cooks Über das Verständnis der Datenabstraktion, Revisited . Kurz gesagt, mit Objekten können Sie problemlos mehrere Implementierungen / Darstellungen eines Datums verwenden (etwas, das wie eine Liste aussieht, kann ein Array oder ein selbstausgleichender Baum sein oder ...), aber es ist schwierig, neue Operationen hinzuzufügen (weil Sie dies tun) müssen diese neue Operation zu jeder Ihrer Darstellungen hinzufügen), während ADTs das Hinzufügen neuer Operationen für Ihren Datentyp vereinfachen, es jedoch schwierig machen, mehrere Implementierungen zu haben.
Edit: Ich hatte gesagt, dass die Weitergabe von Nachrichten OO erfolgreich gemacht hat. Basierend auf Jonas 'Kommentar ist das nicht richtig, da die meisten Sprachen, die als OO gelten, keine Nachrichtenübermittlung verwenden. Da es nicht richtig ist, habe ich es aus meiner Antwort entfernt.
quelle
Meine drei Top-Features. Objektzusammensetzung - Objekte können zusammenarbeiten. Polymorphismus - unterstützt dynamisches Verhalten zur Laufzeit. Vererbung - durch Wiederverwenden von Code und Ändern des Verhaltens durch Überschreiben von Methoden.
ADT - das können Sie auch in nicht objektorientierten Sprachen wie Pascal haben. Ein Stapel oder eine Warteschlange sind Beispiele für ADT.
quelle
Mit einfachen Worten: OOP ist der Schlüssel zur Wiederverwendbarkeit und Kapselung, die zur Produktion großer Frameworks führt, die Programmierern in dieser Ära das Leben leichter machen, da sie einfach die APIs aufrufen und das tun können, was sie am häufigsten möchten.
Wie deine Frage ist über die 4 Features von OOP so kann man sagen
also 1. Message Passing und 3. Polymorphism unterstützen tatsächlich 2. Inheritance und 4. Encapsulation.
quelle
Meiner Meinung nach sind die letzten drei Features die wichtigsten, die die weit verbreitete Nutzung von OOP beeinflusst haben:
Edit: Ein weiterer Punkt wäre IDE Entwicklungsumgebungen und grafische Benutzeroberflächen wie Visual Studio und Eclipse. Da sie OOP-Sprachen umfassen, tendierten immer mehr Designs zu OOP.
Und natürlich sind es auch die SOLID-Prinzipien , die die Softwareprodukte ROCK zu einer soliden Leistung machen :)
quelle