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?
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).
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.]
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 .
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."
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.
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.
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:
Praxis und Erfahrung haben gelehrt,
wie auch notwendig, die Einbeziehung von