Dans l' une des nombreuses déclarations anti-OOP sur cat-v.org, j'ai trouvé un passage de Joe Armstrong soulevant plusieurs objections contre le modèle OOP, dont l'une était la suivante:
Objection 4 - Les objets ont un état privé
L'État est la racine de tout mal. En particulier, les fonctions ayant des effets secondaires doivent être évitées.
Alors que l'état dans les langages de programmation n'est pas souhaitable, dans le monde réel, l'état abonde. Je suis très intéressé par l'état de mon compte bancaire et lorsque je dépose ou retire de l'argent de ma banque, je m'attends à ce que l'état de mon compte bancaire soit correctement mis à jour.
Étant donné que l'État existe dans le monde réel, quelles installations le langage de programmation devrait-il prévoir pour traiter avec l'État?
Les OOPL disent «cacher l'état au programmeur». Les états sont masqués et visibles uniquement via les fonctions d'accès. Les langages de programmation conventionnels (C, Pascal) disent que la visibilité des variables d'état est contrôlée par les règles de portée du langage. Les langages déclaratifs purs disent qu'il n'y a pas d'État. L'état global du système est appliqué à toutes les fonctions et ressort de toutes les fonctions. Des mécanismes comme les monades (pour les FPL) et les DCG (langages logiques) sont utilisés pour cacher l'état au programmeur afin qu'ils puissent programmer «comme si l'état n'avait pas d'importance» mais avoir un accès complet à l'état du système si cela était nécessaire.
L'option «cacher l'état au programmeur» choisie par les OOPL est le pire choix possible. Au lieu de révéler l'État et d'essayer de trouver des moyens de minimiser les nuisances de l'État, ils le cachent.
Qu'entend-on exactement par cela? J'ai très peu d'expérience de bas niveau ou de procédure, principalement OOP, ce qui explique probablement à quel point je ne suis pas familier avec cela. Et d'un point de vue plus moderne, maintenant que la plupart de l'hystérie orientée objet est passée (du moins pour autant que je sache), à quel point pensez-vous que ce passage est précis / pertinent?
Merci de votre aide.
Réponses:
Dans ce contexte, cela signifie que la POO obscurcit l'état d'un programme en le cachant du programmeur tout en le rendant visible via des méthodes d'accesseur (qui fuient). L'argument est qu'en obscurcissant l'état, il est plus difficile de travailler avec et, par extension, conduit à plus de bogues.
Je pense que c'est pertinent, mais mal orienté. Il y a absolument un problème si votre classe divulgue le concept de son état au monde extérieur. Il y a absolument un problème si votre classe essaie d'obscurcir l'état alors qu'il devrait être manipulé par le monde extérieur. Ce n'est cependant pas un défaut de la POO dans son ensemble, mais avec la conception individuelle de la classe. Je ne dirais pas que cacher l'état lui-même est un problème - les monades le font tout le temps dans la programmation fonctionnelle.
Dans le meilleur des cas, la POO fonctionne comme le meilleur mélange de programmation fonctionnelle et procédurale - les gens peuvent utiliser la classe "comme si l'état n'avait pas d'importance" parce que l'état privé utilisé pour protéger les invariants de la classe est caché, mais a la liberté utiliser un état public bien défini de la classe qui résume les détails.
Est-ce que la POO rend plus difficile pour les gens d'atteindre ce meilleur des cas? Peut-être. Les «écoles Java» et toute l'école Shape / Circle / Rectangle ou Car has Wheels de l'enseignement de l'OO ont probablement plus à blâmer que l'approche elle-même. La POO moderne prend un peu de la programmation fonctionnelle, encourageant les objets immuables et les fonctions pures tout en décourageant l'héritage pour faciliter la conception de classes qui fonctionnent bien.
la source
Raisonner sur un système sera difficile s'il y a des morceaux d'état mutable qui n'ont pas de "propriétaire" clair et unique. Cela ne signifie pas que les objets ne doivent jamais avoir d'état mutable, mais plutôt que les objets qui ont un état mutable ne doivent pas être utilisés de manière à ce que la propriété ne soit pas claire, et inversement, les objets qui devront être librement transmis sans suivre la propriété devraient être immuable.
En pratique, une programmation efficace nécessite fréquemment que certains objets aient un état mutable; toutefois, cet état doit être limité aux objets de travail non partagés . Considérez les interfaces
IEnumerable
/IEnumerator
dans .NET: si une collection implémenteIEnumerable
, elle permettra aux éléments d'être lus un à la fois. Le processus réel de lecture d'une collection nécessitera souvent de garder une trace des éléments qui ont été lus (un morceau d'état mutable), mais cet état n'est pas contenu dans une implémentation deIEnumerable
. Au lieu de cela,IEnumerable
fournit une méthode appeléeGetEnumerator
qui retournera un objet qui implémenteIEnumerator
et contient suffisamment d'état pour permettre aux éléments d'être lus à partir de la collection. Le fait que l'objet contienne un tel état ne posera cependant aucun problème,si l'implémentation d'objetIEnumerator
n'est pas partagée .Le meilleur modèle dans la plupart des cas est d'utiliser un mélange d'objets qui sont librement partagés mais ne seront jamais modifiés (du moins pas après qu'ils ont été partagés), et d'objets qui ont un propriétaire clair, et peuvent être librement modifiés par ce propriétaire , mais ne sont jamais partagées avec personne.
la source
Au risque d'aller au-delà de la réponse à la question, il est facile de voir les failles dans l'idée de POO, mais je suis enclin à penser que le pouvoir d'une idée se reflète dans sa capacité à être abusée.
Après tout, tout le monde a sa langue préférée, qu'il décrit en termes comme "très très puissant", ce qui signifie qu'il l' aime vraiment beaucoup . Mais la merveille de l'universalité informatique est que, quelle que soit la splendeur d'un langage, s'il est vraiment puissant, il peut simuler un langage d'assemblage. Et si c'est possible, quelqu'un verra que c'est le cas. (Pas qu'il y ait quelque chose de mal avec le langage d'assemblage.)
Mon sentiment personnel à propos de la tendance OOP est qu'il représente un retard de l'éducation des gens en génie logiciel / informatique. Ils sont rabougris à un niveau où ils pensent que tout est une question de structure de données. Classes, héritage, conteneurs, itérateurs, cartes de hachage, propriétés, masquage d'état , etc. - tout sur la structure des données - plus on est de fous.
Personnellement, j'aimerais voir un niveau supérieur où les gens apprendraient à résoudre des problèmes en les regardant linguistiquement. Où ils comprendraient le concept de langages spécifiques à un domaine, comment les fabriquer facilement et laisser leur création faire partie intégrante de la résolution de problèmes. Il n'est pas faux de dire qu'une structure de données est un langage. Les gens devraient avoir cette compétence de conception de langage, de sorte qu'ils ne se contentent pas de la traverser.
Ensuite, en tant que niveau supérieur, je voudrais revigorer l'intelligence artificielle. Je voudrais voir les programmeurs aller au-delà des octets et des threads et des tables de fonctions virtuelles et des CUDA et expliquer comment amener les machines à raisonner, apprendre et créer. Je sais que cela a avancé très loin dans les petits coins du champ, mais loin d'être assez largement.
la source
powerful
là. Quand d'autres disentpowerful
, ils parlent de la façon dont cela permet aux programmeurs d'abstraire , ce qui est une histoire différente de la puissance de calcul .power
signifient des choses différentes. Veuillez ne pas induire en erreur.L'accessibilité n'est pas une fonctionnalité de la POO, elle est spécifique aux implémentations telles que Java et Microsoft dotNET. La principale caractéristique qui définit la POO est le polymorphisme.
Quoi qu'il en soit, en masquant l'état de l'objet, il n'y a aucun moyen de créer une API significative. La présentation est une composante vitale de la POO dans le monde réel. Ceux qui ne sont pas d'accord ont probablement une hostilité irrationnelle envers l'industrie du logiciel, ce qui rend leur opinion non pertinente de mon point de vue.
Les sites Web comme celui que vous avez lié sont connus pour leurs réflexions et critiques extrêmement rigides sur les nouvelles technologies. Certaines personnes ne comprennent tout simplement pas.
la source