Formale Definition für Begriff "reine OO-Sprache"?


13

Ich kann mir keinen besseren Ort unter SO-Geschwistern vorstellen, um eine solche Frage zu stellen. Ursprünglich wollte ich fragen: "Ist Python eine reine OO-Sprache?" Angesichts von Problemen und Unannehmlichkeiten, die Menschen bei der Definition des Begriffs haben, beschloss ich, zunächst eine klare Definition für den Begriff selbst zu erhalten.

Es wäre ziemlich fair, mit der Korrespondenz von Dr. Alan Kay zu beginnen, der den Begriff geprägt hat (beachten Sie die Inspiration in biologischer Analogie zu Zellen oder anderen lebenden Objekten).

Es gibt folgende Möglichkeiten, sich der Aufgabe zu nähern:

  1. Geben Sie eine vergleichende Analyse, indem Sie Programmiersprachen auflisten, die bestimmte Eigenschaften aufweisen (oder dies nicht tun), die eindeutig und ausreichend sind, um den Begriff zu definieren (obwohl Smalltalk, Scala, Java usw. - mögliche Beispiele sind, aber IMO auf diese Weise scheint weder wirklich vollständig zu sein noch fruchtbar )
  2. Geben Sie eine formale Definition an (oder schließen Sie sie an, z. B. in akademischem oder mathematischem Stil).
  3. Geben Sie eine philosophische Definition an, die sich ausschließlich auf den semantischen Kontext der konkreten Sprache oder auf die Programmiererfahrung von vornherein stützt (es muss eine Chance auf eine erfolgreiche Erklärung durch die Community geben).

Meine aktuelle Version: "Wenn eine bestimmte ( formale ) Programmiersprache ( grammatikalisch ) zwischen Operationen und Operanden unterscheiden und über den Typ jedes Operanden schließen kann, ob dieser Typ ein Objekt ist (im Sinne von OOP) oder nicht, dann nennen wir Eine solche Sprache ist eine OO-Sprache, solange es in dieser Sprache mindestens einen Typ gibt, der ein Objekt ist. Wenn schließlich alle Arten der Sprache auch Objekte sind, definieren wir diese Sprache als reine (starke) OO-Sprache. "

Würde mich über eine mögliche Verbesserung freuen. Wie Sie sehen, habe ich die Definition nur von dem Begriff "Objekt" abhängig gemacht (häufig vollständig als Objektklasse bezeichnet).

[BEARBEITEN]

Außerdem benutze ich (zum Glück gut verstanden) eine Schreibweise wie in getippten Sprachen. Datentypprogrammierung oder typorientierte Programmierung ist nicht nur eine syntaktische Interpretation (des Programmtextes, dh wie bestimmte Werte von Literalen und Datenvariablen behandelt werden sollen - etwas, das sich in Typensicherheit entwickelt), sondern kann der Sprachgrammatik zugeschrieben und auf formale Weise studiert werden (unter Verwendung mathematischer Logik) als sogenannte Typsysteme . Beachten Sie, dass das Erfordernis, dass ein bestimmtes Typsystem einen sogenannten universellen Typ hat, eine der Möglichkeiten ist, die Reinheit der OO-Sprache zu definieren (es gibt Möglichkeiten, dies semantisch zu erweitern).

NB

wie man antwortet :

  • Es ist hilfreich, wenn Sie ein Buch oder eine Referenz angeben, die Ihr Verständnis von Terminologie und Konzepten unterstützt / erklärt (in der Regel deckt eine gute Definition alle abhängigen Konzepte mit Ausnahme der elementaren Konzepte ab oder verweist darauf).
  • Geben Sie nach Möglichkeit eine eingerückte Kategorie Ihrer Antwort / Definition an, wenn dies nicht eindeutig ist (siehe oben: 1 - nach Sprachbeispiel, 2 - mathematische Logik, 3 - technische Beschreibung und Programmierphilosophie).
  • Die Klassifizierung ist wichtig (und auch, weil der Begriff "pure-OO" in den Begriff "OO" einbezogen wird), während bei der Beantwortung versucht wird, Elemente des OO-Paradigmas aus anderen bekannten Methoden zu entfernen (und sie keinesfalls zu verwechseln / zu überlappen, z. B. können typischerweise Elemente der modularen Programmierung behandelt werden / verkörpert mit OO-Programmierung): Versuchen Sie, OOP von funktionaler Programmierung, logischer Programmierung (besonders stark spezialisiert), Abstarct-Datentypen (ADT), modularer Programmierung, Metaprogrammierung (Generika und LISP-Makroexpansionszeit) zu unterscheiden. Verträge (z. B. Eiffel), aspektorientiert (AO) (Unterschied zwischen deklarativer und funktionaler Klassifizierung sowie historische Definitionen der Struktur von Dijkstra sind klar)

Über die Schwierigkeit, eine formale Definition zu geben : Überraschenderweise ist es sehr einfach, OOP in Form eines bestimmten logischen (formalen) Systems (höchstwahrscheinlich typbasiert) mathematisch zu beschreiben und ein Konzept nach dem anderen zu definieren. Man kann sogar versuchen, etwas praktischeres zu tun, indem man diesen Formalismus auf die Überprüfung der Typisierung oder auf neue Aspekte des Sprachdesigns anwendet,als nur abstrakte Unterhaltung oder Übung (auch Nachschlagformulierung von OOP in der Intuitionistischen Typentheorie , abhängige Typen , unabhängig in FOL-Formalismen als Lambda-Kalkül) und nur unter Verwendung der Kategorietheorie). Ein Hauptpunkt hier ist das nicht überraschendSolche Formulierungen IMO sind stark voreingenommen (fehlerhaft), weil sie höchstwahrscheinlich anfänglich unvollständig in Bezug auf OOP (in der Computertechnik) sind und danach fast unzugänglich sind (und somit kaum einen Beitrag zur Programmierwelt leisten - vielleicht mit Ausnahme eines bestimmten Prozentsatzes, der Anwendungen aus der formalen Welt findet in gängige Sprachen integriert ).

Also ja, es ist schwierig, genau eine "gute" Definition zu geben, nicht nur eine Definition. Aber ich bin sicher, dass ich das hier wegen Ihrer Erfahrung und direkten Beteiligung fragen werde, Jungs.


2
Nun, Sie haben sich für Python gemeldet. "Nein".
PSR

2
+1 für die nette Frage, aber Ihre Version ist ein bisschen fehlerhaft durch das Problem, dass ein Typ und ein Objekt verschiedene Dinge sind.
Frank

5
@JoachimSauer: Er sagte in einer anderen Mail auf der Squeak-Mailingliste, dass "die große Idee Messaging ist" und dass er es bedauert, es jemals "objektorientiert" genannt zu haben, und dass er es stattdessen "nachrichtenorientiert" hätte nennen sollen. Erlang zum Beispiel ist eine vollständig objektorientierte Sprache, die alle Kriterien von Dr. Kay erfüllt, ohne ein Konzept für "Objekte", "Methoden", "Vererbung", "Klassen", "Prototypen" oder ähnliches zu haben .
Jörg W Mittag

1
Dies könnte ein gutes Beispiel dafür sein, dass Syntax nicht ausreicht, um eine OO-Sprache zu definieren. Wenn man zeigen kann, dass OOP (zB als Tool) nur semantisch ist (syntaxunabhängig), ändert das meine Frage komplett!
Yauhen Yakimovich

2
@ YauhenYakimovich Dies ist eines der Hauptprobleme bei der Diskussion über OOP. Jeder und sein Hund haben ihre eigene Vorstellung davon, was es ist. Im Gegensatz dazu können strukturierte Programmierung und funktionale Programmierung jeweils sehr einfach definiert werden. Dies führt mich zu der Frage, ob OO ähnliche Eigenschaften wie Religion anstelle von Wissenschaft hat.
Ricky Clarkson

Antworten:


19

OO, laut Alan Kay dreht sich alles um das Weitergeben von Nachrichten, und das war's. Sie werden sehen, dass Qualitäten wie Polymorphismus und Verkapselung tatsächlich von der Weitergabe von Nachrichten herrühren.

Jetzt ist diese Haltung in der Tat sehr extrem, weil es im Grunde bedeutet, dass nur Smalltalk und Sprachen gleichermaßen qualifiziert wären.

Ich denke, Sie können OO als Aufbau Ihres Systems auf Entitäten definieren, die ihren Zustand vollständig einkapseln und die aufgrund ihrer inhärenten polymorphen Eigenschaften austauschbar sind. Man könnte also argumentieren, eine reine OO-Sprache sorge dafür, dass diese beiden Kernqualitäten immer erfüllt werden. Was OO-Sprachen "unrein" macht, wären Mechanismen, die die Erstellung von Konstrukten ermöglichen, die diese Kriterien nicht erfüllen, wie zum Beispiel die Möglichkeiten:

  • öffentliche Felder deklarieren
  • Deklarieren Sie Variablen, die nur Instanzen einer bestimmten Klasse und ihrer Unterklassen enthalten können (dh Variablen sollten anhand von Interfaces typisiert werden, über die die biologischen Objekte in Kays Anologie kommunizieren) das lässt noch weniger Raum für Polymorphismus
  • Deklarieren Sie Primitive

Andererseits ist die Reinheit der IMHO-Sprache eher eine Schwäche als eine Stärke. OO ist keine Wunderwaffe. Kein einziges Paradigma ist.


2
+1 für "OO ist keine Wunderwaffe".
Andres F.

1
@AndresF. Beachten Sie, dass der praktische Wert von OOP sowie andere theoretische Kenntnisse im Zusammenhang mit der Programmierung nicht wirklich Teil einer Frage sind. Es ist ziemlich offensichtlich, dass man Code ohne tiefes Verständnis von Programmiertechniken oder -theorien (und umgekehrt) ziemlich erfolgreich schreiben kann. Weder die Anwendungseigenschaften von OO-Sprachen werden diskutiert, etc.
Yauhen Yakimovich

@ YauhenYakimovich Oh, ich weiß. Ich hätte die Antwort nicht positiv bewertet, wenn sie nicht zum Thema gehört hätte. Trotzdem mochte ich eine Behauptung, der ich zustimme.
Andres F.

@AndresF. Klar :-) "OO ist kein Wundermittel" ist höchstwahrscheinlich genauso wahr, wie uns eine perfekte Programmiersprache fehlt. Aber was genau macht OOP nicht zu einer Silberkugel? Genau wie ein guter Fehlerbericht, denke ich, ist eine detaillierte und präzise Terminologie der Weg, dies zu beantworten. Ich habe so viel Zeit in die Arbeit damit investiert, dass ich verdammt neugierig bin, es auf das nächste Level zu bringen. Ist OOP nur eine Sammlung von Ideen, die von einem Programmierbuch in ein anderes kopiert wurden?
Yauhen Yakimovich

@ back2dos +1 für den expliziten Hinweis auf die Rolle des "Message Passing" nach Kay (Smalltalk, Objective-C). Offensichtlich hatte er nie vor, OOP in eine Richtung zu entwickeln, die es heute hat. Aber ich mochte es wirklich, dass Kay die Idee hatte, Objekte NICHT Daten (Typen) zu machen. Er drängte wirklich darauf, ihnen biologische Qualitäten zuzuschreiben, endete jedoch mit "Nachrichtenübermittlung".
Yauhen Yakimovich

6

Ich würde dem näher kommen, indem ich es als eine Sprache definiere, die OOP-Konstrukte und nichts anderes verwendet (so wie eine reine FP-Sprache reine Funktionen mit unveränderlichen Daten und nichts anderem verwendet).

Im Speziellen:

  • Jede Entität, mit der Ihr Programm arbeitet, ist ein erstklassiges Objekt - dh keine Grundelemente, keine Zeiger, keine Arrays usw.
  • Mit einem Objekt können Sie nur eine (möglicherweise polymorphe) Methode aufrufen (== Senden einer Nachricht). Es sind keine weiteren Operationen vorhanden.
  • Alle Daten sind gekapselt - dh kein öffentlicher Feldzugriff, Sie müssen über Methoden auf ein Objekt zugreifen
  • Wenn Sie erstklassige Funktionen haben, müssen sie auch Objekte sein - Sie müssten also so etwas tunfunctionObject.call(param1,param2)
  • Keine globalen Variablen - Wenn Sie so etwas möchten, müssen Sie ein Objekt verwenden, um die aktuelle globale Umgebung darzustellen, z. B. environment.getValue("myThing")oder die Variable in ein Klassenobjekt einfügen

Beachten Sie, dass noch einige Optionen offen sind:

  • Klassenbasierte vs. prototypbasierte Objektmodelle
  • Wie die Vererbung implementiert wird (wenn überhaupt)
  • Egal, ob Sie eine oder mehrere Versandmethoden haben
  • Gibt an, ob Ihre Objekte statisch oder dynamisch typisiert sind
  • Die genaue Syntax, die für Methodenaufrufe verwendet wird (z. B. könnten Sie einen syntaktischen Zucker für Getter / Setter usw. haben.)

1
Dies sind gute Definitionen, aber verwechseln Sie die Objektrealität nicht mit der bloßen Syntax. Nur weil Funktionen und globale Variablen eine benutzerfreundliche Syntax haben, können sie tatsächlich Objekte im Herzen sein.
Ddyer

@ddyer - das ist richtig, wenn es sich wirklich nur um Syntax handelt, aber ich denke, wenn die Syntax auch eine andere Semantik einführt, kann dies die "Reinheit" brechen. Zum Beispiel ist wrt globale Variablen, globalVariableNamemit denen auf eine globale Variable zugegriffen wird, eine andere Semantik als ein Methodenaufruf für ein Objekt. Dies wäre die einzige Möglichkeit, auf einen nicht lokalen Wert in reinem OOP zuzugreifen.
mikera

Ich denke "Alles" muss qualifiziert werden. Wenn eine Sprache überhaupt keine Reflexionsfähigkeit besitzt (zum Beispiel kann sie eine Methode eines Objekts nicht durch einen abstrakten Namen referenzieren oder in einer Variablen speichern), müssen Methoden dann auch Objekte sein? Sind Referenzen Objekte? Sind Referenzen und Objekte auch verschiedene Dinge?
Joachim Sauer

@ Joachim - guter Punkt. Ich habe es als "jede Entität, mit der Ihr Programm arbeitet" qualifiziert, um Objekte von Metaobjekten in der Sprache wie Variablennamen und syntaktische Konstrukte zu unterscheiden. Wenn Ihr Programm solche Dinge tatsächlich durch Reflektion bearbeitet, müssten sie natürlich als reale Objekte neu definiert werden, aber das wird nicht immer eine Voraussetzung sein. Wie auch immer, wenn Sie sich eine bessere Qualifikation vorstellen können, können Sie diese gerne bearbeiten!
mikera

"Klassenbasierte vs. prototypbasierte Objektmodelle": Aber ich würde sagen, dass Sie in beiden Fällen eine Art Klassifizierung haben, dh Sie gruppieren Objekte mit einer gemeinsamen Struktur und einem gemeinsamen Verhalten.
Giorgio

4

Die Diskussion über sogenannte OO-Sprachen war schon immer ein bisschen gehirngewaschen. Dh:

"Jemand hat mir gesagt, dass Sprache X OO ist, daher ist Sprache X gleich OO, und dann kann unmöglich jede Sprache, der die Merkmale von Sprache X fehlen, OO sein. Und weil ich meinen Code in Sprache X schreibe, ist alles, was ich tue, OO. "

Der Begriff objektorientiertes Design setzt sich aus drei Dingen zusammen:

  1. Modulares Design mit autonomen Objekten, die keine unnötigen Informationen über den Rest des Programms kennen, auch bekannt als lose Kopplung" .
  2. Kapselung von Daten in Objekten, um den absichtlichen und versehentlichen Zugriff von außen zu verhindern.
  3. Klar festgelegte Abhängigkeiten zwischen Objekten. Zur Erzielung einer losen Kopplung, aber auch zur Erleichterung der Wartung und Erweiterung des Programms.

1) ist reines Programmdesign, es kann in jeder Programmiersprache erreicht werden. Einige Sprachen verfügen jedoch über hilfreiche Funktionen wie class / struct und private Schlüsselwörter.

2) ist hauptsächlich Programmdesign, kann aber ohne Sprachunterstützung nicht vollständig erreicht werden, da Sie Sprachmechanismen wie private / static zum Schutz vor versehentlichem Gebrauch benötigen.

3) ist hauptsächlich Programmgestaltung. Typischerweise gibt es drei verschiedene Abhängigkeiten: "Objekt X enthält Objekt Y", "Objekt X ist eine Art von Y" und "Objekt X interagiert mit Objekt Y". Es gibt viele Sprachfunktionen, die bei diesen Abhängigkeiten helfen: Vererbung / Polymorphismus, abstrakte Basisklassen und so weiter.

Nun, wenn wir uns das Obige ansehen, können wir sehen, dass Sie kaum Sprachfunktionen benötigen, um OO-Programme zu schreiben. Die Funktionen machen es einfach viel einfacher.

Die oben genannten Ziele können nicht mit etwas matschiger Rückwärtslogik erreicht werden: Nur weil Sie das Schlüsselwort class verwenden, erhält Ihr Programm nicht automatisch einen modularen Aufbau. Nur weil Sie die Vererbung verwenden, bedeutet dies nicht automatisch, dass Ihre Objektabhängigkeiten sinnvoll sind. Eine Sprache mit OO-Merkmalen würde weiterhin Dinge wie class TheWholeBloodyProgram"Tier erbt Katze" zulassen .

Leider wird das Thema gute objektorientierte Programmgestaltung in solchen Diskussionen selten erwähnt. Gehirngewaschene Programmierer sehen sich nur die Syntax an und yap Dinge wie zum Beispiel "C ++ hat primitive Datentypen, damit Ihr C ++ - Programm nicht OO ist". Dann schreiben sie ein schreckliches Programm in ihrer eigenen Lieblingssprache, ohne einen Hinweis darauf zu verwenden Programmentwurf was auch immer.

Zur Beantwortung der Frage: Nur sehr wenige Sprachen unterstützen die ordnungsgemäße Gestaltung von OO-Programmen. Zu ermitteln, welche Sprachen bestimmte OO-bezogene Merkmale aufweisen, ist unerheblich, solange der Programmierer nicht weiß, was objektorientiertes Entwerfen bedeutet. Ein Programmierer, der behauptet, dass bestimmte Sprachen objektorientiert sind, hat das Konzept von OO höchstwahrscheinlich nicht als Ganzes verstanden. Fragen Sie den angehenden OO-Programmierer, wie er OO-Programme erstellt. Wenn sie als Erstes anfangen, Sprachschlüsselwörter zu schreien, können Sie davon ausgehen, dass sie das OO-Design nicht kennen.

Vielleicht gibt es ein schickes UML-Tool auf hohem Niveau, das weit über dem rohen Quellcode liegt und den Programmierer dazu zwingt, nur Programme mit einem guten objektorientierten Design zu schreiben, aber ich bezweifle es. Das beste Entwurfswerkzeug für die OO-Programmierung ist wahrscheinlich immer noch das menschliche Gehirn und der gesunde Menschenverstand.


Können Sie verdeutlichen, inwiefern sich Ihre Definition von der modularen Programmierung mit abstrakten Datentypen unterscheidet? Ich denke, Sie sind auf dem richtigen Weg, aber ich kann den Zug noch nicht sehen!
Jörg W Mittag

@ JörgWMittag Es ist nicht unbedingt anders, traditionelle ADTs können mit objektorientiertem Design geschrieben werden, mit korrekter Kapselung, Setter / Gettern, Vererbungsmöglichkeiten usw. usw. Sie können jedoch auch ohne Berücksichtigung des OO-Designs geschrieben werden. ->

2
@ JörgWMittag Wenn Sie beispielsweise eine Sprache wie C mit eingeschränkter Sprachunterstützung für OO haben, ist es schwierig, ADTs objektorientiert zu schreiben. Der häufigste Fehler besteht darin, die Zuweisung des ADT dem Aufrufer zu überlassen, dh ihm eine öffentliche Struktur zu geben, in der alle Interna sichtbar sind und die Kapselung aufheben. Der richtige Weg, dies in C zu tun, führt über sogenannte "undurchsichtige Typen" (unvollständige Typen), obwohl nicht viele C-Programmierer wissen, wie man sie verwendet.

@Lundin: In dem Beitrag von JörgWMittag als Kommentar zu einer anderen Antwort gibt es einen (IMO) interessanten Vergleich zwischen ADT und OO.
Giorgio

Ich erinnere mich aus einigen UML-Büchern (wahrscheinlich) an einen zusätzlichen Punkt 0. Abstraktheit (wobei die Bedeutung der abstrakten Formulierung hervorgehoben wird, die für Beziehungen zwischen Objekten wie Polymorphismus, Vererbung, Aggregation usw. von wesentlicher Bedeutung ist).
Yauhen Yakimovich

2

Nein, es gibt keine formale oder sogar nützliche Definition, und es wird niemals eine geben. Für manche bedeutet OOP "Universal Base Class" und "Muss Referenzsemantik verwenden, am besten mit einem Garbage Collector" - und man kann sogar über die Syntax streiten, eine der am wenigsten relevanten Sachen, die jemals erfunden wurden.

Letztendlich muss zuerst die Frage "Was ist ein Objekt?" Beantwortet werden. Die Engstirnigen werden darauf bestehen, von einer sinnlosen universellen Basisklasse zu erben und unnötigerweise einem Müllsammler zugeteilt zu werden, um sich zu qualifizieren. Aber ich bevorzuge eine viel nützlichere Definition. Der Zweck von OOP besteht darin, einige Daten und einige Funktionen zu haben, die Sie für diese Daten aufrufen können. So

  • Ein Objekt enthält einen Status und bietet in diesem Status einige Funktionen.

In diesem Fall intqualifiziert sich sogar . Wenn Sie in C ++ Vorlagencode schreiben, der entweder Grundelemente oder Objekte akzeptieren kann, wird es schließlich schwierig zu argumentieren, dass sich Grundelemente in irgendeiner wesentlichen Weise unterscheiden. Es gibt nichts Sinnvolles an Vector v1, v2; v1 + v2;statt int v1, v2; v1 + v2;(außer der beschissenen Initialisierungssemantik, muss man zugeben). Dies ermöglicht es auch, dass Lambda und solche Dinge Objekte sind, da sie den Zustand - ihre Fänge - halten und eine Funktion für diesen Zustand anbieten, um das Lambda zu nennen.

Glücklicherweise können wir Zeiger auf freie Funktionen auch als Objekte klassifizieren, da sie sowohl den Status (eine Adresse) als auch eine Funktion für diesen Status (um ihn aufzurufen) enthalten. Eine freie Funktion sollte also erlaubt sein - auch wenn Sie sagen würden, dass alle freien Funktionen globale Funktionszeiger sind.


2
Ich sehe keinen Grund für eine solche Unterscheidung. Zweitens haben sie die gleiche Identität wie jedes andere Objekt - Adress- / Referenzvergleich. Die Tatsache, dass Sie nicht zwei Objekte mit demselben Status unterscheiden können, außer durch Vergleichen von Adressen, ist alles andere als neu und gilt für alle Objekte.
DeadMG

5
-1. Beginnt mit einem unnützen und unnötigen Schimpfen, wechselt in Kürze zu einem Ad-Hominem-Angriff und das einzige, was auch nur aus der Ferne zutrifft (die Definition von OOP ), ist falsch. Informationen zum Unterschied zwischen einem abstrakten Datentyp und einem Objekt finden Sie unter Informationen zum Verständnis der Datenabstraktion, überarbeitet von William R. Cook .
Jörg W Mittag

1
"Ich sehe keine Notwendigkeit für eine solche Unterscheidung.": Aber diese Unterscheidung gehört zu den allgemein akzeptierten Merkmalen von Objekten. Natürlich können Sie Ihre eigene Vorstellung von einem Objekt entwickeln, das sich von dem unterscheidet, was allgemein akzeptiert wird. Sie sind völlig frei, es zu tun.
Giorgio

2
@ Jörg Ich bitte um Abwechslung. Ich bin mit diesem Beitrag nicht ganz einverstanden, aber die Einschränkung im ersten Absatz als „nutzlos“ oder als „Schimpfen“ zu bezeichnen, ist unaufrichtig. Es gibt keine allgemein anerkannte Definition für OOP. Das ist eine einfache und allgemein anerkannte Tatsache. Der Rest des Beitrags ist eine Definition von OOP. Sicherlich nicht die am weitesten verbreitete, noch die, die ich geben würde, aber, wie DeadMG sagte, tatsächlich eine ziemlich nützliche.
Konrad Rudolph

2
@KonradRudolph: Dieser Absatz las sich sehr anders, als ich meinen Kommentar schrieb, einschließlich des Vergleichs von Programmierern, denen die Syntax am Herzen liegt, mit Rassisten, wobei sogar ein bestimmter Benutzer dieser Website namentlich erwähnt wurde.
Jörg W Mittag

0

Sie können sich das anhand eines negativen Beispiels vorstellen. Java ist keine reine objektorientierte Sprache, da es auch primitive Typen gibt, die keine Objekte sind. Dies sind ganze Zahlen, doppelte Zahlen, Arrays und so weiter. In einer reinen Objektsprache steht die Semantik von Objekten für alles zur Verfügung.

Es stellt sich auch die Frage, inwieweit ein Teil der Sprache auch innerhalb des Objektrahmens für Änderungen gesperrt ist. In Java können Sie für einige Klassen, z. B. String oder Class, keine neuen Unterklassen definieren.

Welche Sprachen sind rein? Der einzige Kandidat, der mir in den Sinn kommt, ist Smalltalk.


Ist Ruby nicht auch reine OO-Sprache?
zxcdw

2
@zxcdw (und ddyer): genau das ist das problem: niemand hat eine formale definition von "pure oo", also kann niemand eine definitive antwort auf diese frage geben.
Joachim Sauer
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.