Qu'est-ce qui a fait le succès de la programmation orientée objet? [fermé]

17

Selon vous, quelle est la caractéristique qui a fait le succès de la programmation orientée objet?

  1. Passage de message
  2. Héritage
  3. Polymorphisme
  4. Encapsulation

Ou une autre fonctionnalité que vous aimeriez introduire.

J'aimerais aussi savoir quel est le lien entre le type de données abstrait et la programmation orientée objet?

Tony
la source
populaire et réussi ne sont pas synonymes
kevin cline

Réponses:

76

Je dirais que la caractéristique la plus importante de la programmation orientée objet est celle de la gestion de la complexité .

Le cerveau humain ne peut contenir que de nombreux concepts à la fois - la limite souvent citée de se souvenir de 7 +/- 2 éléments indépendants vient à l'esprit.

Lorsque je travaille sur un système 600kloc au travail, je ne peux pas tout garder en tête à la fois. Si je devais le faire, je serais limité à travailler sur des systèmes beaucoup plus petits.

Heureusement, je n'ai pas à le faire. Les différents modèles de conception et autres structures que nous avons utilisés sur ce projet signifient que je n'ai pas à traiter l'ensemble du système à la fois - je peux ramasser des pièces individuelles et les travailler, sachant qu'elles s'intègrent dans l'application plus large de manière bien définie.

Tous les concepts OO importants permettent de gérer la complexité.

Encapsulation - permettez-moi de traiter avec une API externe qui me fournit divers services, sans se soucier de la façon dont ces services sont mis en œuvre.

Abstraction - permettez-moi de me concentrer sur les caractéristiques essentielles et d'ignorer ce qui n'est pas pertinent.

Composition - permettez-moi de réutiliser des composants qui ont déjà été construits dans de nouvelles combinaisons

Polymorphisme - permettez-moi de demander un service sans vous soucier de la façon dont différents objets peuvent le fournir de différentes manières.

Héritage - permettez-moi de réutiliser une interface ou une implémentation, fournissant uniquement les éléments qui sont différents de ce qui était auparavant.

Principe de responsabilité unique - permet de garder l'objectif de chaque objet clair et concis, il est donc facile de raisonner

Liskov Substitution Prinicple - ne posons pas de pièges les uns aux autres en introduisant des dépendances étranges

Principe ouvert / fermé - autorisons l'extension et la modification d'une manière qui ne nous oblige pas à risquer de casser le code existant

Injection de dépendance - prenons la composition au niveau supérieur et assemblons les composants ensemble beaucoup plus tard.

Développement orienté interface - prenons l'abstraction au niveau supérieur et ne dépendons que de l'abstraction, jamais d'une implémentation concrète.

Bevan
la source
6
+1. Je ne peux voter qu'une seule fois, ce qui est vraiment dommage que cela mérite davantage.
Richard
1
Il y a un corollaire à cela, c'est dommage que je ne trouve pas la référence en ce moment mais je vais essayer de me rappeler de la rechercher et de modifier le commentaire. Ainsi, une étude des pratiques de révision de code a révélé que les révisions de code avaient tendance à prendre plus de temps pour trouver des bogues dans le code OO que dans le code procédural, car le flux saute plus dans le code OO. Des pratiques comme TDD et la programmation par paires atténuent cela, mais c'est toujours un résultat intéressant (et pour moi, inattendu).
5
Cela pourrait être la réponse parfaite - des informations complètes, mais suffisamment courtes pour que le lecteur n'ait pas à lire un roman. Bravo
Tim Claason
@Graham Lee: Je serais intéressé à lire cette étude.
Frank Shearar
13

Interfaces utilisateur graphiques. À la fin des années 80, au début des années 90, lorsque Mac, Amigas, Atari ST, Windows et GEM ont commencé à remplacer les interfaces utilisateur basées sur les caractères, il est devenu évident que des langages comme C ne sont pas bien adaptés pour écrire des programmes GUI. Alors que le traitement de données traditionnel est considéré comme un schéma "données d'entrée -> traitement -> données de sortie", ce qui pourrait également être fait dans un langage procédural, les fonctionnalités OO sont tout simplement utiles pour gérer la complexité inhérente d'une interface graphique.

user281377
la source
1
+1 pour mentionner les applications GUI. L'orientation objet était l'outil qui permettait d'implémenter des GUI, qui étaient autrement (avec du code procédural) assez difficiles à gérer.
Giorgio
7

Le masquage des données fourni par l'encapsulation.


la source
Ceci est une réponse? Les ADT fournissent le masquage des données (c'est pourquoi ils sont appelés "abstractions de données")
Frank Shearar
@Frank, Il a demandé des fonctionnalités spécifiques et quand j'ai écrit cette réponse, il n'y en avait qu'une seule et j'essayais de ne pas dupliquer.
Assez juste, mais l'encapsulation n'est pas exactement spécifique à OO. Je devrais vérifier cela moi-même, mais je suis presque sûr que nous faisions de l'encapsulation bien avant OO.
Frank Shearar
1
@Frank, je suis d'accord que ce n'est pas spécifique à OO, c'est juste l'une de ses principales fonctionnalités.
C'est vrai pour la plupart des OOPL, mais pas pour tous. CLOS est une exception notable.
Frank Shearar
7

Une fonctionnalité qui n'a encore été mentionnée par aucune des autres réponses: la modélisation de domaine . Parce que les gens ont tendance à penser à faire des choses avec ou avec des objets et à des objets ayant des propriétés intrinsèques, il est très facile de modéliser un problème ou un flux de travail à l'aide d'un logiciel orienté objet. Essentiellement, cela nous permet d'utiliser notre capacité existante pour traiter les noms, les verbes et les adjectifs dans le code.


la source
6

Je pense que l'héritage est le point le plus important de la POO.

[du développement de jeux] Vous pouvez créer quelque chose comme une classe Drawable, avec des méthodes et des attributs de rendu, et créer une classe Spaceship and Planet, qui hérite de Drawable. Prenez tous les objets de ceux-ci [et d'autres enfants Sprite], ajoutez un drawableObjArray et appelez simplement la méthode draw pour chaque objet. Vous avez juste besoin de savoir que c'est un Drawable.

JulioC
la source
2
Vraiment?? Le polymorphisme est beaucoup plus important et ne nécessite pas d'héritage (d'un point de vue théorique).
Thomas Eding
Ne nécessite même pas de fonctions virtuelles, utilisez simplement des pointeurs de fonction.
Calmarius
1
Le concept original d'OO d'Alan Kay n'incluait même pas l'héritage parce qu'il n'aimait pas la façon dont il était implémenté dans les systèmes précédents.
Michael Borgwardt
3

Abstraction

Fournir les services nécessaires en cachant les choses inutiles. Voir mon explication ici - Qu'est-ce que l'abstraction?

Gulshan
la source
Typo: "Absraction" devrait être "Abstraction"
Vetle
2

Il est quelque peu réussi car il encourage l'utilisation de l'organisation des choses par l'esprit humain en objets. Les gens sont généralement bons à voir les relations entre les choses - des choses comme les différences, les similitudes et le comportement. OO encourage le développement de logiciels pour imiter la conceptualisation humaine du monde.

Rendre le développement de logiciels similaire à notre façon de voir le monde facilite la gestion de la complexité par nos esprits.

Tim
la source
C'est peut-être à cause de plus d'expérience avec la procédure, mais après avoir utilisé les deux méthodes, je trouve toujours la procédure plus intuitive que la POO. J'aime toujours les bonnes parties des deux styles.
Juha Untinen
1

" ADT vs objects " a été demandé à plusieurs reprises ici. La réponse sur une ligne est "les ADT et les objets sont l'inverse l'un de l'autre - ce que l'un résume parfaitement, l'autre ne le peut pas; chacun permet une flexibilité de différentes manières."

Pour une réponse plus longue, voir William Cook's On Understanding Data Abstraction, Revisited . En bref, les objets vous permettent d'utiliser facilement plusieurs implémentations / représentations de certaines données (quelque chose qui ressemble à une liste pourrait être un tableau, ou un arbre d'auto-équilibrage, ou ...), mais il est difficile d'ajouter de nouvelles opérations (parce que vous devez ajouter cette nouvelle opération à chacune de vos représentations), tandis que les ADT facilitent l'ajout de nouvelles opérations sur votre type de données, mais rendent difficile la multiplication des implémentations.

Edit: j'avais dit que la transmission des messages était ce qui faisait le succès d'OO. D'après le commentaire de Jonas, ce n'est pas vrai, car la plupart des langues que les gens considèrent comme OO n'utilisent pas la transmission de messages. Comme ce n'est pas bien, je l'ai retiré de ma réponse.

Frank Shearar
la source
1
La transmission de messages peut difficilement être la réponse, car aucun des langages de POO réussis ne l'utilise.
Jonas
Votre OO n'est pas nécessairement mon OO. Et la plupart des langues appelées OO ne le sont pas, selon la définition d'Alan Kay. J'oublie la citation exacte, mais Kay a dit que les objets n'étaient pas ce qui était important à propos de Smalltalk, mais la transmission de messages (et que la plupart ont raté ce point).
Frank Shearar
@Jonas Je suppose, en relisant la question et ma réponse, que je dis à moitié "OO ne réussit pas, car si peu de langues le font correctement." Mais je ne dis des choses comme ça que lorsque je porte mon costume ignifuge.
Frank Shearar
0

Mes trois principales fonctionnalités. Composition d'objets - permettant aux objets de collaborer. Polymorphisme - prend en charge les comportements dynamiques lors de l'exécution. Héritage - en réutilisant le code et en modifiant le comportement grâce à la substitution de méthodes.

ADT - vous pouvez l'avoir même dans des langages non orientés objet comme Pascal. Une pile ou une file d'attente sont des exemples d'ADT.

StartClass0830
la source
"ADT - vous pouvez l'avoir même dans des langages non orientés objet comme Pascal. Une pile ou une file d'attente sont des exemples d'ADT.": Vrai. Mais la POO facilite la définition de l'interface d'un ADT et fournit une implémentation différente et interchangeable (interface / classe abstraite <---> sous-classes / classes concrètes). Pour autant que je sache, ce n'est pas aussi facile en Pascal.
Giorgio
0

en termes simples, la POO est la clé de la réutilisation et de l'encapsulation qui se traduit par la production de grands frameworks qui facilitent la vie des programmeurs à cette époque, car ils peuvent simplement appeler les API et faire le jour le plus souvent.

comme votre question concerne les 4 fonctionnalités de la POO, vous pouvez donc dire

  1. Héritage et 4. L'encapsulation sont les caractéristiques les plus importantes et les deux autres sont très nécessaires pour atteindre les deux premiers

donc 1. Passage de message et 3. Le polymorphisme supporte en fait 2. Héritage et 4. Encapsulation.

  1. Héritage et 4. L'encapsulation est la clé du succès de la POO
Badr uz Zaman
la source
l'héritage n'est pas nécessaire, un élément déterminant ou même une partie très souhaitable de la POO la plupart du temps. l'encapsulation est un bon principe pour la programmation en général. il n'a pas été inventé par OOP et il n'est pas uniquement utilisé en OOP.
sara
-1

À mon avis, les trois dernières fonctionnalités sont les plus importantes qui ont eu un impact sur la large utilisation de la POO:

2. Inheritance
3. Polymorphism
4. Encapsulation

Edit: Un autre point serait les environnements de développement d'interfaces graphiques et IDE comme Visual studio et Eclipse. Comme ils embrassent les langages OOP, de plus en plus de designs tendent vers OOP.

Et bien sûr, les principes SOLID sont ceux qui rendent les produits logiciels ROCK solides et livrables :)

Yusubov
la source