Quel est le point de la programmation orientée objet?

autant que je puisse dire, en dépit des millions ou des milliards dépensés sur l'enseignement de L'OOP, les langues, et les outils, OOP n'a pas amélioré la productivité du développeur ou la fiabilité du logiciel, ni a réduit les coûts de développement. Peu de gens utilisent la POO de façon rigoureuse (peu de gens adhèrent à des principes tels que la PSL ou les comprennent); il semble y avoir peu d'uniformité ou de cohérence dans les approches que les gens adoptent pour modéliser les domaines problématiques. Trop souvent, la classe est utilisé simplement pour son sucre syntaxique, il place les fonctions d'un type d'enregistrement dans leur propre petit espace de noms.

j'ai écrit une grande quantité de code pour une grande variété d'applications. Bien qu'il y ait eu des endroits où le sous-typage substituable a joué un rôle important dans l'application, ceux-ci ont été assez exceptionnels. En général, bien que beaucoup de paroles soient données pour parler de "réutiliser" la réalité est que, sauf si un morceau de code fait exactement ce que vous il y a très peu de "réutilisation"rentable. Il est extrêmement difficile de concevoir des classes pour être extensible de la bonne façon , et donc le coût de l'extension est normalement si grande que "réutiliser" n'est tout simplement pas la peine.

à bien des égards, cela ne me surprend pas. Le monde réel n'est pas" OO", et l'idée implicite dans OO--que nous pouvons modéliser les choses avec une certaine taxonomie de classe--me semble très fondamentalement défectueuse (je peux m'asseoir sur une table, un arbre moignon, le capot d'une voiture, quelqu'un tour, mais pas un de ceux est-une chaise). Même si nous passons à des domaines plus abstraits, la modélisation OO est souvent difficile, contre-intuitive, et finalement inutile (considérons les exemples classiques de cercles/ellipses ou carrés/rectangles).

alors qu'est-ce que je rate ici? Où est la valeur de L'OOP, et pourquoi tout le temps et l'argent n'a pas réussi à améliorer le logiciel?

126
demandé sur DrPizza 2008-08-23 18:40:28

30 réponses

il n'y a aucune preuve empirique qui suggère que l'orientation de l'objet est une façon plus naturelle pour les gens de penser au monde. Il y a du travail dans le domaine de la psychologie de la programmation qui montre que OO n'est pas en quelque sorte plus approprié que d'autres approches.

les représentations orientées objet ne semblent pas être universellement plus ou moins utilisables.

il ne suffit pas d'adopter simplement des méthodes OO et exiger les développeurs d'utiliser de telles méthodes, car cela pourrait avoir un impact négatif sur la productivité des développeurs, ainsi que la qualité des systèmes développés.

Qui est de "Sur la facilité d'utilisation de OO Représentations" de Communications de l'ACM Oct. 2000. Les articles comparent principalement OO avec l'approche axée sur le processus. Il y a beaucoup d'études sur la façon dont les gens qui travaillent avec la méthode OO "pensent" (Int. J. of Human-Computer Études de 2001, numéro 54, ou de l'Homme-Ordinateur Interaction 1995, vol. 10 a tout un thème sur les études OO), et d'après ce que j'ai lu, il n'y a rien qui indique une sorte de naturel à l'approche OO qui le rend mieux adapté qu'une approche procédurale plus traditionnelle.

24
répondu Svend 2016-07-08 17:11:10

le monde réel n'est pas" OO", et l'idée implicite dans OO--que nous pouvons modéliser les choses avec une certaine taxonomie de classe--me semble très fondamentalement défectueuse

bien que cela soit vrai et ait été observé par d'autres personnes (prenez Stepanov, inventeur du STL), le reste est absurde. OOP peut être défectueux et ce n'est certainement pas une solution miracle, mais il rend les applications à grande échelle beaucoup plus simple parce que c'est un excellent moyen de réduire les dépendances. Bien sûr, ceci est seulement vrai pour le" bon " design OOP. Un design bâclé ne donnera aucun avantage. Mais bon, la conception découplée peut être très bien modélisé en utilisant OOP et pas bien en utilisant d'autres techniques.

il existe des modèles bien meilleurs, plus universels ( haskell'S type model vient à l'esprit) mais ceux-ci sont aussi souvent plus compliqués et/ou difficiles à mettre en œuvre efficacement. La programmation orientée objet est un bon compromis entre les deux extrêmes.

119
répondu Konrad Rudolph 2017-05-23 11:46:39

OOP ne concerne pas la création de classes réutilisables, mais la création de classes utilisables.

45
répondu Brian Leahy 2008-08-23 18:04:49

trop souvent, la classe est utilisée tout simplement pour son sucre syntaxique; il met les fonctions pour un type d'enregistrement dans leur petit espace de noms.

Oui, je trouve cela trop répandue. Ce N'est pas de la programmation orientée objet. C'est de la programmation basée sur les objets et de la programmation basée sur les données. Au cours de mes 10 années de travail avec les langages OO, je vois des gens qui font surtout de la programmation basée sur des objets. OBP se décompose très vite IMHO puisque vous obtenez essentiellement le pire des deux mots: 1) programmation procédurale sans adhérer à la méthodologie éprouvée de programmation structurée et 2) OOP sans adhérer à la méthodologie éprouvée OOP.

OOP fait droit est une belle chose. Il rend les problèmes très difficiles faciles à résoudre, et pour les non-initiés (ne pas essayer de paraître pompeux là-bas), il peut presque sembler magique. Cela dit, L'OOP n'est qu'un outil dans la boîte à outils des méthodologies de programmation. Il est pas la fin à toutes méthodologie. Il se trouve que cela convient bien aux grandes entreprises.

la plupart des développeurs qui travaillent dans les langues OOP utilisent des exemples de OOP bien fait dans les cadres et les types qu'ils utilisent au jour le jour, mais ils ne sont tout simplement pas au courant de celui-ci. Voici quelques exemples très simples: ADO.NET, Hibernate/NHibernate, cadres de journalisation, différents types de collection de langues, le ASP.NET stack, the JSP stack etc... Ce sont des choses sur lesquelles on compte beaucoup. OOP dans leurs codebases.

42
répondu Daniel Auger 2008-08-23 16:42:45

la réutilisation ne devrait pas être un objectif de L'OOP - ou tout autre paradigme d'ailleurs.

la Réutilisation est un effet secondaire d'une bonne conception et le bon niveau d'abstraction. Le Code permet la réutilisation en faisant quelque chose d'utile, mais pas au point de le rendre inflexible. Peu importe que le code soit OO ou non - nous réutilisons ce qui fonctionne et n'est pas trivial de le faire nous-mêmes. C'est du pragmatisme.

la pensée de OO comme une nouvelle façon d'obtenir à réutiliser par l'héritage est fondamentalement vicié. Comme vous le constatez, les violations de la LSP abondent. Au lieu de cela, OO est à juste titre considéré comme une méthode de gestion de la complexité d'un domaine de problème. L'objectif est la maintenabilité d'un système dans le temps. Le principal moyen d'y parvenir est de séparer l'interface publique de la mise en œuvre privée. Cela nous permet d'avoir des règles comme "ceci ne doit être modifié qu'en utilisant ..."imposée par le compilateur, plutôt que par la révision du code.

en utilisant ce, Je suis sûr que vous serez d'accord, nous permet de créer et de maintenir extrêmement complexe systèmes. Il y a beaucoup de valeur, et il n'est pas facile de le faire dans d'autres paradigmes.

32
répondu theschmitzer 2008-09-13 00:14:21

presque religieux mais je dirais que vous peignez une image trop sombre de l'état de L'OOP moderne. Je dirais qu'en fait a réduit les coûts, fait de grands projets de logiciels gérables, et ainsi de suite. Cela ne veut pas dire qu'il est résolu le problème fondamental du désordre de logiciel, et cela ne signifie pas que le développeur moyen est un expert OOP. Mais la modularisation de la fonction en composants-objets a certainement réduit la quantité de spaghetti code là-bas dans le monde.

je peux penser à des dizaines de bibliothèques sur le dessus de ma tête qui sont magnifiquement réutilisables et qui ont économisé du temps et de l'argent qui ne peut jamais être calculé.

mais dans la mesure où L'OOP a été une perte de temps, je dirais que c'est en raison du manque de formation des programmeurs, aggravé par la courbe d'apprentissage raide d'apprendre une langue OOP cartographie spécifique. Certaines personnes "obtiennent" de L'OOP et d'autres ne le feront jamais.

28
répondu user2189331 2008-08-23 14:45:23

je pense que l'utilisation d'objets de contexte opaques (HANDLEs in Win32, FILE*s in C, pour nommer deux exemples bien connus--hell, HANDLEs live de l'autre côté de la barrière du mode noyau, et il ne se trouve pas vraiment beaucoup plus encapsulé que cela) se trouve aussi dans le code de procédure; j'ai du mal à voir comment c'est quelque chose de particulier à OOP.

HANDLE s (et le reste du WinAPI) is OOP! C ne supporte pas OOP très bien, donc il n'y a pas de syntaxe particulière, mais cela ne signifie pas qu'il n'utilise pas les mêmes concepts. WinAPI est dans tous les sens du mot un cadre orienté objet.

voyez, c'est le problème avec chaque discussion impliquant OOP ou des techniques alternatives: personne n'est clair sur la définition, tout le monde parle de quelque chose d'autre et donc aucun consensus ne peut être atteint. Semble comme une perte de temps pour moi.

21
répondu Konrad Rudolph 2008-08-23 16:05:08

Sa un paradigme de programmation.. Conçus pour rendre plus facile pour nous, simples mortels, de décomposer un problème en plus petits, réalisable morceaux..

si vous ne le trouvez pas utile.. Ne l'utilisez pas, ne payez pas l'entraînement et soyez heureux.

j'ai d'autre part il est utile, donc je vais :)

14
répondu Rob Cooper 2008-08-23 15:14:09

relativement à la programmation procédurale directe, le premier principe fondamental de L'OOP est la notion de dissimulation et d'encapsulation de l'information. Cette idée conduit à la notion de la classe qui sépare l'interface de l'implémentation. Ces sont extrêmement importantes et concepts de base pour mettre en place un cadre pour réfléchir à la conception du programme d'une manière différente et mieux (je pense). Vous ne pouvez pas vraiment argumenter contre ceux propriétés - il n'y a pas de compromis fait et il est toujours une façon plus propre de moduler les choses.

D'autres aspects de la POO, y compris l'hérédité et le polymorphisme, sont également importants, mais comme d'autres l'ont mentionné, ceux-ci sont souvent sur-utilisés. ie: parfois les gens utilisent l'héritage et / ou le polymorphisme parce qu'ils peuvent, pas parce qu'ils devraient avoir. Ce sont des concepts puissants et très utiles, mais doivent être utilisés à bon escient et ne sont pas les avantages de gagner automatiquement OOP.

par rapport à la réutilisation. Je suis d'accord que la réutilisation est sur-vendue pour de l'OOP. Il s'agit d'un effet secondaire possible d'objets bien définis, typiquement de classes plus primitives/génériques et est le résultat direct des concepts d'encapsulation et de dissimulation de l'information. Il est potentiellement plus facile d'être réutilisé parce que les interfaces de classes bien définies sont tout simplement plus claires et plus ou moins auto-documentées.

14
répondu Tall Jeff 2008-08-24 12:51:08

le problème avec L'OOP est qu'il a été trop vendu.

comme Alan Kay l'a conçu à l'origine, c'était une excellente alternative à la pratique antérieure d'avoir des données brutes et des routines globales.

puis des types de gestion-consultant se sont accrochés dessus et l'ont vendu comme le Messie du logiciel, et comme lemming, le milieu universitaire et l'industrie ont dégringolé après lui.

maintenant ils sont lemming-comme tumbling après d'autres bonnes idées être surenchère, comme la programmation fonctionnelle.

alors qu'est-ce que je ferais différemment? Beaucoup, et j'ai écrit un livre à ce sujet. (Il est épuisé - je n'ai pas un cent, mais vous pouvez toujours obtenir des copies.) Amazon

ma réponse constructive est de considérer la programmation non pas comme un moyen de modeler les choses dans le monde réel, mais comme un moyen d'encoder les exigences.

qui est très différent, et est basé sur la théorie de l'information (à un niveau que tout le monde peut comprendre). Il dit que la programmation peut être considérée comme un processus de définition des langues, et la compétence à le faire est essentielle pour une bonne programmation.

il élève le concept des langues-spécifiques de domaine (DSLs). Il est tout à fait d'accord avec DRY (ne vous répétez pas). Il donne un grand coup de pouce à la génération de code. Il en résulte des logiciels avec une structure de données massivement moins que ce qui est typique pour les applications modernes.

il cherche redynamiser l'idée que la voie à suivre réside dans l'inventivité et que même les idées bien acceptées doivent être remises en question.

12
répondu Mike Dunlavey 2008-12-31 14:00:39

poignées (et le reste du WinAPI) est OOP!

sont-ils, cependant? Ils ne sont pas héritables, ils ne sont certainement pas substituables, ils manquent de classes bien définies... Je pense qu'ils sont loin de "OOP".

avez-vous déjà créé une fenêtre en utilisant WinAPI? Alors vous devez savoir que vous définissez une classe ( RegisterClass ), créez une instance de celle-ci ( CreateWindow ), appelez méthodes virtuelles ( WndProc ) et méthodes de classe de base ( DefWindowProc ) et ainsi de suite. WinAPI prend même la nomenclature de SmallTalk OOP, appelant les méthodes "messages" (Messages de fenêtre).

Les poignées

ne sont peut-être pas héréditaires, mais il y a final en Java. Ils ne manquent pas de classe, ils sont un espace réservé à la classe: C'est ce que signifie le mot "handle". En regardant des architectures comme MFC ou WinForms. net, il est tout de suite évident que à l'exception de la syntaxe, il n'y a pas grand-chose de différent du WinAPI.

11
répondu Konrad Rudolph 2008-08-23 16:42:13

Oui de la programmation orientée objet ne permet pas de résoudre tous nos problèmes, nous en sommes désolés. Nous travaillons cependant sur SOA qui résoudra tous ces problèmes.

11
répondu Nat 2008-09-17 04:59:06

OOP se prête bien à la programmation de structures informatiques internes comme les "widgets" GUI, où par exemple SelectList et TextBox peuvent être des sous-types D'Item, qui a des méthodes communes telles que "déplacer" et "redimensionner".

le problème est, 90% d'entre nous travaillent dans le monde des affaires où nous travaillons avec des concepts d'affaires tels que la facture, L'employé, le travail, la commande. Ces ne se prêtent pas si bien à L'op parce que les "objets" sont plus nébuleux, sujet à changement en fonction de la restructuration d'entreprise et ainsi de suite.

le pire cas est celui où OO est appliqué avec enthousiasme aux bases de données, y compris les" améliorations " flagrantes OO aux bases de données SQL - qui sont à juste titre ignorées sauf par les noobs de base de données qui supposent qu'ils doivent être la bonne façon de faire les choses parce qu'ils sont plus récents.

10
répondu Tony Andrews 2008-10-23 16:12:15

dans mon expérience de révision du code et de la conception des projets que j'ai traversé, la valeur de OOP n'est pas pleinement réalisé parce que beaucoup de développeurs ont pas correctement conceptualisé le modèle orienté objet dans leurs esprits. Ainsi, ils ne programment pas avec OO design, très souvent en continuant à écrire du code procédural descendant faisant des classes un joli plat design. (si vous pouvez même appeler ce "design" en premier lieu)

il est assez effrayant d'observer comment peu de collègues savent ce qu'est une classe abstraite ou une interface, et encore moins bien concevoir une hiérarchie de l'héritage pour répondre aux besoins de l'entreprise.

cependant, quand un bon design OO est présent, c'est tout simplement la joie de lire le code et de voir le code se mettre naturellement en place dans les composants intuitifs/classes. J'ai toujours perçu l'architecture et la conception des systèmes comme la conception des divers services et des emplois de personnel dans un société - tous sont là pour accomplir un certain travail dans le grand schéma des choses, émettant de la synergie nécessaire pour propulser l'organisation/système.

qui, bien sûr, est tout à fait rare malheureusement. Tout comme le rapport entre les objets physiques magnifiquement conçus et horriblement conçus dans le monde, on peut dire la même chose de l'ingénierie et de la conception logicielles. Avoir les bons outils à disposition n'est pas nécessairement communiquer les bonnes pratiques et les résultats.

10
répondu icelava 2008-12-31 02:43:30

peut-être un capot, un tour ou un arbre n'est pas une chaise mais ils sont tous ISittable.

9
répondu Johnno Nolan 2008-08-25 20:19:07

je pense que ces choses du monde réel sont des objets

c'est vrai?

quelles sont les méthodes utilisées pour établir une facture? Oh, attendez. Il ne peut pas payer lui-même, il ne peut pas s'envoyer lui-même, il ne peut pas se comparer avec les articles que le vendeur a effectivement livré. Il n'a aucune méthode; il est totalement inerte et non fonctionnel. C'est un type d'enregistrement (une structure, si vous préférez), pas un objet.

de même que l'autre choses que vous mentionnez.

ce n'est pas parce que quelque chose est réel qu'il s'agit d'un objet au sens OO du mot. Les objets OO sont un couplage particulier de l'état et du comportement qui peuvent agir de leur propre chef. Ce n'est pas quelque chose qui est abondante dans le monde réel.

8
répondu DrPizza 2008-10-02 08:31:38

j'écris du code OO depuis environ 9 ans. À part l'utilisation de messages, il m'est difficile d'imaginer une autre approche. Le principal avantage que je vois totalement en ligne avec ce que le CodingTheWheel disait: la modularisation. OO me conduit naturellement à construire mes applications à partir de composants modulaires qui ont des interfaces propres et des responsabilités claires (c'est-à-dire un code peu articulé, très cohésif avec une séparation claire des préoccupations).

je pense que là où OO pauses c'est quand les gens créent des héritarchies de classe profondément imbriquées. Cela peut conduire à la complexité. Cependant, factoriser finctionality commune dans une classe de base, puis réutiliser que dans d'autres classes de descendants est une chose profondément élégante, IMHO!

7
répondu Sean Kearon 2008-08-23 15:02:58

en premier lieu, les observations sont quelque peu négligées. Je n'ai pas de chiffres sur la productivité des logiciels, et je n'ai aucune bonne raison de croire qu'elle ne va pas augmenter. De plus, comme il y a beaucoup de gens qui abusent de L'oo, une bonne utilisation de L'OO ne provoquerait pas nécessairement une amélioration de la productivité même si L'OO était la plus grande chose depuis le beurre d'arachide. Après tout, un incompétent chirurgien du cerveau est susceptible d'être pire que rien du tout, mais compétent peut être inestimable.

cela dit, OO est une manière différente d'organiser les choses, en attachant le code de procédure aux données plutôt que de faire fonctionner le code de procédure sur les données. Cela devrait être au moins une petite victoire en soi, car il y a des cas où l'approche OO est plus naturelle. Il n'y a rien qui empêche quiconque d'écrire une API procédurale en C++, Après tout, et donc l'option de fournir des objets à la place rend le langage plus polyvalent.

plus loin, il y a quelque chose que OO fait très bien: il permet à l'ancien code pour appeler le nouveau code automatiquement, sans aucune modification. Si j'ai un code qui gère les choses d'un point de vue procédural, et que j'ajoute une nouvelle sorte de chose qui est similaire mais pas identique à une précédente, je dois changer le code de procédure. Dans un système OO, j'hérite de la fonctionnalité, Je change ce que j'aime, et le nouveau code est automatiquement utilisé en raison du polymorphisme. Cela augmente la localisation des changements, et c'est une bonne chose.

l'inconvénient est que bon OO n'est pas gratuit: il faut du temps et des efforts pour l'apprendre correctement. Depuis que c'est un mot à la Mode, Il ya beaucoup de gens et de produits qui le font mal, juste pour le plaisir de le faire. Il n'est pas plus facile de concevoir une bonne interface de classe qu'une bonne API procédurale, et il y a toutes sortes d'erreurs faciles à faire (comme les hiérarchies profondes de classe).

pensez - y comme une sorte d'outil différent, pas nécessairement meilleur en général. Un marteau en plus d'un tournevis, par exemple. Peut-être que nous allons finalement sortir de la pratique de l'ingénierie logicielle comme savoir quelle clé à utiliser pour enfoncer la vis.

7
répondu David Thornley 2008-12-31 15:24:11

@Sean

cependant, la factorisation finctionalité commune dans une classe de base, puis réutiliser que dans d'autres classes descendantes est une chose profondément élégante, IMHO!

mais les développeurs "procéduraux" font cela depuis des décennies de toute façon. La syntaxe et la terminologie peuvent différer, mais l'effet est identique. Il y a plus à OOP que "réutiliser des fonctionnalités communes dans une classe de base", et je pourrais même aller jusqu'à dire que c'est difficile à décrire comme OOP du tout; appeler la même fonction à partir de différents bits de code est une technique aussi ancienne que la sous-procédure elle-même.

6
répondu DrPizza 2008-08-23 15:08:58

@Konrad

de la programmation orientée objet peut être imparfaite et ce n'est certainement pas la panacée, mais elle rend à grande échelle des applications beaucoup plus simple, car il est un excellent moyen de réduire les dépendances

C'est le dogme. Je ne vois pas ce qui rend OOP significativement meilleur à cet égard que la programmation procédurale de l'ancien. Chaque fois que je fais un appel de procédure Je m'isole des détails de la mise en œuvre.

6
répondu DrPizza 2008-08-23 15:11:06

pour moi, il y a beaucoup de valeur dans la syntaxe OOP elle-même. Utiliser des objets qui tentent de représenter des choses réelles ou des structures de données est souvent beaucoup plus utile que d'essayer d'utiliser un tas de différentes fonctions plates (ou "flottantes") pour faire la même chose avec les mêmes données. Il y a un certain "flux" naturel vers les choses avec une bonne OOP qui fait juste plus de sens à lire, écrire, et maintenir à long terme.

peu importe qu'une facture ne soit pas "object" avec des fonctions qu'il peut exécuter lui - même-l'instance object peut exister juste pour exécuter des fonctions sur les données sans avoir à savoir quel type de données est réellement là. La fonction "de la facture.toJson () "peut être appelé avec succès sans avoir à connaître le type de données" facture " est - le résultat sera Json, peu importe si elle vient d'une base de données, XML, CSV, ou même un autre objet JSON. Avec les fonctions de procédure, vous devez tout d'un coup en savoir plus sur vos données, et se retrouver avec fonctions comme " xmlToJson()", "csvToJson ()", " dbToJson ()", etc. Il devient finalement un gâchis complet et un énorme mal de tête si vous jamais changer le type de données sous-jacentes.

le but de OOP est de cacher la mise en œuvre réelle en l'abstrayant. Pour atteindre cet objectif, vous devez créer une interface publique. Pour faciliter votre travail tout en créant cette interface publique et garder les choses sèches, vous devez utiliser des concepts comme les classes abstraites, l'héritage, le polymorphisme et le design modèle.

donc pour moi, le véritable objectif primordial de OOP est de faciliter la maintenance et les changements futurs du code. Mais même au-delà de cela, il peut vraiment simplifier les choses beaucoup lorsqu'il est fait correctement dans des façons que le code de procédure n'a jamais pu. Peu importe s'il ne correspond pas au "monde réel" - la programmation avec du code n'interagit pas avec les objets du monde réel de toute façon. OOP est juste un outil qui rend mon travail plus facile et plus rapide - je vais aller pour cela d'un jour à l'autre.

6
répondu Vance Lucas 2008-12-31 04:22:53

@CodingTheWheel

mais dans la mesure où L'OOP a été une perte de temps, je dirais que c'est en raison du manque de formation des programmeurs, aggravé par la courbe d'apprentissage raide d'apprendre une langue OOP cartographie spécifique. Certaines personnes "obtiennent" de L'OOP et d'autres ne le feront jamais.

Je ne sais pas si c'est vraiment surprenant. Je pense que les approches techniquement saines (LSP étant la chose évidente) font difficile à utiliser , mais si nous n'utilisons pas de telles approches, cela rend de toute façon le code fragile et inextensible (parce que nous ne pouvons plus le raisonner). Et je pense que les résultats contre-intuitifs que OOP nous amène à faire en sorte qu'il n'est pas surprenant que les gens ne le remarquent pas.

de manière plus significative, puisque le logiciel est déjà fondamentalement trop difficile pour les humains normaux à écrire de manière fiable et précise, devrait-on vraiment vanter une technique qui est systématiquement mal enseignée et apparaît difficile à apprendre? Si les avantages étaient clairs, alors il pourrait être utile persévérer en dépit de la difficulté, mais cela ne semble pas être le cas.

5
répondu DrPizza 2008-08-23 15:06:40

@Jeff

relativement à la programmation procédurale directe, le premier principe fondamental de L'OOP est la notion de dissimulation et d'encapsulation de l'information. Cette idée conduit à la notion de classe qui sépare l'interface de mise en œuvre.

qui a l'implémentation la plus cachée: iostream de C++, ou fichier*s de C?

je pense que l'utilisation d'objets de contexte opaque (poignées dans Win32, Fichier*s en C, pour nommer deux exemples bien connus--Hell, HANDLEs live de l'autre côté de la barrière de mode du noyau, et il ne se trouve pas vraiment beaucoup plus encapsulé que cela) se trouve aussi dans le code de procédure; je me bats pour voir comment c'est quelque chose de particulier à OOP.

je suppose que c'est peut-être une partie de la raison pour laquelle je lutte pour voir les avantages: les parties qui sont évidemment bonnes ne sont pas spécifiques à L'OOP, alors que les parties qui sont spécifiques à L'OOP ne sont pas évidemment bonnes! (ce ne pas dire qu'ils sont nécessairement mauvais, mais plutôt que je n'ai pas vu la preuve qu'ils sont largement applicables et systématiquement bénéfiques).

5
répondu DrPizza 2008-08-23 15:54:57

dans le seul Blog dev que j'ai lu, par ce Joel-on-Software-fondateur-of-SO guy, j'ai lu il y a longtemps que L'OO ne conduit pas à des augmentations de productivité. Gestion automatique de la mémoire. Cool. Qui peut nier les données?

" je crois toujours que OO est à non-OO ce que la programmation avec des fonctions est à la programmation tout en ligne.

(Et je devrais le savoir, comme j'ai commencé avec GWBasic.) Lorsque vous reformatez le code pour utiliser les fonctions, variable2654 devient variable3 de la méthode dans laquelle vous êtes. Ou, mieux encore, il a un nom que vous pouvez comprendre, et si la fonction est courte, il est appelé value et c'est suffisant pour la pleine compréhension.

lorsque le code sans fonctions devient du code avec des méthodes, vous pouvez supprimer des miles de code.

quand vous reformatez le code pour être vraiment OO, b , c , q , et Z devenir this , this , this et this . Et puisque je ne crois pas à l'utilisation du mot-clé this , vous pouvez supprimer des miles de code. En fait, vous pouvez le faire même si vous utilisez this .





Je ne pense pas que OO soit une métaphore naturelle.

je ne pense pas que la langue est d'un naturel métaphore soit, je ne je pense que les "odeurs" de Fowler sont mieux que de dire "ce code a mauvais goût."Cela dit, je pense que OO n'est pas à propos de métaphores naturelles et les gens qui pensent que les objets juste pop-out à vous manquent fondamentalement le point. vous définissez l'univers objet, et de meilleurs univers objet résultent en un code qui est plus court, plus facile à comprendre, fonctionne mieux, ou tout cela (et certains critères que j'oublie). Je pense que les gens qui utilisent le clients/domaine d'objets naturels comme des objets de programmation manquent le pouvoir de redéfinir l'univers.

par exemple, quand vous faites un système de réservation de compagnie aérienne, ce que vous appelez une réservation pourrait ne pas correspondre à une réservation juridique/d'affaires du tout.





certains des concepts de base sont des outils vraiment cool

je pense que la plupart des gens exagèrent avec ce tout "quand tu as un marteau, ce sont tous des clous." Je pense que l'autre côté de la médaille/miroir est tout aussi vrai: quand vous avez un gadget comme le polymorphisme/héritage, vous commencez à trouver des utilisations où il s'adapte comme un gant/chaussette/lentilles de contact. Les outils de OO sont très puissants. Un seul héritage est, je pense, absolument nécessaire pour les gens de ne pas se laisser emporter, mon propre logiciel multi-héritage ne résiste pas.





Quel est l'intérêt de L'OOP?

je pense que c'est une bonne façon de gérer une base de code absolument massive. Je pense qu'il vous permet d'organiser et de réorganiser votre code et vous donne un langage pour le faire (au-delà du langage de programmation dans lequel vous travaillez), et modularise le code d'une manière assez naturelle et facile à comprendre.



OOP est destiné à être mal compris par la majorité des développeurs

C'est parce que c'est un processus d'ouverture des yeux comme la vie: vous comprenez OO de plus en plus avec l'expérience, et commencer à éviter certains modèles et d'employer d'autres que vous devenez plus sage. Un des meilleurs exemples est que vous arrêtez d'utiliser l'héritage pour les classes que vous ne contrôlez pas, et préférez le façade modèle à la place.





concernant votre mini-essai / question

je voulais vous dire que vous aviez raison. La réutilisabilité est une chimère, pour la plupart. Voici une citation D'Anders Hejilsberg sur ce sujet (brillant) d'ici :

si vous demandez aux programmeurs débutants de Ecrire un contrôle de calendrier, ils souvent penser à eux-mêmes, "Oh, je vais écrire le meilleur calendrier du monde le contrôle! Ça va être polymorphe à l'égard de le genre de calendrier. Il y aura des displayers, et des mungers, et ce, qu', et de l'autre." Ils nécessité d'expédier une demande de calendrier en de deux mois. Ils ont mis tout ça l'infrastructure en place dans le contrôle, puis passer deux jours rédiger une demande de calendrier merdique sur le dessus de cela. Ils vont penser que, "Dans le la prochaine version de l'application, je suis allez faire beaucoup plus."

une fois qu'ils commencent à penser à comment ils vont en fait mettre en œuvre toutes ces autres réalisations de leur conception abstraite, cependant, il s'avère que leur conception est complètement faux. Et maintenant ils en ont peint lui-même dans un coin, et ils ont de jeter le tout chose hors. J'ai vu que plus et plus. Je suis un croyant ferme en cours de minimaliste. Sauf si vous êtes réellement allons résoudre le problème général, n'essayez pas de mettre en place un cadre pour la résolution d'un spécifique, parce que vous ne savez pas ce que cadre de devrait ressembler à comme.

5
répondu Yar 2008-12-31 17:07:30

avez-vous déjà créé une fenêtre en utilisant WinAPI?

plus de fois que je ne me souviens.

alors vous devez savoir que vous définissez une classe (RegisterClass), créez une instance (CreateWindow), appelez les méthodes virtuelles (WndProc) et les méthodes de classe de base (DefWindowProc) et ainsi de suite. WinAPI prend même la nomenclature de SmallTalk OOP, appelant les méthodes "messages" (Messages de fenêtre).

alors vous saurez aussi qu'il ne fait pas d'expédition de message de ses propres, qui est un grand vide béant. Il a aussi un sous-classement merdique.

Les poignées

ne sont peut-être pas héréditaires, mais il y a final en Java. Ils n'ont pas besoin d'une classe, ils sont une réserve pour la classe: C'est ce que le mot "gérer" signifie. En regardant des architectures comme MFC ou WinForms. net, il est tout de suite évident qu'à l'exception de la syntaxe, il n'y a pas grand chose qui diffère de le WinAPI.

ils ne sont pas héritables ni dans l'interface ni dans la mise en œuvre, peu substituables, et ils ne sont pas substantiellement différents de ce que les codeurs procéduraux ont fait depuis toujours.

C'est vraiment ça? Les meilleurs morceaux de OOP sont justes... code de procédure traditionnel? C'est le problème?

4
répondu DrPizza 2008-08-23 17:13:26

je suis entièrement d'accord avec InSciTek Jeff 's réponse, je vais juste ajouter les améliorations suivantes:

  • masquage et encapsulation de L'Information: critique pour tout code maintenable. Peut être fait en étant prudent dans n'importe quel langage de programmation, ne nécessite pas de fonctionnalités OO, mais le faire rendra votre code légèrement oo-like.
  • héritage: il y a un domaine d'application important pour lequel tous ceux OO est-une-sorte-de et contenant un les relations sont un ajustement parfait: les Interfaces Utilisateur Graphiques. Si vous essayez de construire des interfaces graphiques sans prise en charge de la langue OO, vous finirez par construire des fonctionnalités de type OO de toute façon, et c'est plus difficile et plus sujet aux erreurs sans prise en charge de la langue. Glade (récemment) et X11 Xt (historiquement) par exemple.

utiliser des caractéristiques OO (en particulier des hiérarchies abstraites profondément imbriquées), quand il n'y a pas de point, est inutile. Mais pour certains domaines d'application, il y a vraiment un point.

4
répondu Liudvikas Bukys 2017-05-23 12:25:33

je crois que le plus bénéfique pour la qualité de la programmation orientée objet est de données de masquage et de gestion. Cependant, il y a beaucoup d'exemples où L'OOP est mal utilisé et je pense que c'est là que la confusion entre en jeu.

ce n'est pas parce qu'on peut transformer quelque chose en objet qu'on doit le faire. Cependant, si le faire rendra votre code plus organisé/plus facile à lire alors vous devriez certainement.

un excellent exemple pratique où OOP est très utile est avec un " produit" classe et objets que j'utilise sur notre site web. Puisque chaque page est un produit, et chaque produit a des références à d'autres produits, il peut devenir très confus quant au produit auquel les données que vous avez se réfère. Cette variable "strURL" est-elle le lien vers la page courante, ou vers la page d'accueil, ou vers la page des statistiques? Bien sûr, vous pouvez faire toutes sortes de variables différentes qui se réfèrent à la même information, mais proCurrentPage->strURL, est beaucoup plus facile à comprendre (pour un développeur).

En outre, attacher des fonctions à ces pages est beaucoup plus propre. Je peux faire proCurrentPage - > CleanCache(); suivi de proDisplayItem->RenderPromo (); si je viens d'appeler ces fonctions et si j'avais supposé que les données actuelles étaient disponibles, qui sait quelle sorte de mal se produirait. En outre, si je devais passer les variables correctes dans ces fonctions, je suis de retour au problème d'avoir toutes sortes de variables pour les différents produits gisant autour.

au lieu de cela, en utilisant des objets, tous mes les données et les fonctions du produit sont belles et propres et faciles à comprendre.

cependant. Le gros problème avec L'OOP est quand quelqu'un croit que tout devrait être OOP. Cela crée beaucoup de problèmes. J'ai 88 tables dans ma base de données. Je n'ai que 6 cours, et peut-être que je devrais en avoir 10. Je n'ai pas besoin de 88 cours. La plupart du temps, accéder directement à ces tableaux est parfaitement compréhensible dans les circonstances où je l'utilise, et OOP serait en fait plus difficile / fastidieux d'accéder aux fonctionnalités de base de ce qui se passe.

je crois qu'un modèle hybride d'objets où utile et procédurale où pratique est la méthode la plus efficace de codage. C'est une honte que nous avons toutes ces guerres de religion où préconisent l'utilisation d'une méthode au détriment des autres. Ils sont tous les deux bons, et ils ont tous les deux leur place. La plupart du temps, les deux méthodes sont utilisées dans tous les grands projets (dans certains petits projets, une seule l'objet, ou quelques procédures peuvent être tout ce dont vous avez besoin).

4
répondu Jeff Davis 2008-09-15 21:27:39

je n'ai pas de soins pour les réutiliser autant que je le fais pour des raisons de lisibilité. Ce dernier signifie que votre code est plus facile à modifier. Ça vaut de l'or dans l'art de la création de logiciels.

et OO est un moyen sacrément efficace pour rendre vos programmes lisibles. Réutiliser ou non réutiliser.

3
répondu Frederick The Fool 2008-12-31 13:30:38

"Le monde réel n'est pas "OO","

vraiment? Mon monde est plein d'objets. J'utilise maintenant. Je pense que le fait d'avoir des "objets" logiciels qui modélisent les objets réels n'est peut-être pas une si mauvaise chose.

OO conceptions à des fins de choses (comme les Fenêtres, pas de monde réel de windows, mais les panneaux d'affichage sur mon écran d'ordinateur) laissent souvent beaucoup à désirer. Mais pour des choses comme les factures, les bons de commande, les réclamations d'assurance et ce que-pas, je pense ces choses du monde réel sont des objets. J'ai une pile sur mon bureau, donc ils doivent être réels.

2
répondu S.Lott 2008-10-01 08:08:59

le but de OOP est de donner au programmeur un autre moyen de décrire et de communiquer une solution à un problème en code aux machines et aux personnes. La partie la plus importante est la communication pour les personnes. OOP permet au programmeur de déclarer ce qu'ils signifient dans le code à travers des règles qui sont appliquées dans la langue oo.

contrairement à de nombreux arguments sur ce sujet, les concepts OOP et OO sont omniprésents dans tout le code, y compris le code EN non-OOP les langues comme C. de nombreux programmeurs avancés non-OO se rapprocheront des caractéristiques des objets, même dans les langues non-OO.

avoir construit OO dans le langage donne simplement au programmeur un autre moyen d'expression.

la plus grande partie de l'écriture de code n'est pas la communication avec la machine, cette partie est facile, la plus grande partie est la communication avec les programmeurs humains.

2
répondu Bernard Igiri 2008-12-17 23:12:32