Qu'entend-on par «OOP cache l'État»? [fermé]

11

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.

Jake
la source
3
lecture recommandée: Discutez de ce $ {blog}
gnat
1
Si vous me demandez, l'article auquel vous avez lié fait quelques arguments assez pauvres (sans parler de la qualité de l'écriture). Je ne mettrais pas trop de stock dans ce qu'il a à dire.
Benjamin Hodgson
1
Bah. De plus en plus, je pense que toute cette chose "immuable" est une bonne idée qui commence à puer la religion.
Rob
3
Joe Armstrong a publiquement reconnu que ses objections contre OO étaient basées sur de graves malentendus sur ce qu'est exactement OO. Il a maintenant réalisé qu'Erlang est en fait un langage profondément orienté objet (en fait, il pourrait être le langage le plus orienté objet utilisé dans le courant dominant).
Jörg W Mittag
9
Pour approfondir cela: la première capture d'archive.org de la diatribe de Joe Armstrong date d'avril 2001. Joe a écrit sa thèse en 2003. Au cours de la rédaction de sa thèse, il a beaucoup appris sur OO, et il s'est rendu compte qu'il était devenu la proie du idée fausse commune que l'OO était en quelque sorte liée à un état mutable (ce n'est pas le cas, l'état mutable est complètement orthogonal). Depuis lors, il a reconnu que sa critique de OO était erronée et qu'ironiquement Erlang est en fait un langage orienté objet (il a des messages, il a des objets qu'il appelle des processus, il a une encapsulation).
Jörg W Mittag

Réponses:

32

Qu'entend-on exactement par cela?

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.

Dans quelle mesure pensez-vous que ce passage est précis / pertinent?

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.

Telastyn
la source
3
D'accord de tout coeur sur tout le bit "écoles de java", n'aime pas du tout ça heh. Merci beaucoup, je voterais si je le pouvais.
Jake
2
Juste pour être précis: les monades en général ne cachent pas l'état, certaines monades le font (par exemple IO). Voir entre autres stackoverflow.com/questions/2488646/…
thSoft
2
+1. Il s'agit d'une analyse beaucoup plus équilibrée et nuancée que l'article que le questionneur a lié
Benjamin Hodgson
2
Joe Armstrong a publiquement reconnu que ses objections contre OO étaient basées sur de graves malentendus sur ce qu'est exactement OO. Il a maintenant réalisé qu'Erlang est en fait un langage profondément orienté objet (en fait, il pourrait être le langage le plus orienté objet utilisé dans le courant dominant).
Jörg W Mittag
2
Jorg - pourriez-vous publier un lien vers le suivi de Joe? Je serais vraiment intéressé à le lire. Et @radarbob, tout de suite!
user949300
2

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/ IEnumeratordans .NET: si une collection implémente IEnumerable, 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 de IEnumerable. Au lieu de cela, IEnumerablefournit une méthode appelée GetEnumeratorqui retournera un objet qui implémente IEnumeratoret 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'objet IEnumeratorn'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.

supercat
la source
Excellente distinction entre ce qui doit être immuable et ce qui peut avoir un état mutable. En lisant ceci, je me suis rendu compte que mes graphiques d'objets les plus récents (plus immuables qu'ils ne l'étaient auparavant) suivent essentiellement cette directive sans l'avoir énoncée aussi clairement que vous. Il s'agit d'un bon antidote modéré au bain de bouche «l'état mutable est toujours mauvais» que vous entendez parfois.
Mike prend en charge Monica
@Mike: Je pense que le vrai problème est que toutes les références d'objet en Java et .NET sont entièrement promiscuous; tout code qui acquiert ou reçoit une référence à un objet peut le partager avec tout autre code, sans restriction. Aucun des deux cadres n'a de concept de champ de référence non partageable; Les structures et byrefs dans .NET se rapprochent, mais ils sont plutôt limités en termes de ce qu'ils peuvent faire ou ce qu'ils peuvent empêcher le code extérieur de faire. Dans tous les cas, je proposerais un dicton fondamental en ce qui concerne l'état mutable: à 12h57, un objet peut représenter simultanément ...
supercat
... l'état actuel d'un objet du monde réel, et l'état de l'objet à 12h57. Si l'état réel de l'objet change, il ne sera plus possible pour un objet de représenter les deux. Parfois, il sera nécessaire que l'objet continue de représenter l'état de 12 h 57, et parfois l'état actuel. Cependant, la relation entre l'état de 12 h 57 et l'état actuel ne peut pas rester si l'état actuel change.
supercat
0

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.

Mike Dunlavey
la source
1
"S'il est vraiment puissant, il peut simuler le langage d'assemblage" - vous permutez la définition de powerfullà. Quand d'autres disent powerful, 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 .
Phil
@Phil: résumé est un autre de ces mots :)
Mike Dunlavey
Non. Vous parliez de mots. Je parlais d'idées. Votre 2e et 3e utilisation du mot powersignifient des choses différentes. Veuillez ne pas induire en erreur.
Phil
Btw, si vous êtes intéressé, consultez Racket , qui est quelque peu proche de l'approche que vous dites dans votre 4ème paragraphe (permettant aux programmeurs d'amener la langue au niveau de leur problème au lieu de les amener à résoudre le problème ensemble fixe de constructions du langage). Cela va bien au-delà du Lisp / Scheme classique, juste au cas où quelqu'un aurait cette impression en le regardant pour la première fois.
Phil
0

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.

Léopold Asperger
la source
Un objet doit exister pour protéger les invariants du concept qu'il modélise. La présentation est une préoccupation entièrement distincte et ne peut pas être gérée de manière efficace et maintenable par le même objet, car un objet ne peut pas comprendre toutes les différentes façons dont il pourrait être présenté dans le temps et l'espace. La présentation doit être gérée par un autre mécanisme tel que le streaming d'événements et les vues matérialisées si votre objectif est des objets polyvalents et maintenables. Le seul moment où un objet doit changer, c'est si son concept est révisé ou si ses invariants changent.
Andrew Larsson du