Mouais. Peut-être.
Je sens quand même un poil de mauvaise foi, ou peut être une indication de dissonance cognitive (va savoir ; je pencherais presque pour le second, tant il me parait plus honnête que le premier).
En quoi un accès à conséquences multiple à une unique entité est plus explicite qu'un accès à conséquence unique à de multiples entités ? En quoi est-ce différent du raisonnement humain de dire que resize() change la taille telle que donnée par size() ?
A mon avis, mais je peux me tromper, tu confonds simplicité et simplisme.
On se fait un petit plaisir, ne parlons pas de performance. Il n'y a de toute façon pas de différence majeure en termes de performance entre l'appel explicite d'un mutateur et l'appel implicite de celui ci via l'utilisation d'une propriété. C'est dans les deux cas le compilateur qui fait le sale boulot d'optimisation, quitte à aller jusqu'à l'inlining complet de l'appel.
Je ne suis pas vraiment d'accord avec toi en ce qui concerne les qualités des propriétés au niveau de l'interface publique d'une classe. La "centralisation" (je pense que je vois ce que tu veux dire) n'est pas un but en soi. Parmi les buts qu'on se doit d'essayer d'atteindre lors de la définition d'une interface, citons la cohérence, la lisibilité, et l'expressivité. D'autres buts sont bien évidemment à atteindre. La centralisation telle que tu la présente a des effets plus ou moins néfaste sur certains de ces buts.
- lisibilité : une propriété représente quelque chose d'intrinsèque à l'objet. Hors le principe même de la programmation orientée objet, c'est de cacher les données intrinsèque et de déterminer les traitements (qui vont être décrit sous forme de méthodes) que peut subir cet objet - dans le cadre de la résolution d'un problème défini. Il est beaucoup plus aisé pour nous de réfléchir en termes d'actions qu'en terme de définition (sinon les maths seraient facile pour tout le monde ; la dernière fois que j'ai vérifié, ça n'était pas le cas). Un programme est une suite de traitement - ce n'est pas une collection de donnée. Mélanger définition et traitement dans une même section de code rends le code plus difficile à déchiffrer.
- expressivité : une fonction fait une chose unique (dans l'idéal). Une propriété peut être accédée de manière différente (par exemple en lecture et en écriture). Elle fait donc plus de chose, mais est décrite avec un nom unique. L'utilisation d'un nom unique réduit d'autant l'expressivité de ce nom - par rapport à l'utilisation de plusieurs noms différents, chacun lié à une action particulière.
On peut argumenter sur le fait que les propriétés ne servent à rien. Dans l'ideal, il devrait être possible d'écrire un programme sans accesseurs et sans mutateurs, et donc sans propriétés. Un conteneur n'a pas besoin d'avoir une propriété Size si je peux utiliser les algorithmes du conteneur (par exemple une méthode foreach(), ...).
Ne te méprends pas : cet argument est volontairement idéaliste (et prends comme point de départ une application vertueuse de la loi de Demeter) - il n'a pas pour but de passer le test de la pratique (en tout cas, pas de ta pratique ; je pense que je peux y arriver, en tout cas pour certains problèmes simples, tout en respectant MON style de programmation). En fait, dans le projet que je réalise actuellement pour le compte d'un client, les seuls accesseurs présents sont utilisé dans les tests unitaires (pour vérifier que (par exemple) les séquences d'initialisation se passent correctement). Un seul est utilisé dans le code réel de l'application - dans le contexte de la récupération de valeurs lue dans un fichier de configuration au format XML. Le projet n'est pas vraiment de taille mirobolante, mais c'est quand même un projet pro, avec les contraintes liées à ce type de projet.
Partager