Pourquoi l'héritage, l'encapsulation et le polymorphisme ne sont-ils pas les piliers de la POO? [fermé]

16

Un jour, je suis allé sur un chat Stack Overflow et j'ai vu une phrase qui disait que l'hérédité, l'incapsulation et le polymorphisme sont les piliers de la POO (dans le sens où ils sont fondamentaux, une semelle de construction).

En outre, il y a une question similaire, qui m'a été posée très souvent lors d'examens universitaires et d'entretiens d'embauche, et la bonne réponse a toujours été la déclaration prononcée dans le titre de la question ("Oui, l'héritage, l'encapsulation et le polymorphisme sont les piliers de la POO ).

Mais dans le chat Stack Overflow, j'ai été sévèrement ridiculisé, les participants étaient fortement en désaccord avec une telle déclaration. Alors, quel est le problème avec cette déclaration?

Les programmeurs semblent-ils être formés à différentes choses dans les collèges post-soviétiques et américains?

L'héritage, l'encapsulation et le polymorphisme ne sont-ils pas considérés comme les piliers de la POO par les programmeurs américains / britanniques?

PaulD
la source
7
Votre question n'a pas de contexte; nous ne savons pas à quoi pensaient les gens du chat SO, ni à quoi ils répondaient. Peut-être que vous pouvez créer un lien vers la conversation dans la salle de discussion, afin que nous puissions y jeter un œil? Cela dit, je pense que c'est mieux résolu dans la salle de chat, plutôt qu'ici.
Robert Harvey
1
@Robert, trop de temps passé. Je doute que je puisse même trouver le lien vers la conversation. Mais je conviens que le contexte est important. Ce n'est pas pour blâmer quelqu'un, ou pour me présenter comme une victime innocente d'une agression par chat, je veux juste connaître la vérité.
PaulD
5
Le salon. Avez-vous mis votre combinaison antidéflagrante en premier?
Robert Harvey
1
La seule signification que je puisse donner à la phrase est soit "vous pouvez avoir une POO sans aucune d'entre elles" (vrai, mais n'a aucun sens au moins pour l'encapsulation) ou "vous pouvez également les utiliser en dehors de la POO", ou quelque chose comme ça.
SJuan76
2
Imo OO n'a qu'un seul pilier et c'est: "State". Une fois que votre cerveau pense en état, vous obtenez OO.
Pieter B

Réponses:

40

L'héritage, l'encapsulation et le polymorphisme ne sont-ils pas considérés comme les piliers de la POO par les programmeurs américains / britanniques?

Ils sont considérés comme des piliers par de nombreux programmeurs, et de nombreux collèges enseignent OO de cette façon.

Malheureusement, c'est aussi une vue à courte vue.

  • L'héritage n'est qu'un mécanisme utilisé pour implémenter la POO et peut être utilisé abusivement pour ne pas faire de POO.
  • L'encapsulation est un concept, utile pour la programmation de toutes sortes, POO et non.
  • Le polymorphisme est un ... trait (?) Pour décrire le comportement du calcul. Il existe de nombreuses façons de réaliser le polymorphisme, qui ne sont pas toutes spécifiques à l'OO.

La POO a très peu de fondement, car en réalité, elle est très conceptuelle: "Abordez la conception de votre programme en pensant aux choses comme des objets - des ensembles cohérents de données et de fonctionnalités."

Et tandis que la conception de programme moderne a une mauvaise vue de faire les choses de «façon purement OO», la plupart des programmeurs qualifiés conviendront que les principes SOLIDES (ou certains sous-ensembles) sont de meilleurs candidats pour les «piliers de la programmation orientée objet» (même s'ils s'applique bien aux non-POO). Ceux-ci ne fonctionnent pas du tout avec ces termes. Au lieu de cela, ils utilisent les concepts d'entités logicielles (dont les objets sont un), d'interfaces (dont un C # / Java / etc. en interfaceest un), d'abstraction et de sous-typage (dont l'héritage est une forme).

Telastyn
la source
10
Réponse décente à une question essentiellement sans réponse.
Robert Harvey
3
La POO existe-t-elle?
Tulains Córdova
5
Je dirais que seule l'encapsulation est un «pilier» de la POO. La plus grande différence entre la POO et la programmation structurelle est l'idée que les objets contiennent du code et des données, pas seulement des données (par exemple une structure C classique). Les deux autres concepts sont principalement utilisés dans les langages OO, mais ne sont ni limités à OO ni requis par celui-ci.
3
@Snowman Encapsulation n'est pas non plus limité à la POO. Les gens implémentent tout le temps des types de données abstraits en langage C et fonctionnel.
Doval
2
Et @ JörgWMittag avait une bonne réponse en ce qui concerne la messagerie. L'idée de la messagerie nécessite nécessairement une encapsulation. Les messages sont généralement transmis à une fonction ou une méthode sur un objet, qui agit ensuite sur l'état qui y est encapsulé . Cela ne veut pas dire que les langues non-OO ne peuvent pas non plus avoir de passage de message ou d'encapsulation, mais seulement que ce sont des idées fondamentales de la POO.
23

tl; dr: Vous pouvez avoir un héritage sans OO, vous pouvez avoir une encapsulation sans OO, vous pouvez avoir un polymorphisme sans OO, vous pouvez même avoir les trois à la fois sans OO. D'un autre côté, vous pouvez avoir OO sans héritage. De plus, il existe différents types d'encapsulation (orientés ADT et OO), IOW n'est pas toute l'encapsulation est OO.

Version longue:

Le terme "programmation orientée objet" a été inventé par Alan Kay, donc il doit décider ce que cela 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.

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 dépassent toute 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 vraie chose, tant qu'il répond comme vous l'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.

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.

Chaque programmeur devrait lire On Understanding Abstraction Data, Revisited . Il explique en détail quelle est exactement la différence entre les objets et les types de données abstraits. Il donne des exemples en utilisant Java, et qui est extrêmement pertinente à cette question, parce que dans les deux exemples d'ADT et les exemples d'objets qu'il utilise l' héritage, l' encapsulation et le polymorphisme, mais seulement l' un des exemples est orienté objet! En d'autres termes: vous pouvez avoir l'héritage, l'encapsulation et le polymorphisme, vous pouvez même avoir les trois à la fois et toujours pas d'OO.

D'un autre côté, vous pouvez avoir OO sans héritage. Comme je l'ai laissé entendre ci-dessus: les versions originales de Smalltalk (le langage conçu par Alan Kay, l'inventeur du terme "programmation orientée objet") n'avaient pas d'héritage.

Dernier point, mais certainement pas le moindre, le Traité d'Orlando traite de la délégation comme alternative à l'héritage et comment les 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 à nouveau qu'il n'est pas nécessaire pour OO.)

Jörg W Mittag
la source
Vous pouvez avoir "héritage", "polymorphisme" et "héritage" ... il me semble qu'il y a une faute de frappe quelque part :)
slebetman
1
Cette réponse me fait souhaiter que nous puissions également répondre aux «favoris».
Chan-Ho Suh
La définition d'Alan Kay est dépassée. OO a besoin d'héritage, et si vous pouvez faire à la fois une liaison au moment de l'exécution et de la compilation comme en C ++, vous obtenez également des performances comparables à C.
Erik Alapää
Non, sa définition est la bonne. Vous n'avez pas du tout besoin d'héritage pour être OO. Les langages prototypes n'utilisent pas d'héritage comme C ++ et ils sont toujours OO. L'héritage n'est utilisé que pour implémenter la réutilisation du code, ce n'est même pas le meilleur moyen, il y a beaucoup de meilleurs langages qui ont des mixins, par exemple. Cela n'a également rien à voir avec la liaison, car vous pouvez avoir une répartition dynamique, pas même en C ++ lorsque vous pouvez utiliser des méthodes virtuelles. La performance n'a rien à voir avec tout cela, ce sont des concepts de haut niveau, ils n'ont aucune performance. En fait, vous pouvez implémenter le passage de message en C et être OO
Luiz Felipe