Dupliqué possible: strong>
Les modèles de conception sont vraiment des faiblesses de langue? p> blockQuote>Après les années de dépenser des années sur des livres sur OOP et les techniques de OOP, et récemment s'impliquer de plus en plus dans des styles fonctionnels de programmation, serait-il juste d'extrapoler que les schémas de conception sont des pointeurs à des problèmes systémiques avec une programmation orientée vers ensemble. Existe-t-il une faille fondamentale dans la programmation orientée objet (à ne pas être confondue avec la conception), dans celle du traitement de l'état par l'encapsulation, a conduit à de plus en plus de modèles pour résoudre les problèmes avec un tel paradigme. P>
Je ne suis pas venu à des conclusions à ce sujet, mais mon sentiment de «gut» est qu'il pourrait y avoir quelque chose de plus gravement faux avec le paradigme de OOP. p>
est l'idée même d'encapsulation causant davantage de problèmes que de résoudre. p>
5 Réponses :
bonne question, j'ai commencé à me demander à ce sujet mon auto quelques semaines il y a quelques semaines tout en retirant plus dans Python et Scala. P>
Je pense que oui et non. Il existe définitivement des problèmes intrinsèques avec OOP et l'encapsulation de l'état, mais il ne s'agit pas de dire que le OOP elle-même est intrinsèquement une mauvaise façon de faire des choses. Je pense que le problème est que lorsque tout ce que vous avez est un marteau, tout devient un clou. OOP est excellent pour certaines choses, les Guis nous entendent d'abord, mais la programmation fonctionnelle présente également des avantages très clairs. P>
Il est à noter que les nouvelles langages de programmation fonctionnelle comme Scala n'ont pas jeté des objets. P>
Je n'ai pas pensé à la question dans de grands détails, mais je suis certainement d'accord pour dire que l'OOP a des problèmes que je n'ai pas vus abordés, autres que sous forme de motifs de conception, qui traitent vraiment des symptômes plutôt que la maladie . P>
Je suis un avocat enthousiaste de OOP, mais de temps en temps, je pense que hmmm, il y a quelque chose là-bas mais je ne peux pas mettre mon doigt dessus. J'espère que quelqu'un signalera ce que je ne me saisis pas. J'ai assisté à une réunion la semaine dernière où ils épaissaient de manière lyrique sur le CIO et l'inversion des contenants de contrôle, j'avais le même sentiment d'intestin.
@Weeedanswers, je pense que le problème est la chasse aux "balles d'argent". Il n'y a pas de solution, juste que certaines solutions sont plus applicables que d'autres. (et le CIO n'est qu'un modèle avec OOP, et c'est peut-être l'un des moyens les plus faciles d'avoir un bon design)
Un bon design ou une solution de contournement à un problème avec le paradigme?
Je suis convaincu, ce n'est pas une solution de contournement. OOP ne parle pas de savoir comment instantiier des objets. CIO est juste un détail de mise en œuvre. Il est indiqué que si vous pouvez gérer les interactions objet, sans les objets, en prenant une partie, vous obtiendrez une application plus vaguement couplée et de meilleure qualité.
Le CIO est fondamental pour lâcher le couplage. Les techniques de collaboration de la responsabilité de la classe (CRC) vous donneront naturellement un couplage lâche dans OOA. L'utilisation d'une classe de conteneurs du CIO est beaucoup plus fondamentale à mon avis au bon code. Toutefois, si vous regardez le problème à l'aide de FOP et de FOA, tout cela concerne les transformations et la composition des fonctions qui agissent sur des données. L'analyse est différente dans les deux, mais ici, je souhaite accéder au Nub de OOP avec l'utilisation de modèles de conception, les motifs deviennent-ils une partie de la langue?
Certaines personnes croient que certains schémas devraient être des pratiques de la première classe OOP. Donc, je suppose que tout modèle de conception, qui n'est pas une solution de contournement et peut être appliqué universellement, est candidat à être incorporé dans la langue (c'est ce qui est ce qui a conduit le ressort à droite?).
S'il y a une analogie, un bon design est comme dire au programmeur », aime ce que vous faites, le reste suivra". Mais dans certains cas, l'introduction de la nouvelle terminologie \ Méthodologie nous fait revisiter l'affirmation précédente. Par exemple, lorsque nous avons commencé à utiliser RMIS, nous avons découvert que la latence de réseau est un problème et ne voulait pas de système de bavardage. Cue la façade de la session. (que je déteste au fait) .Ce est une solution de contournement simple.
Je pense qu'il y a eu une confusion au cours des deux dernières années de quels objets sont. Les composants et les services sont loin de l'époque de Corba. J'aime les composants et les services car ils ne s'appuient pas sur les paradigmes de programmation. Ou faites-ils (tuyaux, filtres, éviers, points d'extrémité, etc.)?
Je pense que les problèmes seront invariablement lorsque vous essayez d'appliquer un seul paradigme de programmation à un problème. C'est pourquoi j'aime C ++: c'est multi-paradigme; Cela ne vous oblige pas dans un seul ensemble de solutions. P>
Eh bien, c'est une mauvaise nouvelle pour les utilisateurs C # et Java, ils ont été forcés dans un paradigme bien que la langue construit la langue de la langue. Commentaire intéressant sur la langue multi-paradigme.
Vous pouvez toujours «casser» de ces langues. Par exemple, en C #, vous pouvez faire une grande classe énorme remplie de méthodes statiques si vous le souhaitez désespérément de ressembler davantage à C.
Non, je pense que si vous allez utiliser une de ces langues, je pense que vous devez jouer aux forces de la langue. C # et Java sont d'excellentes langues à la plupart des regards. Mais de temps en temps ...... Il y a quelque chose qui n'est pas tout à fait raison. Je n'ai jamais eu ces mêmes problèmes lors de l'utilisation de Delphi, maybe sa signature de fois plus simple ou que vous signalez correctement le multi-paradigme est utile.
Je n'ai pas dit de casser la langue était une bonne idée, juste que c'est possible.
Une très bonne question et quelque chose que j'ai pensé il y a quelque temps. Ceci est ma conclusion \ avis: p>
L'idée de la programmation orientée objet n'est pas sans défauts, mais fournit le paradigme de design le plus complet. Si le domaine problématique est exprimé correctement, un objet clairement défini, qui connaît leurs responsabilités, peut interagir de manière assez élégante, qui ressemble étroitement à l'interaction du monde réel des objets. (ou des idées). P> li>
Pour faire partie des concepts les plus abstraits, spécifiques, OOP fait quelques déclarations assertives. (Comme l'encapsulation, n'exposant pas plus que ce que vous n'avez à la responsabilité et à l'objet de la responsabilité). P> LI>
Comme toutes les hypothèses génériques, il y aurait des exceptions, lorsque ce serait normalement une bonne idée, peut ne pas correspondre à un problème particulier à la main. Il n'est également pas aidé par le fait que OOP, couvre presque tous les problèmes conçus (contrairement à l'AOP ou même à la modélisation sémantique plus complexe, qui s'adresse à un type de problème spécifique). P> Li>
Donc, dans les situations, lorsque vous devez faire des exceptions et éloignez-vous des affirmations de la POOP, les concepteurs avaient besoin d'un moyen de rester dans les limites de bon design, de sorte qu'ils ne se négligent pas trop loin des pratiques de conception acceptées. p> li>
Des modèles de conception, pour moi, ce n'est que des études de cas de problèmes, qui ne seront pas signifiées par une partie de l'affirmation centrale de OOP. En dehors de la collaboration et de la collation de solution, le motif de conception aide également à augmenter le POOP. (surtout pour les concepteurs de débutants). P> li> ol>
Remarque: la plupart du temps, des modèles de conception ne sont pas nécessaires. Il doit être clairement justifié d'utiliser des motifs. Je sais, des Greenhorns, essayant de mettre en œuvre un modèle de conception, juste parce qu'ils les connaissent (et parfois pas si verts-verres;)). Sa cheville carrée, problème de trous ronds p>
Bonne réponse. J'aimerais souligner que je suis un avocat enthousiaste de OOP et de OOA surtout. Certains des motifs sont devenus des pièces de base à la langue. Par exemple, des préoccupations transversales. Si le motif est utilisé dans chaque application, il faut donc de devenir une tradition de la langue et d'intégrer davantage?
Un bon exemple en tant que personne postée ci-dessus d'un autre poste est l'utilisation d'événements en C #, en fonction du modèle d'observateur.
N'avons-nous pas la même discussion @Mattis Commenter le thread? MDR. Quoi qu'il en soit, je suis d'accord avec vous à ce sujet. Certaines personnes croient que certains schémas devraient être des pratiques de la première classe OOP. Donc, je suppose que tout modèle de conception, qui n'est pas une solution de contournement et peut être appliqué universellement, est candidat à être incorporé dans la langue (c'est ce qui est ce qui a conduit le ressort à droite?).
Il y a beaucoup de frameworks, de nouveaux livres, de nouveaux designs, de nouveaux Messies qui crient leurs solutions de la chaire. Je viens d'avoir le sentiment que s'il y a tellement de problèmes qui doivent être résolus en "boulonnant" un ajout au noyau "avec les batteries" de la langue, y a-t-il quelque chose de fondamentalement faux avec la prémisse originale de OOP. Beaucoup de problèmes sont si fondamentaux pour un bon design que celui-ci devient plus difficile et plus difficile de fournir des solutions avec uniquement les cadres principaux (C #, Java).
non. Bien que vous voyiez légèrement différents modèles de conception em>, vous voyez certainement toujours des motifs de conception dans le code fonctionnel. La différence de base a peu (si quelque chose) à faire avec le manque d'état. Au contraire, il provient principalement de (la plupart) langues fonctionnelles offrant suffisamment de plus de polyvalence dans la création de fonctions qui seraient un "modèle de conception" dans une autre langue deviennent simplement une fonction dans une langue fonctionnelle. P>
Si vous fournissez un niveau de polyvalence (grossièrement) similaire dans une langue qui a l'état, vous pouvez obtenir le même effet. Juste par exemple, la majeure partie de l'introduction à moderne C ++ Conception EM> est en défense la position selon laquelle un modèle de conception peut être codé sous forme de modèle (et la plupart du livre sont des modèles de conception implémentés comme des modèles). P >
Belle réponse, me conduit à penser qu'il y a un problème avec OOP.
@Weeedanswers: Le problème n'est pas avec OOP. Le problème est avec les langues.
Comme dans la mise en œuvre du POO ou du manque de soutien multi-paradigmes?
@Weeedanswers: Je ne suis pas sûr qu'il tombe vraiment dans l'une ou l'autre catégorie.
Pouvez-vous me donner une catégorie, peut-être que c'est la chose que je manque. :)
Donc, si toutes les langues avaient les fonctions de modèles de C ++, cela rendrait-il des modèles redondants ou utiliserait toujours des modèles de conception, mais sous une autre forme?
Les modèles suffisent pour certains modèles, mais pas d'autres. Même une version "élargie" qui a suffi à des modèles de conception plus actuelles conduirait simplement à nos habitudes de reconnaissance qui se produisent d'une échelle encore plus grande.
Donc, tout ce qui est défini dans la pierre dans un langage de programmation pourrait être considéré comme un programmeur principal C ++ comme sucre. Le problème que je trouve avec C ++ est cette liberté très, et l'abus de celui-ci, par des programmeurs très moyens. Lorsque Java et plus tard C # sont venus sur la scène, j'aimais l'idée qu'il n'y avait que tant de places qu'un programmeur avait les libertés de faire ce qu'ils voulaient. Je pense que ce manque de liberté pourrait être étouffant. Est-ce la vérité non grassible?
Je répète une théorie de base de la mienne, mais les modèles ne sont que des modèles seulement. Le modèle défini par OOP est un moyen très efficace de structurer un programme et de nombreux domaines de programmation d'application, est tout à fait approprié. Pour certains espaces problématiques, le modèle peut devenir diminué de manière dimininante (ou moins efficace, ou les deux). p>
Une métaphore potentielle existe avec la physique. Pour de nombreuses années, la physique des Newtones a fait (et en fait) un travail remarquable de modélisation des lois du mouvement, du temps et de l'espace (avec une aide de l'euclidian et de la géométrie spésitive). Mais lorsque la science a commencé à rechercher les aspects micro-macro et macro de l'espace problématique, la physique de Newtonian (et la géométrie euclidian / sphérique) commence à décomposer. Par conséquent, nous avons maintenant la relativité et la mécanique de la quanhat. Celles-ci font un travail fantastique de modélisation de l'univers sur les niveaux macro et micro, mais sont trop compliqués pour une utilisation en tant que descripteurs de chaque jour, à l'échelle humaine. p>
OOP est très efficace pour la programmation d'applications dans de nombreux cas, lorsqu'elle est considérée dans le contexte de la complexité impliquée dans la modélisation des problèmes du monde réel et des interactions humaines pour la consommation et la transformation par une machine linéaire. En tant que personne ci-dessus observée, il n'y a pas de balles d'argent. Et mon impression (n'ayant jamais utilisé C ++), c'est que les langues qui tentent d'être multi-paradigmes deviennent également plus complexes, et pas nécessairement aussi efficaces pour des problèmes plus faibles plus facilement gérés avec une langue plus grande et plus ciblée. Tout comme les théories de la mécanique et / ou de la relativité (je veux dire, est-ce que toute personne s'intéresse à la relation entre la masse et la vélocité lorsque vous voyagez à 60 mph sur l'autoroute? Ou la probabilité de Los Angeles étant où vous vous attendez à ce que ce soit à votre arrivée. ?). P>
Dans mon impression, l'adhésion au modèle spécifique à QA est important, tant que le modèle est adapté à l'espace problématique. Au moment où cela cesse d'être vrai, le modèle peut avoir besoin d'évoluer et il y aura une résistance à cela. Il y aura des tentatives pour forcer l'espace de problème dans un modèle ne convient pas (revoir l'histoire de la physique à nouveau, ou vérifier dans l'évolution du modèle héliocentrique du système solaire, et inclure le mot-clé « épicycles »). p>
Tous les ci-dessus est tout simplement de mon mieux comprendre l'état des choses, et si je l'ai manqué la part de la marque, je suis heureux d'entendre des nouvelles contraires. p>
En référence à mon commentaire C ++, j'utilise "efficace" en ce sens qu'un langage de niveau supérieur mon être utilisé plus facilement pour résoudre le problème, et non que c # ou VB va être plus efficace en termes de performance. En outre, bien sûr, on est plus efficace dans la langue avec laquelle on est familier. Mais à partir du peu que je connaisse de C ++, appliquer pour résoudre les problèmes d'entreprise quotidiens auxquels sont confrontés les services informatiques de taille moyenne dans les environnements d'entreprise seraient surchargés (par exemple).
Je pense qu'il devrait y avoir une certaine séparation de OOA et de OOP. Je suis d'accord OOA n'a pas laissé tomber, jamais. Venez à cela ni OOP avec une connaissance des schémas. Mais ici, il s'agit, il semble y avoir une liste de schémas de croissance toujours croissante, et j'ajouterais que si un tiers de ces schémas sont essentiels à la fabrication de la tâche de l'OOP, y a-t-il une faille avec OOP. Si oui, pouvons-nous avoir une poignée dessus. Si nous savons ce que la faille est, alors tous les modèles se résoudront peut-être une nouvelle langue, un nouveau paradigme, etc.
Je pense que les modèles de conception sont des moyens d'exprimer une manière incroyablement utile d'exprimer la mise en œuvre de OOP pour une situation particulière. Si vous envisagez d'être analogue à la géométrie, les principes fondamentaux de OOP seraient analogues aux axiomes et aux postulats de cette discipline. Et des motifs de conception peuvent être analogues aux différents théorèmes par lesquels le reste de la structure géométrique est dérivé. Notez que cette analogie tient même pour ces endroits dans lesquels une géométrie particulière échoue.Classic Euclidian Geometry, fonctionne très bien, jusqu'à ce que l'on rencontre une surface sphérique.
. . . A quel point, le modèle commence à échouer. Bien que vous puissiez forcer les règles de la géométrie euclidienne à se rapprocher de ces mêmes formes sur une surface ronde, le modèle est finalement sorti des endroits où aller, et plutôt un nouveau modèle quelque peu spécialisé est nécessaire. Il faut ré-définir la nature d'une ligne droite lors de l'application du concept à une surface sphérique.
Je considère que les modèles de conception sont l'expression d'OOP pour un ensemble particulier de circonstances. Vous remarquerez qu'il y a des Pattersn utilisées assez fréquemment et ceux qui n'élevent que la tête de temps en temps. Mais l'évolution des nouveaux schémas, pour moi, n'indique pas une faille dans l'OOP en tant que pratique. Seulement qu'il existe une multitude d'espaces problématiques, pour lesquels quelqu'un, quelque part, ressent la nécessité de définir un nouveau modèle comme solution. Des modèles de décoration peuvent également être assimilés à des équations. Il existe de nombreuses façons d'exprimer la plupart des fonctions, mais il y a généralement un qui est le plus simple.
Voir Stackoverflow.com/Questtions/1579162/... .
Existe-t-il aucun modèle qui sont suivis lors de la programmation avec des langues fonctionnelles? Je pense qu'il n'ya pas de même niveau d'effort de reconnaissance et de documentation. Mon expérience avec le codage utilisant des langues fonctionnelles est que je me trouve à la création des mêmes types de fonctions générales. C'est une question intéressante - en tant que OOP, il n'y a certainement pas été plus longuement que fp. Les modèles de FP sont peut-être assez simples qu'ils semblent un sens commun / inévitable et ne sont donc pas documentés au même degré?
Tout suit un motif que je suis d'accord, mais ils forment généralement une base à la langue. Les modèles de conception sont différents en ce qu'ils forment autour de la langue mais pas dans la conception de la langue elle-même.
blog.adaptsoftware.biz/2009/08/ ... belle présentation. Pense que je suis d'accord avec lui
Dans les langages fonctionnels, vous avez besoin d'un modèle incompréhensible uniquement pour mettre en œuvre un algorithme exprimé à l'aide de la ramification conditionnelle et de l'affectation aux variables.