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:
- 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,
Javausw. - mögliche Beispiele sind, aber IMO auf diese Weise scheint weder wirklich vollständig zu sein noch fruchtbar ) - Geben Sie eine formale Definition an (oder schließen Sie sie an, z. B. in akademischem oder mathematischem Stil).
- 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.
quelle
Antworten:
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:
Andererseits ist die Reinheit der IMHO-Sprache eher eine Schwäche als eine Stärke. OO ist keine Wunderwaffe. Kein einziges Paradigma ist.
quelle
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:
functionObject.call(param1,param2)
environment.getValue("myThing")
oder die Variable in ein Klassenobjekt einfügenBeachten Sie, dass noch einige Optionen offen sind:
quelle
globalVariableName
mit 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.Die Diskussion über sogenannte OO-Sprachen war schon immer ein bisschen gehirngewaschen. Dh:
Der Begriff objektorientiertes Design setzt sich aus drei Dingen zusammen:
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.
quelle
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
In diesem Fall
int
qualifiziert 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 anVector v1, v2; v1 + v2;
stattint 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.
quelle
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.
quelle