Le terme "Object-Orientation" a été inventé par le Dr Alan Kay, il est donc la source faisant autorité sur ce qu'il signifie, et il le définit ainsi :
Pour moi, la POO signifie uniquement la messagerie, la conservation et la protection locales et la dissimulation du processus étatique, et la liaison tardive extrême de toutes choses.
Décomposons cela:
- messagerie ("envoi de méthode virtuelle", si vous n'êtes pas familier avec Smalltalk)
- le processus d'état doit être
- conservé localement
- protégé
- caché
- liaison tardive extrême de toutes choses
En ce qui concerne l'implémentation, la messagerie est un appel de procédure à liaison tardive, et si les appels de procédure sont à liaison tardive, vous ne pouvez pas savoir au moment de la conception ce que vous allez appeler, vous ne pouvez donc pas faire d'hypothèses sur la représentation concrète de l'état. Donc, il s'agit vraiment de messagerie, la liaison tardive est une implémentation de la messagerie et l'encapsulation en est la conséquence.
Il a ensuite précisé que " la grande idée est la" messagerie " ", et regrette de l'avoir appelé "orienté objet" au lieu de "orienté message", car le terme "orienté objet" met l'accent sur la chose sans importance (objets ) et détourne l'attention de ce qui est vraiment important (messagerie):
Juste un petit rappel que j'ai pris la peine lors du dernier OOPSLA pour essayer de rappeler à tout le monde que Smalltalk n'est pas seulement PAS sa syntaxe ou la bibliothèque de classes, il ne s'agit même pas de classes. Je suis désolé d'avoir inventé il y a longtemps le terme «objets» pour ce sujet, car cela amène beaucoup de gens à se concentrer sur l'idée la moins importante.
La grande idée est la «messagerie» - c'est de cela que parle le noyau de Smalltalk / Squeak (et c'est quelque chose qui n'a jamais été complètement terminé dans notre phase Xerox PARC). Les Japonais ont un petit mot - ma - pour «ce qui est entre» - peut-être que l'équivalent anglais le plus proche est «interstitiel». La clé pour créer de grands systèmes évolutifs est beaucoup plus de concevoir la façon dont ses modules communiquent plutôt que ce que devraient être leurs propriétés et comportements internes. Pensez à Internet - pour vivre, il (a) doit permettre de nombreux types d'idées et de réalisations qui vont au-delà d'une norme unique et (b) permettre divers degrés d'interopérabilité sûre entre ces idées.
(Bien sûr, aujourd'hui, la plupart des gens ne se concentrent même pas sur les objets mais sur les classes, ce qui est encore plus faux.)
La messagerie est fondamentale pour l'OO, à la fois comme métaphore et comme mécanisme.
Si vous envoyez un message à quelqu'un, vous ne savez pas ce qu'il en fait. La seule chose que vous pouvez observer, c'est leur réponse. Vous ne savez pas s'ils ont traité le message eux-mêmes (c'est-à-dire si l'objet a une méthode), s'ils ont transmis le message à quelqu'un d'autre (délégation / mandataire), s'ils l'ont même compris. C'est à cela que sert l'encapsulation, c'est à cela que sert OO. Vous ne pouvez même pas distinguer un proxy de la réalité, tant qu'il répond à la façon dont vous vous y attendez.
Un terme plus "moderne" pour "messagerie" est "envoi de méthode dynamique" ou "appel de méthode virtuelle", mais qui perd la métaphore et se concentre sur le mécanisme.
Donc, il y a deux façons de regarder la définition d'Alan Kay: si vous la regardez seule, vous pouvez observer que la messagerie est essentiellement un appel de procédure à liaison tardive et que la liaison tardive implique l'encapsulation, nous pouvons donc conclure que # 1 et # 2 sont en fait redondants, et OO est une liaison tardive.
Cependant, il a précisé plus tard que l'important est la messagerie, et nous pouvons donc le voir sous un angle différent: la messagerie est liée tardivement. Maintenant, si la messagerie était la seule chose possible, alors # 3 serait trivialement vrai: s'il n'y a qu'une seule chose, et que cette chose est liée tardivement, alors toutes les choses sont liées tardivement. Et encore une fois, l'encapsulation découle de la messagerie.
Des points similaires sont également soulignés dans On Understanding Data Abstraction, Revisited by William R. Cook et également sa Proposition de définitions modernes et simplifiées de "Object" et "Object Oriented" .
La répartition dynamique des opérations est la caractéristique essentielle des objets. Cela signifie que l'opération à invoquer est une propriété dynamique de l'objet lui-même. Les opérations ne peuvent pas être identifiées statiquement, et il n'y a aucun moyen en général de savoir exactement quelle opération sera exécutée en réponse à une demande donnée, sauf en l'exécutant. C'est exactement la même chose qu'avec les fonctions de première classe, qui sont toujours distribuées dynamiquement.
Dans Smalltalk-72, il n'y avait même pas d'objets! Il n'y avait que des flux de messages qui ont été analysés, réécrits et redirigés. Les premières méthodes sont arrivées (méthodes standard pour analyser et rediriger les flux de messages), puis les objets (regroupements de méthodes qui partagent un certain état privé). L'héritage est venu beaucoup plus tard et les classes n'ont été introduites que comme moyen de prendre en charge l'héritage. Si le groupe de recherche de Kay connaissait déjà les prototypes, ils n'auraient probablement jamais introduit de cours en premier lieu.
Benjamin Pierce dans Types et langages de programmation fait valoir que la caractéristique qui définit l'Object-Orientation est la récursivité ouverte .
Donc: selon Alan Kay, OO est une question de messagerie. Selon William Cook, OO est tout au sujet de la répartition dynamique des méthodes (ce qui est vraiment la même chose). Selon Benjamin Pierce, OO est tout au sujet de la récursivité ouverte, ce qui signifie essentiellement que les auto-références sont résolues dynamiquement (ou du moins c'est une façon de penser), ou, en d'autres termes, la messagerie.
Comme vous pouvez le voir, la personne qui a inventé le terme "OO" a une vue plutôt métaphysique sur les objets, Cook a une vue plutôt pragmatique et Pierce une vue mathématique très rigoureuse. Mais l'important est: le philosophe, le pragmatiste et le théoricien sont tous d'accord! La messagerie est le seul pilier d'OO. Période.
Notez qu'il n'y a aucune mention d'héritage ici! L'héritage n'est pas essentiel pour l'OO. En général, la plupart des langages OO ont un moyen de réutilisation de l'implémentation, mais cela ne doit pas nécessairement être un héritage. Il pourrait également s'agir d'une forme de délégation, par exemple. En fait, le traité d'Orlando discute de la délégation comme alternative à l'héritage et comment différentes formes de délégation et d'héritage conduisent à différents points de conception dans l'espace de conception des langages orientés objet. (Notez qu'en fait, même dans les langages qui prennent en charge l'héritage, comme Java, les gens apprennent à l'éviter, ce qui indique encore une fois que ce n'est pas nécessaire pour l'OO.)