Maison >Java >javaDidacticiel >Après tout, quelle est la définition de l'orientation objet ?

Après tout, quelle est la définition de l'orientation objet ?

王林
王林original
2024-09-06 06:46:01713parcourir

Afinal de contas, qual a definição de Orientação a Objetos?

Einführung

Das Paradigma der Objektorientierung ist sicherlich eines der relevantesten Themen in der Programmierung und findet sich in mehreren der Best Practices der Branche wie SOLID, GoF Design Patterns oder Object Calhistenics und sogar in äußerst beliebten Sprachen wie Java , C#, Ruby, PHP, JavaScript usw. Und angesichts dieser Relevanz ist es auch Gegenstand mehrerer Debatten sowohl in Online-Diskussionen als auch in der Wissenschaft selbst.

Eine der Hauptkontroversen rund um das Paradigma wäre: Was wäre Objektorientierung eigentlich? Da sich niemand darüber einig ist, was es bedeutet, ist dies der Kern des Problems bei verschiedenen Arten von Internetstreitigkeiten, beispielsweise wenn jemand behauptet, dass seine Sprache wirklich objektorientiert ist, andere jedoch nicht, oder dass eine bestimmte Sprache nicht wirklich objektorientiert ist. orientiert usw.

Was auf den ersten Blick albern erscheinen mag, aber dahinter steckt ein verstecktes Problem, nämlich die Tatsache, dass es wirklich keine formale Definition dafür gibt, was Objektorientierung wäre. Wenn wir also etwas kritisieren, das mit dem Paradigma zusammenhängt, können wir nicht wirklich sicher sein, ob es fair ist oder nicht, da niemand weiß, worum es in der Wahrheit eigentlich geht, da dies nur zu einer Debatte führen wird, in der beide Parteien die andere beschuldigen können einen Strohmann anzugreifen, weil er mit der Definition dessen, worüber er debattiert, nicht einverstanden ist, was dazu führt, dass er über verschiedene Dinge spricht, während er darüber nachdenkt, über dasselbe zu reden.

Dies geschieht, weil es nicht auf einer formalen Grundlage beruht, die als primäre Quelle von Diskussionen identifiziert werden kann, wie etwa dem strukturierten/prozeduralen Paradigma – das sich aus dem Boehm-Jacopini-Theorem und dem Artikel „Go-to-Aussage gilt als schädlich“ ergibt – oder aus dem Funktionalen, das aus der Lambda-Kalküle hervorgeht, im Gegenteil, technisch gesehen hat es zwei verschiedene Ursprünge, was die Sache sehr schwierig macht, schließlich ist es schwierig, überhaupt zu sagen, welche die erste objektorientierte Sprache war und ob sie es war Simula oder Smalltalk.

Wenn Sie noch keine Berührungspunkte mit dem Thema haben, finden Sie vielleicht alles, was ich hier beschreibe, etwas seltsam, schließlich lernen wir alle etwas über Objektorientierung, wir verwenden täglich Worte, um zu kommunizieren, und alles scheint normal zu laufen , kein Lärm in der Kommunikation, oder?

Sie denken vielleicht sogar, dass es sehr einfach ist, denn selbst wenn wir uns verschiedene Quellen ansehen, wie zum Beispiel ein allgemeines Tutorial im Internet, Wikipedia, oder sogar wenn wir eine formelle Ausbildung absolvieren (wie zum Beispiel einen technischen Kurs oder eine Hochschule), Wir werden sehr ähnliche Definitionen finden wie etwas, das ich die 4 Säulen der Objektorientierung nenne:

  • Abstraktion;
  • Einkapselung;
  • Vererbung;
  • Polymorphismus.

Aber das erzählt eigentlich nur einen Teil der Geschichte, denn wie ich bereits erwähnt habe, gibt es tatsächlich zwei verschiedene Schulen des objektorientierten Denkens, eine, die aus der in Simula geschaffenen Tradition hervorgegangen ist und durch C++ entwickelt und populär gemacht wurde, und eine andere, die in der von Smalltalk geschaffenen Tradition wuchs.

Auch wenn wir die Gewinnerseite der Geschichte in der Tradition von C++ akzeptieren können (da die überwiegende Mehrheit der als OO betrachteten Sprachen derzeit seinen Ideen mehr folgt als denen von Smalltalk), ist dies das Erbe von Simula, das sich in entwickelt hat Bei den 4 Säulen besteht kein Konsens darüber, ob es genau diese 4 sind oder ob sie wirklich 4 sein sollten. Zum Beispiel:

  • Der Schöpfer der C++-Sprache selbst erwägt eine Definition, die nur drei Säulen hat (Abstraktion, Vererbung und Polymorphismus);
  • Die Eiffel-Sprache berücksichtigt einen weiteren Satz von 6 Prinzipien (Klassen, Behauptungen, Generizität, Vererbung, Polymorphismus und dynamische Bindung);
  • Der Schöpfer der Smalltalk-Sprache sagt, dass das, was er meinte, als er den Begriff prägte, nichts mit dem zu tun hat, was wir derzeit verwenden, und beschreibt, dass es tatsächlich auf drei Prinzipien hinausläuft (Message Passing, Encapsulation und Extreme Late-binding of all). Dinge);
  • Die Ada-Sprache definiert nur drei Prinzipien (Kapselung, Vererbung und Polymorphismus);
  • Die Selbstsprache basiert auf drei Ideen (Prototypen, Slots und Verhaltensweisen), die trotz anderer Namen äquivalent zu Begriffen sind, die in anderen Definitionen verwendet werden (Vererbung, Felder und Nachrichtenaustausch);
  • Die Java-Sprache definiert 5 Konzepte (Kapselung, Felder, Vererbung, Methoden und Objekte);
  • Die C#-Sprache folgt den 4 Säulen;
  • Der Schöpfer der Simula-Sprache gibt zu, dass es keine konkrete Definition gibt, zitiert jedoch einige Konzepte, die seiner Meinung nach in Sprachen üblich sind, die als objektorientiert gelten (Objekte, Klassen, Vererbung, Polymorphismus);
  • Die Python-Sprache nennt 4 Konzepte als objektorientiert (Klassen, Objekte, Vererbung und Polymorphismus);
  • Die Ruby-Sprache behauptet, der Smalltalk-Definition zu folgen, mit großem Schwerpunkt auf der Idee, dass alles ein Objekt sein sollte, und dem Nachrichtenaustausch;
  • Die PHP-Sprache hat keine offizielle Definition der Objektorientierung, aber wir können aus den Merkmalen, die sie als objektorientiert darstellt, ableiten, dass sie so etwas wie den 4 Säulen folgt;
  • Die Objective-C-Sprache hat keine offizielle Definition der Objektorientierung, aber ihr Handbuch schlägt die folgende Kombination von Konzepten vor (alles ist ein Objekt, Klassen, Nachrichtenübermittlung, Kapselung, Vererbung und Polymorphismus);
  • Die MDN-Website berücksichtigt in ihrem Abschnitt über die JavaScript-Sprache drei Konzepte (Klassen und Objekte, Vererbung und Kapselung);
  • Grady Booch, Autorin des Buches Object-Oriented Analysis and Design With Applications, definiert 7 Prinzipien (Abstraktion, Kapselung, Modularität, Hierarchie, Typisierung, Parallelität und Persistenz);
  • GoF (Gang of Four: Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides) zitiert in ihrem Buch Design Patterns: Elements of Reusable Object-Oriented Software Kapselung, Vererbung und Polymorphismus als „Entwurfsmuster“ in einem Verfahren Sprache;
  • Peter Van Roy beschreibt in seinem Buch „Concepts, Techiniques, and Models of Computer Programming“ OO in vier Elementen (Objekte wie Abstraktionsmechanismus, expliziter Zustand, Polymorphismus und Vererbung);
  • ISO/IEC 2382 Artikel 2122503, der einer formalen Definition am nächsten kommt, berücksichtigt 6 Prinzipien (Abstraktion, Kapselung, Vererbung, Polymorphismus, Nachrichtenaustausch und dynamische Bindung );
  • Jegor Bugayenko definiert es durch ein von ihm erstelltes formales Modell namens Phi-Kalkül, implementiert in seiner EOLANG-Sprache;
  • usw....

Eine Perspektive definieren

Auf diese Weise argumentiert Bjarne Stroustrup (Erfinder von C++) in seiner Definition der Objektorientierung:

Jede Definition von „Objektorientierung“ sollte historisch akzeptabel sein. Worte dienen nur der Kommunikation, sie bedeuten nur dann etwas, wenn wir uns auf eine Bedeutung einigen.

~ Bjarne Stroustrup, adaptiert aus dem Englischen in freier Übersetzung

Deshalb möchte ich einen ganzheitlichen Ansatz verfolgen (Analyse des Ganzen statt des Klangs der Teile), um zu analysieren, was für meine Definition berücksichtigt werden sollte. Dabei bewerte ich nach 4 Kriterien in der Reihenfolge ihrer Wichtigkeit:

  1. Konzeptionelle Ausrichtung mit der definierten Perspektive;
  2. Historische Relevanz;
  3. Umsetzungen in der Praxis (die auch als Wahrnehmung des gesunden Menschenverstandes gelten);
  4. Exklusivität für OO (das Ausmaß, in dem das Konzept als etwas Objektorientiertes identifiziert werden kann und nicht als etwas aus dem X- oder Y-Paradigma oder einem allgemeineren Konzept);

Lassen Sie uns damit beginnen, unseren Ausgangspunkt in der Geschichte zu definieren. Zuerst werden wir entscheiden, welche Seite wir als primäre Quelle wählen werden, und dann folgen wir mit den Absichten, was Objektorientierung von seinen Autoren als Grundlage für unsere Definition bedeuten sollte Zusätzlich kann es als Vergleichsparameter verwendet werden, um zu beurteilen, welche Reihe von Grundsätzen sinnvoll darin enthalten ist.

Sur cette question, j'aime l'idée selon laquelle Alan Kay a inventé "l'orientation objet" mais pas les "objets", donc notre base sera sa vision de ce que devrait être l'orientation objet, que nous pouvons résumer en quelques citations :

Juste un petit rappel que j'ai travaillé dur la dernière fois OOPSLA pour essayer de rappeler à tout le monde que Smalltalk n'est pas seulement sa syntaxe ou sa bibliothèque de classes, ni une question de classes. Je regrette d'avoir inventé le terme « objets » il y a longtemps pour ce sujet, car cela amène de nombreuses personnes à se concentrer sur une idée plus petite.

La grande idée est la "messagerie" - c'est le cœur de Smalltalk/Squeak...

~ Alan Kay, adapté de l'anglais en traduction libre

J'ai pensé à des objets comme des cellules biologiques et/ou des ordinateurs individuels sur un réseau, capables uniquement de communiquer par messages (les messages sont donc arrivés très tôt - il a fallu un certain temps pour voir comment envoyer des messages dans un langage de programmation suffisamment efficace pour être utile).

Je voulais me débarrasser des données. Le B5000 a presque réussi cela grâce à son architecture matérielle presque incroyable. J'ai réalisé que toute la métaphore cellule/ordinateur éliminerait les données et que "<-" ne serait qu'un autre jeton de message (il m'a fallu un certain temps pour y réfléchir parce que je considérais en fait tous ces symboles comme des noms de fonctions et procédures .

Ma formation en mathématiques m'a fait réaliser que chaque objet pouvait être associé à plusieurs algèbres, et qu'il pouvait y avoir des familles de celles-ci, et que celles-ci seraient très utiles. Le terme "polymorphisme" a été imposé bien plus tard (je pense par Peter Wegner) et n'est pas très valable, car il vient en fait de la nomenclature des fonctions, et je voulais un peu plus que des fonctions. J'ai inventé un terme « généricité » pour traiter les comportements génériques de manière presque algébrique.

Je n'ai pas aimé la façon dont Simula I ou Simula 67 géraient l'héritage (même si je pensais que Nygaard et Dahl n'étaient que d'énormes penseurs et designers). J'ai donc décidé de laisser de côté l'héritage en tant que fonctionnalité intégrée jusqu'à ce que je le comprenne mieux.

~ Alan Kay, adapté de l'anglais en traduction libre

POO pour moi signifie simplement l'échange de messages, la conservation de données locales, la protection et le masquage de l'État, et l'extrême liaison tardive de toutes choses.

~ Alan Kay, adapté de l'anglais en traduction libre

Avec cela, nous pouvons conclure que la perspective à partir de laquelle nous voyons un programme orienté objet utilisant les définitions de Kay est la suivante :

Un programme est vu comme un réseau d'objets communiquant par échange de messages, dans lequel le but est de programmer en évitant les données, en se concentrant sur les interactions, afin qu'un message puisse porter plusieurs sens.

En parlant de perspective, c'est la section utilisée par les créateurs de Simula dans leur livre Object-Oriented Programming in the BETA Programming Language pour décrire le cadre conceptuel d'un framework, c'est-à-dire une description de la façon dont nous voyons la structure de un programme écrit dans un certain paradigme, par exemple dans le cas de la programmation procédurale, ils le décrivent comme :

L'exécution d'un programme est considérée comme une séquence (partiellement ordonnée) d'appels de procédures qui manipulent des variables.

~ Nygaard du tout, adapté de l'anglais en traduction libre

En cas de fonctionnel :

Un programme est considéré comme une fonction mathématique, qui décrit une relation entre l'entrée et la sortie.

~ Nygaard du tout, adapté de l'anglais en traduction libre

Et pour l'orientation des objets :

L'exécution d'un programme est considérée comme un modèle physique, simulant le comportement d'une partie réelle ou imaginaire du monde.

~ Nygaard du tout, adapté de l'anglais en traduction libre

Donc, même si nous nous concentrons sur la définition d'Alan Kay, étant donné les grandes contributions de Krysten Nygaard et Ole-Johan Dahl (créateurs de Simula) concernant les fonctionnalités trouvées dans les langages orientés objet, et à quel point sa perspective a vieilli au fil du temps temps, étant donné que presque tous les tutoriels modernes suivent encore cette histoire selon laquelle les objets représentent des concepts du monde réel, même en étant formalisés dans le cadre de la définition de l'abstraction, je dirais qu'il est approprié d'incorporer ses points de vue dans notre définition finale

.

Donc, là où un argument peut être avancé pour réconcilier les deux traditions en une définition unifiée, respectant ainsi notre approche d'une analyse holistique, j'essaierai.

Par conséquent, comme il n'est pas forcément exclusif à notre définition actuelle, nous pouvons l'augmenter avec ce qui suit :

Ein Programm wird als ein Netzwerk von Objekten betrachtet, bei denen es sich um Darstellungen von Domänenkonzepten handelt, die durch den Austausch von Nachrichten kommunizieren, wobei das Ziel darin besteht, Daten zu vermeiden und sich auf Interaktionen zu konzentrieren, sodass eine Nachricht mehrere Bedeutungen haben kann. Seine allgemeine Struktur ähnelt einer Simulation des Verhaltens eines realen oder imaginären Teils der Welt.

Eine Überlegung, die angestellt werden kann, ist, dass dies Menschen dazu bringen kann, sich auf die „kleinere Idee“ zu konzentrieren, aber wie wir bereits zuvor eingeräumt haben, ist es notwendig zu erkennen, wie sich Ideen im Laufe der Zeit entwickeln, da ein Wort nur dann einen Wert hat, wenn die Menschen es verstehen was es kommunizieren möchte, daher glaube ich, dass diese Perspektive ein ausreichendes Gleichgewicht zwischen der Beibehaltung der ursprünglichen Ziele von Alan Kay und der Einbeziehung der Werte des Objektsystems von Nygaard und Dahl findet.

Konzepte definieren

Mit dem aktuellen Text der Definition könnte ich bereits zufrieden sein, da dies meine Antwort auf die in diesem Artikel gestellte Frage ist, aber ich glaube, dass eine vollständige Definition eines Paradigmas sowohl seine „Perspektive“ dessen, was es darstellt, umfassen sollte die Ausführung eines Programms sowie eine Reihe damit verbundener Prinzipien.

Daher können wir sagen, dass wir auf halbem Weg sind, und jetzt können wir zu der umfangreichen Liste von Definitionen zurückkehren, die ich zuvor gegeben habe, um herauszufinden, welche Prinzipien zu unserer Perspektive passen, ohne unsere grundlegende Vision zu verraten (konzentrieren Sie sich auf den Austausch von Botschaften). .

Dafür kehren wir noch einmal zu unserer Hauptquelle zurück, den OO-Prinzipien von Smalltalk:

  • Nachrichten austauschen;
  • Lokale Datenspeicherung, zusammen mit staatlichem Schutz und Geheimhaltung;
  • Extrem späte Bindung.

Wenn wir das Kriterium der historischen Relevanz erneut verwenden, könnte man argumentieren, dass wir, da diese Begriffe heute nicht mehr verwendet werden (mit Ausnahme von Messaging), stattdessen die Verwendung der 4 Säulen in Betracht ziehen sollten, und auch hier glaube ich, dass die Verwendung von a Ein versöhnlicher Ansatz wäre hier das Beste aus beiden Welten ohne Widersprüche:

  • Nachrichten austauschen;
  • Polymorphismus;
  • Einkapselung;
  • Abstraktion;
  • Vererbung;

Es gibt eine Erklärung für die Wahl dieser 5 Prinzipien:

Austausch von Nachrichten

Der Austausch von Nachrichten ist im ursprünglichen Kontext von OO etwas nicht Verhandelbares, schließlich behauptet Alan Kay, die große Idee des Paradigmas zu sein, sein wichtigstes Konzept, weshalb alle anderen Konzepte etwas haben müssen mach damit.

Seine Akzeptanz in der Praxis ist recht beträchtlich, da Sprachen mit historischer Relevanz wie Self, Objective-C und Ruby eine starke Verbindung zu diesem Konzept haben und Ruby selbst heutzutage als Mainstream-Sprache gilt, in der großartige Anwendungen erstellt werden darauf wie Github selbst, zusätzlich zu einer sehr aktiven Community.

Und ich würde sagen, dass es neben Vererbung und Kapselung eines der Konzepte ist, die am meisten die Identität von OO tragen, da die anderen beiden Instanzen (gewollter Scherz), in denen der Begriff verwendet wird, im Akteurmodell liegen würden ist eine formale Logik eines mathematischen Modells, die im Grunde fast die gleichen Ideen wie Alan Kay hat, aber vollständig auf Parallelität basiert (so etwas wie OO war zu 100 % asynchron, damit Sie JS-Entwickler es verstehen können).

Polymorphismus

Dies ist ein Konzept, das alle Kriterien unserer Analyse erfüllt, da es, wie Nygaard und Dahl feststellten, in praktisch allen Sprachen vorhanden ist, die das Paradigma umsetzen, auch wenn implizit (wenn es die Vererbung unterstützt, Unterstützung für Polymorphismus wird implizit ebenfalls unterstützt).

Es passt hervorragend zu der Idee, Nachrichten auszutauschen, da es ein natürlicher Vorteil seiner Verwendung ist. Außerdem kommt es in Alan Kays Definition vor (obwohl er sagt, dass er den Begriff Generizität bevorzugt), schließlich ist späte Bindung der Name des in Sprachen vorkommenden Prozesses
Eine Art Programmierung, die es ihnen ermöglicht, einen Funktionsaufruf nicht mit einem bestimmten Code zu verknüpfen, sondern ihn vielmehr basierend auf dem Kontext auszuführen (der im Fall von OO das Objekt ist, das die Nachricht empfängt), was genau die Definition von Polymorphismus ist .

Im Hinblick auf die öffentliche Wahrnehmung wäre es das wichtigste der fünf aufgeführten Konzepte und würde von Onkel Bob sogar als die Essenz von OO definiert werden, und zwar selbst in Situationen, in denen man nicht vorhat, genau in Objektorientierung zu programmieren, Dies gilt als Prinzip als grundlegender Baustein für die Konstruktion einiger Ideen wie der sechseckigen Architektur oder der sauberen Architektur.

Das Konzept gilt jedoch nicht nur für OO, sondern ist ein allgemeineres Konzept, das in mehreren Paradigmen präsent ist und häufig unterschiedliche Implementierungen in derselben Sprache aufweist. Dennoch lässt sich argumentieren, dass speziell der Subtyp-Polymorphismus einzigartig für OO ist, da es sich um einen Typ handelt, der von der Fähigkeit der Sprache zur Vererbung abhängt.

Verkapselung

Wenn Sie unseren Artikel zu diesem Thema gelesen haben (ja, wir sprechen hier gerne über Definitionen), wissen Sie, dass die Aussage „Lokale Datenaufbewahrung, zusammen mit staatlichem Schutz und Verstecken“ im Grunde die vollständige Definition von ist Kapselung, daher basiert die konzeptionelle Ausrichtungsseite, wie die vorherigen, hier zu 100 % auf diesem Prinzip.

Obwohl einige Sprachen die Kapselung nicht als Prinzip erwähnen, ist das Konzept in ihnen sogar zur Hälfte vorhanden, nämlich die Tatsache, Objekte zu haben (oder wie im Fall von Java und Self das Konzept von Feldern in Objekten hervorzuheben). zeigt, dass sie über einen Mechanismus verfügen, der dafür sorgt, dass Daten zusammen mit ihren Funktionen (dem Objekt selbst) nur in einem lokalen Kontext verarbeitet werden. Sprachen wie C++ und Eiffel hingegen verfügen über Mechanismen zum Schutz und Verbergen des Zustands im Formular von Zugriffsmodifikatoren (C++) oder Behauptungen, Vorbedingungen, Nachbedingungen und Invarianten (Eiffel). In Java haben wir sogar einen der bekanntesten Artikel zur Objektorientierung, der genau die Anwendung der Kapselung bespricht: Warum Getter und Setter böse sind.

Ich würde also sagen, dass es sich um ein Prinzip handelt, das im Laufe der Zeit sehr gut ausgereift ist, obwohl es immer noch unter denselben Kritikpunkten leiden kann wie Polymorphismus, da es sich nicht um ein Konzept handelt, das ausschließlich mit OO in Verbindung gebracht wird, da dies möglich ist Realisieren Sie es mit Modulen (die einem Singleton-Objekt ähneln würden) oder Abschlüssen, da sie als Arme-Leute-Objekte fungieren können. Genau wie im Fall des Polymorphismus wird das Konzept jedoch in OO „mit einer einzigartigen Note“ angewendet , da der lokale Datenaufbewahrungsmechanismus das Objekt ist und das Ausblenden von Informationen durch Zugriffsmodifikatoren erfolgt, eine Funktionalität, die weithin mit dem Paradigma verbunden ist.

Abstraktion

Sie erscheint nicht so stark wie die übrigen 4 Säulen, jedoch ist ihre Präsenz, ähnlich wie bei der Kapselung, immer noch implizit und nicht explizit spürbar, da mit Ausnahme von Self alle genannten Sprachen über einen Mechanismus verfügen der Datenabstraktion in Form von Klassen.

Wenn er auf die Frage des Selbst eingeht, legt er großen Wert auf die Objekte selbst und auf den Austausch von Botschaften, die wir nutzen können, um die Frage der konzeptionellen Ausrichtung zu analysieren, die ich in diesem Fall als Programmierung bezeichnen würde mit dem Austausch von Nachrichten, in moderneren Worten (obwohl die Konzepte nicht genau dasselbe sind) wäre dasselbe wie „Programmieren für eine Schnittstelle“, also Programmieren nur mit Abstraktionen, ohne sich Gedanken darüber zu machen, was die endgültige Implementierung tatsächlich sein wird sei es, eine Methode, die im Buch „Smalltalk by Beispiel: The Developer's Guide“ von Alec Sharp sehr gut als „die objektorientierte Art zu programmieren“ beschrieben wird.

Die Idee der Abstraktion in Verbindung mit Polymorphismus ermöglicht es, dass jede Metapher für den Nachrichtenaustausch funktioniert, da die Idee darin besteht, dass es keine Möglichkeit gibt, das Ergebnis der Ausführung des Codes allein durch die anschließende Betrachtung der Nachrichten zu ermitteln Sie alle sind Abstraktionen (im gleichen Sinne, dass man nicht wissen kann, wie Dinge ausgeführt werden, wenn man die Methoden einer Schnittstelle im modernen OO liest), und das Ergebnis hängt von ihren konkreten Implementierungen ab, die in den Objekten selbst zu finden sind, also von der Ausführung kann variieren, je nachdem, welches Objekt auf diese Nachricht antwortet.

Von allen Prinzipien würde ich sagen, dass die Abstraktion das schwächste Kriterium der Exklusivität ist, da die Datenabstraktion ein allgemeines Prinzip ist, das über dem Konzept der Paradigmen steht, wie es Peter Van Roy in seinem Artikel „Programming Paradigms for Dummies“ dargelegt hat Auch hier befinden wir uns in einer ähnlichen Situation wie die anderen Prinzipien, bei denen ein äußerst charakteristischer Mechanismus in Form von Klassen verwendet wird, die weithin als OO-Funktionalität anerkannt sind und so anerkannt sind, dass viele Leute denken, dass das Paradigma auf die Programmierung beschränkt ist Klassen (wobei sogar die Objekte und noch schlimmer die Nachrichten im Prozess vergessen werden).

Erbe

Sie ist aus dem entgegengesetzten Grund zum Austausch von Nachrichten hier. Wenn die ausgetauschten Nachrichten einen niedrigen öffentlichen Wahrnehmungswert, aber die höchste konzeptionelle Ausrichtung aufweisen, weist die Vererbung die niedrigste konzeptionelle Ausrichtung der ausgewählten Konzepte auf (was mit bestätigt werden kann). Ich zitiere, dass Alan Kay das Erbe von Smalltalk nur hinzugefügt hat, weil er nicht wirklich wusste, wofür es verwendet werden sollte, aber dachte, es könnte nützlich sein), aber es hat neben sehr hohen historischen Beiträgen auch die größte öffentliche Wahrnehmung.

Anfangs war es eines der Hauptmerkmale von Simula, es wurde in der Post-Smalltalk-Ära als die Essenz von OO angesehen, obwohl sich dies völlig umkehrte, nachdem GoF die Idee der Komposition statt der Vererbung veröffentlichte.

Trotzdem ist es das einzige Konzept, das ausschließlich mit OO in Verbindung gebracht wird, da es sich um eine Funktionalität handelt, deren Vorhandensein in vielen Fällen ausreichen würde, um eine Sprache als objektorientiert zu differenzieren. Die einzigen Argumente, die dagegen sprechen könnten, sind Hoares Idee von Datensätzen, aber sie war der Grund für die Vererbung in Simula und Produkttypen, aber das ist ein ganz anderes Thema als Vererbung, und auch nicht Sie leiden unter den gleichen Problemen und Kontroversen.

Abschluss

Endlich haben wir sowohl die Perspektive als auch die Prinzipien, also lautet unsere endgültige Definition:

Ein objektorientiertes Programm wird als ein Netzwerk von Objekten betrachtet, bei denen es sich um Darstellungen von Domänenkonzepten handelt, die durch den Austausch von Nachrichten kommunizieren, wobei das Ziel darin besteht, Daten zu vermeiden und sich auf Interaktionen zu konzentrieren, damit eine Nachricht übertragen werden kann mehrere Bedeutungen. Die Prinzipien sind Nachrichtenaustausch, Polymorphismus, Kapselung, Abstraktion und Vererbung. Die allgemeine Struktur ähnelt einer Simulation des Verhaltens eines realen oder imaginären Teils der Welt.

Wie auch immer, dies ist meine endgültige Antwort auf die im Titel des Artikels gestellte Frage. Diese ganze Recherche war eine Menge Arbeit, daher hoffe ich, dass der Text Ihnen zumindest etwas Neues beigebracht oder zu einigen Überlegungen geführt hat.

Wenn Sie meiner Definition zustimmen oder nicht, vergessen Sie nicht, Ihre Meinung in den Kommentaren mitzuteilen, und bis zum nächsten Mal!

Links, die Sie interessieren könnten

  • Wikipedia zu Programmierparadigmen;
  • Wikipedia zum Thema Polymorphismus;
  • C2 Wiki – Niemand ist sich darüber einig, was OO ist;
  • C2 Wiki – Objektorientierte Programmierung;
  • Stackoverflow – Bedeutung der „objektorientierten“ Terminologie;
  • EOLANG und Phi-Kalkül;
  • Konzepte, Techniken und Modelle der Computerprogrammierung;
  • Programmierparadigmen für Dummies;
  • Smalltalk anhand von Beispielen;
  • Objektorientierte Programmierung in der Programmiersprache BETA;
  • Warum C++ nicht nur eine objektorientierte Programmiersprache ist;
  • Dr. Alan Kay über die Bedeutung von „Objektorientierter Programmierung“;
  • Die Geburt der Objektorientierung: die Simula-Sprachen;
  • Zwei große Schulen der objektorientierten Programmierung;
  • ISO/IEC 2382:2015;
  • SelfObjectModel;
  • Das Selbsthandbuch;
  • Selbst: Die Kraft der Einfachheit;
  • Dynamisch vs. Statischer Versand;
  • (Falsche) Interpretationen von OOP;
  • Emerging Objects Aufbau eines einfachen Objektsystems aus Abschlüssen;
  • Aufräumen: Erstellen eines einfachen Metaobjekt-Protokolls;
  • Versandschnittstelle;
  • Alan Kay und OO Programmierung;
  • Alan Kay hat keine Objekte erfunden;
  • Prototypen vs. Klassen war: Re: Sun's HotSpot;
  • Zur Zukunft der Spezifikation und Organisation von Computerprogrammen;
  • Datenlose Programmierung;
  • Die frühe Geschichte von Smalltalk;
  • Go-to-Aussage gilt als schädlich;
  • Boehm-Jacopini-Theorem;
  • Eiffel über OO;
  • Devmedia über OO;
  • Wikipedia zur Lambda-Rechnung;
  • Ada über OO;
  • Java-Spezifikation 3. Auflage;
  • C# über OO;
  • Python über OO;
  • PHP über OO;
  • Ruby Doc;
  • MDN über OO;
  • Objektorientierte Analyse und Design mit Anwendungen;
  • Designmusterbuch;
  • Warum Getter und Setter böse sind;
  • Clean Coder Blog – FP vs. OO;
  • Wikipedia zum Thema Schauspielermodell;
  • Akka (Programmiersprache) über Actor Model;
  • Stattliches über Schauspielermodell;

Arsch: Müde Unterstützung

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn