Si quelqu'un écrit du code pour qu'une variable interne $ _fields soit accessible sans utiliser de méthodes getter / setter, existe-t-il un terme approprié pour décrire cela?
Quelque chose d'assez poli à utiliser avec la direction :)
Si quelqu'un écrit du code pour qu'une variable interne $ _fields soit accessible sans utiliser de méthodes getter / setter, existe-t-il un terme approprié pour décrire cela?
Quelque chose d'assez poli à utiliser avec la direction :)
Réponses:
Exposer ses membres privés n'est jamais une bonne chose dans une société polie ...
Cette pratique est le manque d'encapsulation / mauvaise.
private
) a encore une autre implémentation du concept d'encapsulation.
__
à nom modifié d'une autre classe ou en ignorant les conventions d'un seul préfixe de soulignement (bien que si votre getter fait un autre comportement; devrait vraiment l'utiliser pour le changement de nom). D'autres langages peuvent également avoir une mauvaise encapsulation, par exemple, la réflexion en Java et l'arithmétique des pointeurs en C ++ pour accéder aux variables privées. Python ne rend tout simplement pas la syntaxe pour le faire aussi lourde.
__
changement de nom. Sans le __
, la conception reflète toujours une bonne encapsulation. Affirmer que «public» signifie «manque / mauvaise encapsulation» est faux. Le concept est toujours présent. Le code source manque de décoration appropriée.
Outre le manque d'encapsulation déjà mentionné par Oded, en fonction du langage de programmation et de ses paradigmes, il pourrait également s'agir de "données anciennes" (où il ne s'agit pas nécessairement d'un antipattern ou d'une odeur de code).
J'ai déjà entendu le terme "objet nu".
Son appelé un sac de propriété.
Habituellement, il est utilisé pour contenir un ensemble de propriétés peut-être liées (si chacune peut potentiellement être un objet de classe qui possède ou non des spécificateurs d'accès appropriés). Mais la structure environnante n'est qu'un sac de propriétés.
Cela s'appelle "ne pas suivre une norme de codage spécifique".
L'OP a écrit:
une variable interne $ _fields est accessible sans utiliser de méthodes getter / setter
Cela pourrait être contraire à votre norme et (donc) cela pourrait être une odeur de code. Mais ce n'est pas nécessairement une mauvaise encapsulation. L'exposition d'une variable interne (comme dans "uniquement à usage interne") sur getter et setters au monde extérieur serait encore pire.
La question est: devrait $_fields
être accessible au monde extérieur?
Si c'est le cas, nous avons un cas où vous ajouteriez des méthodes getter / setter. Ces méthodes n'encapsulent rien d'autre que le fait qu'il $_fields
s'agit d'une variable quelconque (par opposition à quelque chose de calculé / récupéré / etc. à la volée). Selon la langue, vous ferez probablement toujours couler le type (aka un détail d'implémentation) vers l'extérieur. Que vous souhaitiez toujours des getters / setters, ou seulement lorsque "nécessaire" est un problème de codage standard.
Si cela ne$_fields
devrait pas être accessible, eh bien, n'y accédez pas. Si vous devez empêcher les autres d'y accéder au niveau de la langue (privé et amis) ou non (ce qui pourrait faciliter le débogage dans certaines circonstances) est - encore une fois - un problème de norme de codage.
La question de l'encapsulation est entièrement orthogonale à cela. Il est absolument possible de violer l'encapsulation avec des getters et des setters. Il est encore plus facile de s'y glisser, car la plupart des sonnettes d'alarme ne sonnent pas quand elles voient un tas de getters et de setters - un code qui semble suivre les meilleures pratiques. Code, qui pourrait très bien introduire beaucoup plus de dépendances sur les détails de l'implémentation interne qu'une variable appelée $_fields
qui ne se trouve pas être spécifiée comme private
.
Je suis fan de mauvaises analogies: appeler cette mauvaise encapsulation, c'est comme appeler un meurtrier quelqu'un qui détient une arme à feu.
J'appellerais ces variables des variables de membre public .
si vos méthodes setter / getter ne sont rien de plus
void setfoo(bar){foo=bar;}
foo getfoo{return foo;}
puis simplement faire une variable pubienne, c'est simplement sauver un peu de frappe en dehors de quelques cas marginaux où la différence est importante.