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.