J'ai posé une question auparavant sur DataSet VS Business Objects .NET DataSet VS Objet d'entreprise : Pourquoi le débat? Pourquoi ne pas combiner les deux? p>
Et je veux généraliser la question ici: D'où vient la preuve que OOP convient vraiment à des problèmes très complexes? Prenons un moteur de jeu MMO par exemple. Je ne suis pas spécialiste du tout, mais comme je lisais cet article, il est clair que la PCO est loin d'être suffisante: p>
Il conclut:
La programmation eh bien em> avec les systèmes d'entité est très proche de la programmation avec une base de données relationnelle. Il ne serait pas déraisonnable d'appeler en Es est une forme de "programmation orientée relationnelle". P>
N'essayez pas de débarrasser quelque chose qui est là pour rester? P>
oop est non linéaire, relationnel est linéaire, les deux sont nécessaires en fonction de la partie d'un système, alors pourquoi essayer d'éliminer le rapport relationnel simplement parce que ce n'est pas "pur" objet. Est-ce que oop est une fin par lui-même? P>
Ma question n'est pas utile. OOP est utile, ma question est plutôt pourquoi les puristes veulent faire "pur" oop? p>
12 Réponses :
Les systèmes de toute complexité notable ne sont pas linéaires. Même si vous avez travaillé très fort pour faire un processus de système un système linéaire, vous comptez toujours sur des choses comme des disques, des connexions de mémoire et de réseau pouvant être squameuses, vous devez donc travailler autour de cela. P>
Je ne sais pas que quiconque pense que OOP est la réponse finale. C'est juste une façon de faire face à la complexité en essayant de garder divers problèmes confinés à la plus petite sphère possible afin que les dommages qu'ils effectuent lorsqu'ils explosent sont minimisés. Mon problème avec votre question est qu'il suppose que la perfection est possible. Si c'était le cas, je pourrais convenir de POOP n'est pas nécessaire. C'est pour moi jusqu'à ce que quelqu'un monte avec une meilleure façon pour moi de minimiser le nombre d'erreurs que je fais. P>
Toujours linéaire, je suis d'accord, ni qu'elles ne peuvent être. Les applications complexes ne sont certainement pas
Ce que nous essayons de faire est de mettre un style OO sur un système relationnel. Dans C # Land, cela nous amène un système fortement dactylographié de sorte que tout de la fin à la fin peut être compilé et testé. La base de données a du mal à être testée, refactable, etc. OOP nous permet d'organiser notre application dans des couches et des arbres montrables qui ne permettent pas. P>
Eh bien, vous avez une question théorique. P>
Tout d'abord, permettez-moi d'être d'accord avec vous que OOP n'est pas une solution de résolution. C'est bon pour quelque chose, ce n'est pas bon pour les autres. Mais cela ne veut pas dire que cela n'échappe pas. Certains systèmes horriblement complexes et énormes ont été conçus en utilisant OOP. P>
Je pense que OOP est si populaire parce qu'il mérite d'être. Cela résout certains problèmes plutôt merveilleusement, il est facile de penser en termes d'objets parce que nous pouvons le faire sans ré-programmer nous-mêmes. P>
Donc, jusqu'à ce que nous puissions tous proposer une meilleure alternative qui fonctionne dans la vie pratique, je pense que OOP est une bonne idée et donc les bases de données relationnelles. p>
La popularité n'est pas une preuve, en fait, elle peut même être comme dans le marché boursier: la majorité est fausse :) Pourquoi les gens ont-ils rendu avec EJB si longtemps sans voir qu'ils étaient pourris? Aujourd'hui, les cadres ont une telle courbe d'apprentissage escarpé selon laquelle il y a maintenant des voix comme Martin Fowler qui le dit et prétend que DSL résoudrait le problème. Ouais peut être mais c'est que DSL retourne à la programmation fonctionnelle, ce qui redresse un tuyau Unix séquentiel, donc ici, nous sommes de retour à la linéarité!
Il n'y a vraiment pas de limite à ce que OOP peut traiter - tout comme il n'y a pas de limite réelle à ce que c peut traiter ou assembler à ce sujet. Tous sont Turing-complet, ce qui est tout ce dont vous avez vraiment besoin. P>
OOP vous donne simplement un moyen de décomposition de niveau supérieur, tout comme C est un niveau supérieur à celui de l'assembleur. p>
L'article sur les systèmes d'entité ne dit pas que OO ne peut pas le faire - en fait, on dirait qu'elles utilisent OOP pour mettre en œuvre leurs entités, leurs composants, etc. dans n'importe quel domaine complexe, il y aura différentes façons de la rompre, et utiliser OOP, vous pouvez le casser au niveau objet / classe à un moment donné. Cela n'empêche pas d'avoir des cadres conceptuels de niveau supérieur qui sont utilisés pour concevoir le système OOP. P>
Le problème n'est pas l'approche orientée objet dans la plupart des situations, le problème est la performance et le développement réel du matériel sous-jacent. P>
Le développement du logiciel d'approche de la paradigme OO en nous fournissant une métaphore du monde réel, nous avons des concepts qui définissent les propriétés communes et attendues et les biens réels du monde. Est la façon dont les humains modélient les choses et sommes capables de résoudre la plupart des problèmes avec cela. P>
En théorie, vous pouvez définir tous les aspects d'un jeu, d'un système ou d'une utilisation de OO. En pratique, si vous le faites, votre programme se comportera simplement trop lentement, le paradigme est désespéré par des optimisations qui négocient la simplicité du modèle de la performance. P>
de cette façon, des bases de données relationnelles ne sont pas orientées objet, nous construisons donc une couche orientée objet entre notre code et la base de données ... En le faisant, vous avez perdu certaines des performances de la base de données et une partie de son expressivité car, de la Point de vue de OO Paradigm Une base de données relationnelle est une classe complète, est un objet très complexe qui fournit des informations. P>
De mon point de vue OO est une approche presque parfaite du sens théorique de la Parole, car elle mappe de près la façon dont nous, les humains, penser, mais cela ne convient pas aux ressources limitées du développement informatique. ... Nous prenons donc des raccourcis. A la place et la performance est beaucoup plus importante que l'organisation théorique ou la clarté afin que ces raccourcis deviennent des normes ou des pratiques habituelles. p>
C'est-à-dire que nous adaptons le modèle théorique à nos limitations actuelles. À l'époque de Cobol dans l'objet d'objet de la fin des années 70, il était tout simplement impossible ... cela impliquerait de nombreux aspects et trop peu de performances, nous avons donc utilisé une approche simplifiée, donc simplifiée que vous n'aviez pas d'objets ou de classe, vous avez eu des variables .. . Mais le concept était, à cette époque, la même chose. Groupes de variables décrites des concepts connexes, des propriétés qui seront aujourd'hui des pieds dans un objet. Séquences de contrôle basées sur une valeur variable dans laquelle il est utilisé pour remplacer les hiérarchies de classe et ainsi de suite. P>
Je pense que nous utilisons OOP depuis longtemps et que nous continuerons à l'utiliser pendant une longue période. Au fur et à mesure que les capacités matérielles améliorent, nous pourrons déplacer le modèle de sorte qu'il devienne plus adaptable. Si je décris parfaitement (presque) le concept d'un chat (qui implique beaucoup de décrire pour beaucoup de concepts impliqués), ce concept sera capable d'être réutilisé partout ... le problème ici n'est pas, comme je l'ai dit, avec le paradigme lui-même mais avec nos limitations pour la mettre en œuvre. P>
edit: strong> Pour répondre à la question de savoir pourquoi utiliser pure OO. Chaque "science" veut avoir un modèle complet pour représenter des choses. Nous avons deux modèles physiques pour décrire la nature, l'un au niveau microscopique et un pour le macroscopique, et nous voulons en avoir une seule parce que cela simplifie les choses qu'il nous fournit un meilleur moyen de prouver, de tester et de développer des choses. Avec OO le même processus s'applique. Vous ne pouvez pas tester analytiquement et prouver un système si le système ne suit pas un ensemble de règles précis. Si vous évoluez entre paradigmes dans un programme, votre programme ne peut pas être correctement analysé, il doit être malisé dans chacun, analysé puis analysé à nouveau pour voir que les interactions sont correctes. Il rend beaucoup plus difficile à comprendre un système car, en fait, vous avez deux ou trois systèmes qui interagissent de différentes manières. P>
Pourriez-vous clarifier ce que vous essayez exactement de comparer et de prouver ici? OOP est un paradigme de programmation, l'un des nombreux. Ce n'est pas parfait. Ce n'est pas une balle d'argent. P>
Que signifie "programmation orientée relationnelle"? Centric de données? Eh bien, Microsoft se dirigeait vers un style de programmation plus central de données jusqu'à ce qu'ils soient abandonnés sur Linq2SQL et entièrement concentré sur leur entité O / RMFramework. P>
Les bases de données relationnelles ne sont pas tout. Il existe de nombreux types d'architectures de base de données: bases de données hiérarchiques, bases de données réseau, bases de données d'objet ect. Et ceux-ci peuvent être encore plus efficaces que relationnels. Les relations relationnelles sont si populaires pour presque les mêmes raisons pour lesquelles le COO est si populaire: c'est simple, très facile à comprendre et le plus efficace suffisamment efficace. P>
Les gars, n'est-ce pas la question plus sur ORM que OOP? OOP est un style de programmation - la chose qui se compare réellement est une base de données relationnelle mappée sur des objets. P>
OOP est en fait plus que l'ormes! Ce n'est pas aussi pas que l'héritage et le polymorphisme! C'est une gamme extrêmement large de modèles de conception et surtout, c'est la façon dont nous pensons de la programmation elle-même. P>
Jorge: Il est correct que vous avez souligné la partie d'optimisation - ce que vous n'avez pas ajouté, c'est que cette étape devrait être faite en dernier et dans 99% de cas, la partie lente n'est pas la POO. P>
Maintenant nature et simple: le style de l'OOP avec tous les directeurs ajoutés à celui-ci (Clean Code, Utilisation de modèles de conception, non pas à des structures d'héritage profondes et n'oublions pas les tests de l'unité!) C'est un moyen de faire plus de gens de comprendre ce que vous a écrit. Cela est à son tour nécessaire pour que les entreprises maintiennent leur bussiness sécurisé. C'est aussi une réception pour les petites équipes pour mieux comprendre la communauté. C'est comme un méta-langage commun em> sur le langage de programmation lui-même. P>
D'accord Matthias. Question est posée de manière très déroutante.
Il suffit de lire l'article YR sur les systèmes d'entité, qui compare ES à OOP, et il est faux de manière flagrante de plusieurs aspects de la POO. Par ex., lorsqu'il y a 100 cas d'une classe, OOP n'indique pas qu'il y ait 100 copies des méthodes de classes chargées en mémoire, une seule est nécessaire. Tout ce que ES prétend être capable de faire "mieux" qu'OOP car il a des "composants" et des "systèmes", des supports de POO, utilisent également des interfaces et des classes statiques, (et / ou singletons). p>
et oop convient plus naturellement avec le monde réel, comme un domaine de problème réel ou imaginé, composé de multiples objets physiques et / ou non physiques et des abstractions, et les relations entre elles, peuvent être modélisées avec une édition appropriée Structure de la classe OOP. P>
Aussi avec des objets, il est beaucoup plus facile de maintenir des structures de données hiérarchiques.
Non désolé. OOP n'impose pas qu'il n'y a qu'une copie des méthodes de classe. Votre langage de choix de OOP est probablement en défaut, comme une optimisation raisonnable, mais je sais que ce n'est pas forcé: j'ai eu la même classe avec des copies différentes dans un seul processus dans plusieurs langues de l'OOP différentes. Mais, de côté ... C'est une mineure niggle, la poussée de l'article se tient.
@Adam, comme vous le surmise, le système que j'utilise uniquement des copies membres statiques et code une fois par type (classe). Mais comme OOP en général ne nécessite pas de plusieurs copies du code, tout système qui le ferait inutilement, non? - Pas parce que c'est (utiliser votre mot) mandaté par OOP. Néanmoins, je vais éditer mes commentaires de manière appropriée.
Il est toujours plus facile de parler de concepts d'un point de vue des puristes. Une fois que vous êtes confronté à un problème de vie réel, les choses deviennent plus difficiles et que le monde n'est plus simplement noir et blanc. Tout comme l'auteur de l'article est très minutieux pour souligner qu'ils sont Il n'y a pas de réponse unique, tant que vous comprenez les différentes manières (OOP, les systèmes d'entité, la programmation fonctionnelle et bien d'autres) de faire des choses et peuvent donner bonne raison pour la raison pour laquelle vous en choisissez l'un sur l'autre dans des données situation que vous êtes plus susceptible de réussir. p>
sur les systèmes d'entité. C'est une conception intéressante mais cela n'apporte rien de vraiment nouveau. Par exemple, il indique: p>
Le style OOP serait pour chaque composant d'avoir zéro ou plusieurs méthodes, qu'une chose externe doit invoquer à un moment donné. Le style ES est destiné à chaque composant de ne pas avoir de méthodes, mais plutôt que le système exécutant continuellement pour exécuter ses propres méthodes internes contre différents composants un à la fois. P> blockQuote>
Mais n'est-ce pas comme l'anti-motif de Martin Fowler appelé "modèle de domaine anémique" (qui est largement utilisé de nos jours, en fait) LINK ? P>
si fondamentalement ES est une "idée sur le papier". Pour que les gens l'acceptent, il doit être prouvé avec des exemples de code de travail. Il n'y a pas un seul mot dans l'article sur la manière de mettre en œuvre cette idée sur la pratique. Rien n'a dit de problèmes d'évolutivité. Rien n'a dit de tolérance à la faute ... p>
Quant à votre question réelle, je ne vois pas comment les systèmes d'entités décrits dans l'article peuvent être similaires aux bases de données relationnelles. Les bases de données relationnelles n'ont pas de "aspects" qui sont décrits dans l'article. En fait, la structure de données basée sur des tableaux - est très limitée lorsqu'il s'agit de travailler avec des données hiérarchiques, par exemple. Plus limité que par exemple des bases de données d'objet ... p>
Je suis d'accord avec vous sur les trucs antipattern.
comme l'auteur du poste lié, je pensais lancer dans quelques pensées. P>
FYI: J'ai commencé sérieusement (c'est-à-dire pour le travail commercial) à l'aide de OOP / ORM / UML en 1997, et cela m'a fallu environ 5 ans d'utilisation quotidienne pour y avoir vraiment bon à IMHO. J'avais été programmés dans les langues ASM et non-OOP pendant environ 5 ans à ce stade. P>
La question peut être imparfaitement formellement définie, mais je pense que c'est une bonne question à vous demander et à enquêter - une fois que vous comprenez comment la phraser mieux, vous aurez appris beaucoup de choses utiles sur la façon dont cela se bloque ensemble. p>
"Alors, n'essaie pas de se débarrasser de quelque chose qui est là pour rester?" P>
Great Réponse, je suis honoré, merci beaucoup :) En passant, je ne renvoie pas du tout OOP, je dis simplement qu'il semblerait y avoir beaucoup de choses à la mode qui sont étranges sans preuve. La programmation est-elle une science ou non? Si c'est la science, alors cela devrait être prouvé.
FWIW J'ai récemment écrit un jeu rapide N-sale pour un jeu Android - la plupart de la source se trouve dans le blog Post: t-machine.org/index.php/2010/05/09/entity-system-1-javaandro id
Point génial, homme. Félicitations pour la réponse et merci de partage.
Ironiquement lorsque la programmation OO est arrivée, il est beaucoup plus facile de construire des systèmes plus importants, cela s'est reflété dans la rampe dans le logiciel au marché. P>
En ce qui concerne l'échelle et la complexité, avec un bon design, vous pouvez créer des systèmes assez complexes. Voir DDD Eric Evans pour certains modèles de principe sur la complexité de la manipulation de OO. P>
Cependant, tous les domaines problématiques ne conviennent pas mieux à toutes les langues, si vous avez la liberté de choisir une langue, choisissez un qui convient à votre domaine de votre problème. ou construire un DSL si c'est plus approprié. P>
Nous sommes des ingénieurs logiciels après tout, à moins que quelqu'un vous dise comment faire votre travail, utilisez simplement les meilleurs outils pour le travail ou écrivez-les :) P>
Qu'entendez-vous par «Pure OOP»?
Par exemple, dire que les jeux de données sont diaboliques ou pas de SQL dans un objet.
Par jeux de données, vous voulez dire .NET FW 2.0 Dataset? Oh oui, ce sont mauvais parce qu'ils sont extrêmement mal conçus et mis en œuvre.
Les puristes veulent faire du pure oop pour la même raison qu'ils veulent toujours faire quelque chose de puriste ... ce sont des puristes. Mais c'est un peu comme insistant sur l'utilisation d'un tournevis à lames plates pour tout. Finalement, vous allez avoir besoin d'un Philips, ou d'un Torx.
Que voulez-vous dire par "linéaire"?