Was ist mit dem Begriff "wahre" Objektorientierung gemeint?

8

Ich habe viel über Ruby und möglicherweise sogar Javascript gehört, die "wahre" objektorientierte Sprachen im Gegensatz zu C ++ und C # sind, die klassenorientierte (oder vorlagenbasierte) Sprachen sind. Was ist mit echtem OO gemeint und was sind die Vorteile gegenüber dem Klassen- / Template-Ansatz?

    
Jon Simpson 30.10.2008, 12:52
quelle

8 Antworten

13

Es ist ein subjektiver Begriff zur Förderung von Sprachen. Ich habe gesehen, dass C # und Java echte objektorientierte Sprachen im Vergleich zu C ++ sind, weil alles in einer Klasse sein muss (keine globalen Funktionen oder Variablen) und alle Objekte von einer Objektklasse erben.

Für Ruby kann es sich darauf beziehen, wie Ruby alles als ein Objekt behandelt, also könnten Sie 1.to_s anstelle von etwas wie str(1) oder String.valueOf(1) schreiben. Dies liegt daran, dass Ruby nicht zwischen Wert- und Referenzvariablen unterscheidet. In Javascript gibt es keine Klassen und Sie erstellen nur erweiterbare Objekte, die zur Wiederverwendung geklont werden könnten. Diese Art der Programmierung wird als Prototype- basierte Programmierung .

C ++ andererseits wird als Multi-Paradigma-Sprache beworben, die es Ihnen ermöglicht, verschiedene Ansätze wie objektorientierte, generische und prozedurale Programmierung zu verwenden. Es bleibt nicht bei einem Paradigma.

Aber ja, es ist nur ein subjektiver Begriff, der irgendetwas bedeuten kann. Im Allgemeinen bezieht es sich darauf, ob die Sprache mehr Wert auf Objekte legt als auf andere Sprachelemente wie Funktionen, Vorlagen usw. Wikipedia Artikel zu SmallTalk nennt es eine "reine" objektorientierte Sprache, und die Beschreibung gilt auch für Ruby:

  

Smalltalk ist eine "reine" OO-Sprache,   was bedeutet, dass im Gegensatz zu Java und C ++,   Es gibt keinen Unterschied zwischen den Werten   welche sind Objekte und Werte die sind   primitive Typen. In Smalltalk,   Primitive Werte wie Ganzzahlen,   Booleans und Charaktere sind auch   Objekte, in dem Sinne, dass sie sind   Instanzen entsprechender Klassen,   und Operationen auf ihnen werden von aufgerufen   Nachrichten senden. Ein Programmierer kann   Ändern Sie die implementierenden Klassen   Primitive Werte, so dass neues Verhalten   kann für ihre definiert werden   Instanzen - zum Beispiel zu implementieren   neue Kontrollstrukturen - oder so   dass ihr bestehendes Verhalten sein wird   geändert. Diese Tatsache ist in zusammengefasst   der häufig gehörte Satz "In   Smalltalk alles ist ein Objekt "   (Das wäre genauer gesagt   ausgedrückt als "alle Werte sind Objekte",   wie Variablen sind nicht).

    
Firas Assaad 30.10.2008, 13:03
quelle
2

Das C ++ Problem ist das folgende. C ++ - Klassen existieren nur in der Quellsyntax. Es gibt kein Laufzeitklassenobjekt mit Attributen und Methoden.

In Python ist alles ein Objekt. Die Klasse eines Objekts ist ein anderes Objekt mit eigenen Methoden und Attributen. Dies gilt auch für die Smalltalk-Umgebung, die eine Art Maßstab für Objektorientierung ist.

Ich denke, die "wahre" Objektorientierung bezieht sich auf jene Umgebungen, in denen alles ein Objekt ist.

[Java fällt darunter zurück, weil es primitive Typen hat.]

    
S.Lott 30.10.2008 12:57
quelle
2

Ich denke, es könnte sich auf prototypische Programmierung beziehen, ein Programmierparadigma in dem:

  

Klassen sind nicht vorhanden, und die Wiederverwendung von Verhalten (in Klassen-basierten Sprachen als Vererbung bezeichnet) wird über einen Prozess des Klonens vorhandener Objekte ausgeführt, die als Prototypen dienen. Dieses Modell kann auch als klassenlose, prototyporientierte oder instanzbasierte Programmierung bezeichnet werden.

Siehe auch Ruby Singleton-Methoden .

    
toolkit 30.10.2008 13:00
quelle
2

Das C ++ Problem ist das folgende. C ++ - Klassen existieren nur in der Quellsyntax. Es gibt kein Laufzeitklassenobjekt mit Attributen und Methoden.

Natürlich ist nach dieser Regel keine objektorientierte Programmierung auf einer konventionellen Maschinenarchitektur, da es kein Laufzeitklassenobjekt mit Attributen und Methoden auf Maschinencodeebene gibt. (Zumindest gibt es außer spezialisierten Architekturen wie dem alten System / 38 oder AS / 400 .)

Was " objektorientiert bedeutet, wurde vor langer Zeit als drei Dinge festgelegt: abstrakte Datentypen , mit Vererbung und Polymorphismus . (Der verlinkte Wikipedia-Artikel verwechselt die Eigenschaften von OO mit den Vorteilen in gewissem Maße. Aber der wichtige Unterschied ist zwischen OO und "objektbasiert" "Systeme.)

Im Allgemeinen bedeutet "X ist nicht wirklich objektorientiert, im Gegensatz zu Y" wirklich "Ich versuche dir Y zu verkaufen."

    
Charlie Martin 10.11.2008 04:55
quelle
1

Eine "wahre" oder "reine" objektorientierte Sprache bezieht sich normalerweise auf Sprachen, in denen alles ein erstklassiges Objekt einschließlich primitiver Typen ist. In C ++ und Java zum Beispiel sind die primitiven Typen int, char usw. keine Objekte. In Ruby zum Beispiel ist alles ein Objekt. Manchmal werden zusätzliche Kriterien mit der Definition impliziert, je nachdem, mit wem Sie sprechen.

    
Robert Gamble 30.10.2008 13:00
quelle
1

Eine weitere Interpretation dieses Begriffs "wahre Objektorientierung" ist, dass Sie eine Sprache verwenden können, die OOP nicht eigenständig unterstützt, und eine OOP-Methode beibehalten, die darüber hinausgeht. Zum Beispiel können Sie Kapselung in C wie

modellieren %Vor%

Techniken zur Implementierung von Vererbung und Polymorphismus wurden schon lange verwendet. Ein Beispiel ist das GObject Framework, das als Basis für gtk + verwendet wird.

Während Sie nun objektorientiert programmieren können, unterstützt C keine Objektorientierung, sondern erlaubt Ihnen lediglich, es bis zu einem gewissen Grad zu simulieren. Sie haben also keine echte Objektorientierung. Wenn Sie sich C ++ / Java / C # anschauen, haben Sie Unterstützung für all diese Arten von Dingen wie Vererbung / Datenkapselung und Dinge aus erster Hand.

    
Johannes Schaub - litb 10.11.2008 04:42
quelle
0

Der Begriff "wahre Objektorientierung" hat die gleiche Bedeutung als der schmucklose Begriff "Objektorientierung".

Wenn man den Qualifikationsmerkmal "wahr" dem "vorliegenden Thema" hinzufügt, versucht man den Leser darauf aufmerksam zu machen, dass innerhalb des aktuellen Diskurs-Universums eine oder mehrere "unvollständige Imitationen" des Subjekts vorhanden sind austauschbar verwendet werden, denen aber im Vergleich zum Thema eine oder mehrere Eigenschaften fehlen, die für den Diskurs von Bedeutung sind.

Auf eine solche Verwendung sollte normalerweise eine Beschreibung der Eigenschaften des Subjekts folgen oder eine Beschreibung der Eigenschaften, die im "Nachahmungsthema" fehlen, oder beides; Dies führt den Leser dazu, die Unterscheidung (en) zu verstehen oder zumindest zu betrachten.

Objektorientierung, wie sie von der Person verwendet wird, die den Ausdruck geprägt hat, scheint die folgenden Eigenschaften zu enthalten:

  • Einkapselung von (Daten + Verhalten) in (Objekte), die über (Nachrichten) alleine kommunizieren.
  • Automatische Wiederherstellung des Speichers zur Darstellung von (Objekten),
       wenn die (Objekte) nicht mehr referenziert werden.
  • Verzögerte Bindung von (Bedeutung) an die (Repräsentation) von Objekten.
  • Laufzeitreflexion von (Objekt) zu (Eigenschaften des Objekts).

Praxis und Erfahrung haben gelehrt,
wie auch notwendig, die Einbeziehung von

  • Verschlüsse    (manchmal auch als "echte Verschlüsse" bezeichnet)      Bedeutung (Schließungen) im formellen Sinne,
         und folgt dem Beispiel der Schließungen in (lisp).
       )
Jim Sawyer 06.02.2009 02:16
quelle
-1

Sie sind sich nicht sicher über die Unterscheidung, die Sie von den Beispielen erwarten. Aber ich weiß was es nicht ist! Wenn OO im Nachhinein an eine Sprache angehängt wird, z. Perl OO.

    
Rob Wells 30.10.2008 12:54
quelle

Tags und Links