Was hat die objektorientierte Programmierung erfolgreich gemacht? [geschlossen]


17

Was hat Ihrer Meinung nach die objektorientierte Programmierung so erfolgreich gemacht?

  1. Message Passing
  2. Erbe
  3. Polymorphismus
  4. 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.


beliebt und erfolgreich sind auch nicht
Kevin Cline

Antworten:


76

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.


6
+1. Ich kann nur einmal abstimmen, was schade ist, dass dies mehr verdient.
Richard

1
Das hat eine Konsequenz. Schade, dass ich die Referenz derzeit nicht finden kann, aber ich werde versuchen, mich daran zu erinnern, sie nachzuschlagen und den Kommentar zu bearbeiten. Eine Untersuchung der Codeüberprüfungspraktiken ergab, dass Codeüberprüfungen tendenziell länger dauern, um Fehler im OO-Code zu finden als im prozeduralen Code, da der Fluss im OO-Code mehr herumspringt. Praktiken wie TDD und Pair Programming mildern das ab, aber es ist immer noch ein interessantes (und für mich unerwartetes) Ergebnis.

5
Dies könnte die perfekte Antwort sein - Informationen sind vollständig, aber kurz genug, damit der Leser keinen Roman lesen muss. Bravo
Tim Claason

@ Abraham Lee: Ich würde gerne diese Studie lesen.
Frank Shearar


13

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.


1
+1 für die Erwähnung von GUI-Anwendungen. Objektorientierung war das Werkzeug, das die Implementierung von GUIs ermöglichte, die ansonsten (mit prozeduralem Code) ziemlich schwierig zu verwalten waren.
Giorgio

7

Das von Encapsulation bereitgestellte Ausblenden von Daten.


Das ist eine Antwort? ADTs bieten Datenverstecken (weshalb sie "Datenabstraktionen" genannt werden)
Frank Shearar

@Frank, er fragte nach bestimmten Funktionen und als ich diese Antwort schrieb, gab es nur eine andere und ich versuchte nicht zu duplizieren.

Fair genug, aber die Kapselung ist nicht genau OO-spezifisch. Ich sollte das selbst überprüfen, aber ich bin mir ziemlich sicher, dass wir die Kapselung lange vor OO durchgeführt haben.
Frank Shearar

1
@Frank, ich stimme zu, es ist nicht spezifisch für OO, es ist nur eines der Hauptmerkmale.

Das gilt für die meisten OOPLs, aber nicht für alle. CLOS ist eine bemerkenswerte Ausnahme.
Frank Shearar

7

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.


6

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.


2
Ja wirklich?? Polymorphismus ist viel wichtiger und erfordert keine Vererbung (aus theoretischer Sicht).
Thomas Eding

Benötigt nicht einmal virtuelle Funktionen nur Funktionszeiger.
Calmarius

1
Alan Kays ursprüngliches Konzept von OO enthielt nicht einmal die Vererbung, da ihm die Implementierung in früheren Systemen nicht gefiel.
Michael Borgwardt

3

Abstraktion

Bereitstellung der notwendigen Dienste, um das Unnötige zu verbergen. Siehe meine Erklärung hier - Was ist Abstraktion?


Tippfehler: "Absraction" sollte "Abstraction" sein
Vetle

2

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.


Vielleicht liegt es an mehr Erfahrung mit prozeduralem Vorgehen, aber nachdem ich beide Methoden verwendet habe, finde ich es immer noch intuitiver, prozedurales Vorgehen zu tun als OOP. Trotzdem mag ich die guten Teile beider Stile.
Juha Untinen

1

" 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.


1
Das Weiterleiten von Nachrichten kann kaum die Antwort sein, da keine der erfolgreichen OOP-Sprachen diese verwendet.
Jonas

Dein OO ist nicht unbedingt mein OO. Und die meisten Sprachen, die als OO bezeichnet werden, sind nach Alan Kays Definition keine. Ich vergesse das genaue Zitat, aber Kay sagte, dass Objekte nicht das waren, was an Smalltalk wichtig war, sondern das Weitergeben von Nachrichten (und das hat diesen Punkt am meisten verfehlt).
Frank Shearar

@Jonas Ich denke, nach dem erneuten Lesen der Frage und meiner Antwort sage ich halb: "OO ist nicht erfolgreich, da so wenige Sprachen es richtig machen." Aber ich sage solche Dinge nur, wenn ich meinen Flammschutzanzug trage.
Frank Shearar

0

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.


"ADT - das können Sie auch in nicht objektorientierten Sprachen wie Pascal haben. Ein Stack oder eine Warteschlange sind Beispiele für ADT.": Richtig. OOP erleichtert es jedoch, die Schnittstelle eines ADT zu definieren und eine andere, austauschbare Implementierung bereitzustellen (Schnittstelle / abstrakte Klasse <---> Unterklassen / konkrete Klassen). Soweit ich weiß, ist es in Pascal nicht so einfach.
Giorgio

0

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

  1. Vererbung und 4. Kapselung sind die wichtigsten Merkmale, und zwei weitere sind sehr wichtig, um die ersten beiden zu erreichen

also 1. Message Passing und 3. Polymorphism unterstützen tatsächlich 2. Inheritance und 4. Encapsulation.

  1. Vererbung und 4. Kapselung sind der Schlüssel zum Erfolg von OOP

Vererbung ist meistens nicht erforderlich, eine definierende Komponente von OOP oder sogar ein sehr wünschenswerter Teil von OOP. Kapselung ist ein gutes Prinzip für die Programmierung im Allgemeinen. Es wurde nicht von OOP erfunden und wird nicht nur in OOP verwendet.
Sara

-1

Meiner Meinung nach sind die letzten drei Features die wichtigsten, die die weit verbreitete Nutzung von OOP beeinflusst haben:

2. Inheritance
3. Polymorphism
4. Encapsulation

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 :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.