Welche Funktionen sind für die Objektorientierung erforderlich?

9

Ich frage mich nur, welche Funktionen eine Sprache oder Bibliothek genau bieten muss, damit sie als "objektorientiert" definiert werden kann. Ist Objektorientierung etwas, das mehr oder weniger in jeder universellen Programmiersprache mit anständigen Funktionen erreicht werden kann? Oder kann dies nur in Sprachen erreicht werden, die ausdrücklich dafür werben, dass sie objektorientierte Programmierung unterstützen?

Sehen Sie sich beispielsweise den folgenden C-Code an:

SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );

oder der hier diskutierte Code .

Jetzt verwendet der obige Code keine Vererbung, Laufzeit-Polymorphismus (?), Virtuelle Funktionen usw. Aber es scheint mir ziemlich OOP.

Schreibt die Objektorientierung einfach Code, der auf erstellbaren und zerstörbaren Datenstrukturen wie Objekten, Klassen, Strukturen usw. basiert, für die keine speziellen Muster oder Funktionen erforderlich sind, die von der Programmiersprache oder einer Bibliothek bereitgestellt werden ?

ApprenticeHacker
quelle
2
OOP erfordert im Allgemeinen Objekte . Es ist jedoch möglich, Code zu schreiben , der in den meisten Sprachen OOP aussieht (ich bezweifle, dass Sie sagen können, "diese Assembly sieht OOP aus")
Raynos
Der obige Code verwendet keine if- Anweisung oder eine Schleife . Es wird keine Multiplikation oder Addition verwendet. Sie können nicht zwei Codezeilen und eine Liste der nicht gezeigten Dinge verwenden , um überhaupt ein Urteil zu fällen. Aus diesen beiden Codezeilen konnte ich schließen, dass es sich um eine streng faule funktionale Programmiersprache handelt, nicht um eine OO-Sprache. Die Verwendung von zwei Codezeilen als Teil einer Verallgemeinerung ist keine echte Frage.
S.Lott
Der Link ist auch in dem obigen Code enthalten, den ich beurteilt habe. Beachten Sie auch, dass es kein Urteil ist. Ich frage Sie, ob dies als OOP angesehen werden kann.
ApprenticeHacker
Die triviale Antwort lautet ja . Mein Punkt ist dies. Sie können anhand von Codebeispielen kein Urteil über OOP fällen. Es ist eine triviale Frage der Definition. Entweder wird die Sprache definiert als OOP - Sprache oder es nicht ist. Für bestimmte Codebeispiele sind möglicherweise nicht alle OOP-Funktionen erforderlich . In der Tat kann OOP-Code sehr, sehr wenige Funktionen verwenden. In Python zum Beispiel ist es 1+2wirklich objektorientiert. Es ist ein Konstruktor, der aus zwei vorhandenen Objekten ein neues Objekt erstellt. Die Verwendung von Codebeispielen zeigt nichts.
S.Lott
Was ist falsch daran, diese Definition zu verwenden und sie mit der Sprache zu vergleichen (nicht zwei Codebeispiele)? en.wikipedia.org/wiki/…
S.Lott

Antworten:

11

Laut Alan Kay, der den Begriff "objektorientiert" erfunden hat,

OOP bedeutet für mich nur Messaging, lokale Aufbewahrung und Schutz sowie das Verstecken von Staatsprozessen und die extreme Spätbindung aller Dinge. Dies kann in Smalltalk und in LISP erfolgen. Es gibt möglicherweise andere Systeme, in denen dies möglich ist, aber ich bin mir ihrer nicht bewusst.

Messaging (wie in Smalltalk implementiert) ist ein mit Polymorphismus vergleichbares Konzept, jedoch leistungsfähiger (zumindest als die von C ++ oder Java unterstützte Art von Polymorphismus). Es kann in allen Sprachen durchgeführt werden, ist jedoch ziemlich schmerzhaft, wenn es nicht direkt von der Sprache unterstützt wird. Grundsätzlich bedeutet dies, dass Objekte sich gegenseitig Nachrichten senden können, die alles enthalten, und amd reagieren kann, wie sie auf Nachrichten wollen, die sie empfangen. Um Messaging vollständig zu unterstützen, muss es eine Möglichkeit geben, dass Objekte flexibel auf Nachrichten reagieren können, ohne sie im Quellcode aufzulisten (was im Grunde die Methoden- / Funktionsdefinitionen tun).

Die lokale Beibehaltung und der Schutz sowie das Verbergen des staatlichen Prozesses - die Einkapselung der AKA - können durch Konvention in allen Sprachen erfolgen, aber das ist etwas Betrug. Die lokale Aufbewahrung auf Sprachebene scheint tatsächlich das einzige Merkmal zu sein, das alle Sprachen, die behaupten, OO zu sein (und viele, die dies nicht tun), gemeinsam nutzen. Es gibt im Allgemeinen eine Möglichkeit, zusammengesetzte Datentypen mit mehreren Instanzen zu erstellen. Das Schützen und Verstecken erfolgt dagegen oft nur durch Konvention.

Späte Bindung aller Dinge - eine gleitende Skala, auf der C wirklich weit von Kays Vision entfernt ist (wie C ++, während Java viel näher ist). Kann gefälscht werden (siehe COM), aber das ist ein Schmerz zu benutzen.

Beachten Sie, dass Kay die Vererbung nicht erwähnt . In derselben E-Mail schrieb er

Ich mochte die Art und Weise, wie Simula I oder Simula 67 vererbten, nicht (obwohl ich dachte, Nygaard und Dahl seien nur großartige Denker und Designer). Deshalb habe ich beschlossen, die Vererbung als integrierte Funktion wegzulassen, bis ich sie besser verstanden habe

Michael Borgwardt
quelle
4
Wie genau sind Java und C # der späten Bindung näher als C ++?
Fredoverflow
@FredOverflow: Java lädt Klassendefinitionen zur Laufzeit träge, wenn sie zum ersten Mal verwendet werden, und dies implizit über einen äußerst flexiblen Mechanismus, mit dem neue Klassen problemlos hinzugefügt oder sogar im laufenden Betrieb generiert werden können. In C ++ müssen Sie Ihre ausführbare Datei erneut verknüpfen oder Bibliotheken explizit laden. Die Situation mit C # scheint weniger klar zu sein als ich dachte, also habe ich den Verweis auf ti entfernt.
Michael Borgwardt
5

Bei der objektorientierten Programmierung geht es nicht um Syntaxfunktionen, sondern um eine Codierungs- und Designphilosophie. Im Kern steht das Konzept eines Objekts , bei dem es sich um ein Konstrukt handelt, das Zustände mit Routinen gruppiert, um darauf zu reagieren (oder, abhängig von Ihrer Sichtweise, Antworten auf Nachrichten). Der andere wichtige Aspekt von OOP ist die Kapselung : Implementieren von Implementierungsdetails in undurchsichtige Strukturen und Verbinden dieser über genau definierte Schnittstellen. So ziemlich alles andere in der OOP-Theorie geht auf diese beiden Grundlagen zurück.

Daher kann jede Sprache, die Objekte (Entitäten, die sowohl Daten als auch Code enthalten) und Kapselung irgendwie modellieren kann, für OOP verwendet werden. In C können Sie beispielsweise Funktionszeiger verwenden, um Funktionen in Strukturen zu speichern, und Sie können das Header- / Quelldateisystem verwenden, um die Kapselung zu realisieren. Es ist nicht bequem, aber es reicht aus, um OOP zu machen. Sie können wahrscheinlich sogar so etwas wie Haskell oder ML dazu bringen, OOP zu machen, und ich wäre nicht überrascht, wenn jemand einen Weg finden könnte, OOP in der Montage zu machen.

In der Praxis kann eine Sprache jedoch als "objektorientiert" bezeichnet werden, wenn sie einen vollständigen Satz von Syntaxfunktionen für die explizite objektorientierte Programmierung bietet. In der Regel bedeutet dies, dass eine solche Sprache Folgendes haben sollte: * einen Begriff eines Objekts * einen Begriff des Methodenaufrufs oder der Nachrichtenübermittlung * eine komfortable und unkomplizierte Möglichkeit, den Zugriff auf Objektmitglieder zu steuern * eine komfortable und unkomplizierte Art der Definition von Schnittstellen

Folglich würde ich einen Code als objektorientiert bezeichnen, wenn er den OOP-Prinzipien entspricht und die verfügbare OOP-Syntax verwendet.

BTW. Ihr Codebeispiel wahrscheinlich tut Verwendung Polymorphismus und virtuelle Funktionen, obwohl die C - Syntax nicht offensichtlich macht. Ich bin kein SDL-Experte, aber ich würde erwarten, dass ein Unternehmen SDL_surfaceverschiedene Arten von Oberflächen darstellen kann, von denen jede ihre eigenen Implementierungen hat. Das Aufteilen von Daten auf eine Speicher-Bitmap und das Aufteilen auf eine Bildschirmoberfläche erfordert radikal andere Code, aber die Schnittstelle (die Funktionen, die ein SDL_surface*als Argument verwenden) bleibt gleich. Auf diese Weise wird auch die Kapselung implementiert: Sie können nicht direkt auf die zugrunde liegende Darstellung einer Oberfläche zugreifen, sondern müssen Funktionen durchlaufen, die wissen, wie man mit einer handelt SDL_surface, denn das ist alles, was Sie haben. Es ist ein schönes Beispiel dafür, wie Sie OOP in C machen würden.

tdammers
quelle
Abstrakte Datentypen, Datenmodellierung und Kapselung sind jedoch nicht nur für OO verfügbar (wie Sie selbst kurz erwähnen). Ich würde es vorziehen, OO anhand seiner einzigartigeren Merkmale (dynamische Bindung von Methodenaufrufen, Polymorphismus über diese Methodenaufrufe usw.) zu beschreiben
hugomg
4

Mein Verständnis von OO ist, dass OO eine Denkweise und eine Implementierung ist, die auf der Idee basiert, dass eine Rechenaufgabe von einem Arbeiter (Objekt) oder durch die Zusammenarbeit einzelner Arbeiter (Objekte) durch Nachrichtenübermittlung zwischen diesen Arbeitern ( Objekte) zur Laufzeit. Dieses Laufzeitverhalten erfordert solide statische und dynamische Konstrukte, um es zu aktivieren.

Die spezifische Syntax zum Implementieren von OO ist nicht der Schlüssel, der bestimmt, ob eine Sprache ein OO ist oder nicht. Zum Beispiel haben Smalltalk und C # unterschiedliche Syntaxen, aber beide sind OO-Sprachen (in unterschiedlichem Maße). Der Schlüssel ist, ob die gegebene Sprache die Philosophie (oben) bewahrt und die erforderlichen Implantationsmittel bereitstellt.

Keine Chance
quelle
2

Als Student wurde mir beigebracht, dass objektorientierte Programmierung auf drei Säulen steht:

  • Einkapselung ,
  • Polymorphismus und
  • Vererbung .

Eine Sprache muss diese Funktionen unterstützen , um als objektorientierte Sprache betrachtet zu werden.

Beachten Sie, dass dies eher eine Reihe von Funktionen als die Syntax beschreibt . Daher, ob Sie schreiben müssen

type obj; // or type obj = new type;
obj.func(arg);

oder

type* ptr = create_type();
func(ptr, arg); 

spielt keine Rolle.

Sie können also tatsächlich nach dem objektorientierten Paradigma in C programmieren. Die Sprache bietet jedoch keine Unterstützung dafür, was es zu einer ziemlich schmerzhaften Übung macht. Aus diesem Grund wird C nicht als objektorientierte Sprache betrachtet.

sbi
quelle
2
Das Unterrichten dieser "Säulen" hat der Welt wahrscheinlich mehr geschadet als geholfen. Die Kapselung ist gut, aber das war es auch schon.
tdammers
1
Sie sind in dieser Liste, also scheinen sie weithin akzeptiert zu sein: en.wikipedia.org/wiki/…
S.Lott
Können Sie erklären, warum Polymorphismus und Vererbung schlecht sind?
MathAttack
@ MathAttack: Sprichst du mit mir? Weil ich es bestimmt nicht gesagt habe.
sbi
1
@missingno: Etwas muss nicht für ein Paradigma eindeutig sein, um als wichtig für die Unterscheidung des Paradigmas angesehen zu werden. Die Kapselung muss nicht mehr nur für OOP gelten, sondern auch für die strukturierte Programmierung.
sbi
2

Sie können OO in jeder anständigen Allzwecksprache ausführen.

Es ist einfacher , dies in einer "OO" -Sprache zu tun, da Sie idiomatische Konstrukte zur Verfügung haben und nicht auf etwas wie OO in C zurückgreifen müssen - was möglich, aber schrecklich ist.

Ob die OO-Konstrukte von der Sprache selbst, von ihrer Standardbibliothek oder von einer anderen Bibliothek bereitgestellt werden, spielt keine große Rolle, da einige Sprachen (z. B. Scala) es Bibliotheken ermöglichen, Sprachkonstrukte hinzuzufügen, so dass dies aus Sicht des Programmierers fast unmöglich ist zu unterscheiden, welche Dinge von der Kernsprache und welche von einer Bibliothek bereitgestellt werden.

Joonas Pulakka
quelle
2

Wenn Sie sich die Bandbreite der Sprachen ansehen, die allgemein als OO akzeptiert wurden, und diejenigen, die dies nicht getan haben, scheint der Test die Unterstützung für den Einschlusspolymorphismus (auch bekannt als Subtyp-Polymorphismus, aber der Einschlusspolymorphismus ist der Begriff, den Cardelli in der Sprache verwendet) Papier, das mich, und ich denke ziemlich viele andere, in eine Klassifikation von Arten von Polymorphismus einführte). IE die Möglichkeit, dass einige Variablen Werte unterschiedlichen Typs haben, und die Möglichkeit, dass einige Aufrufe je nach Typ eines oder mehrerer Werte an unterschiedliche Routinen gesendet werden. Alles andere war in Sprachen vorhanden, die nicht als OO akzeptiert wurden oder in Sprachen fehlten, die als OO gut akzeptiert wurden.

Die beiden wichtigsten anderen Merkmale, die mit OO-Sprachen verbunden sind, wurden von Nicht-OO-Sprachen bereitgestellt:

  • Die Kapselung wird von Ada83 recht gut bereitgestellt.
  • Die Vererbung erfolgt durch Oberon (Oberon ist interessant, Wirth wollte eine OO-Sprache mit möglichst weniger Kruft wie möglich versehen, musste jedoch seine Konzeption überdenken, um eine zu erhalten - Oberon-2 ist OO).
Ein Programmierer
quelle
1

Objektorientierung ist definiert als

Schauen Sie sich auch die Wikipedia-Einträge an. Dies sind die Merkmale, die eine Sprache bereitstellen muss, damit sie als objektorientiert definiert werden kann.

Betrachten Sie Ihren Code als objektorientiert, wenn er in einer objektorientierten Programmiersprache vorliegt. Selbst wenn Sie etwas schreiben, das prozedural zu sein scheint, wird es auf Methoden in Objekten aus Klassen einwirken, die Polymorphismus über Kapselung verwenden [vielleicht] :)

In Bezug auf Ihre letzte Frage lautet die Antwort wahrscheinlich. Ja. Objektorientiert handelt es sich im Grunde genommen nur um Methoden für Objekte und um diese Objekte als Parameter.

Makach
quelle
3
Von wem definiert?
Michael Borgwardt