Y a-t-il un terme utilisé lorsque les variables internes sont déclarées publiques et accessibles?

10

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 :)

PeterB
la source
9
Manque d'encapsulation?
Odé
@Oded Je pense que vous avez raison - le manque / l'encapsulation médiocre le décrit bien
PeterB
Les deux phrases auxquelles j'ai pensé en essayant de répondre à cette question étaient «abstraction qui fuit» et «cadrage lâche» - à quoi chacune d'elles fait-elle référence (en dehors de ma tête)?
PeterB
1
L'abstraction qui fuit, c'est lorsque vous essayez d'abstraire un concept, mais cela ne fonctionne pas vraiment - les concepts sous-jacents continuent de fuir (les ORM sur SQL et les cadres Web sur HTTP / HTML ont tendance à être des abstractions qui fuient).
Oded
@PeterB - pour ajouter à l'explication d'Oded, voir ceci: joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans

Réponses:

30

Exposer ses membres privés n'est jamais une bonne chose dans une société polie ...

Cette pratique est le manque d'encapsulation / mauvaise.

Oded
la source
6
+1, Eh bien, vous ne sortiriez pas vos soldats au bureau, n'est-ce pas?
StuperUser
6
-1: L'encapsulation s'est vraiment produite et s'est bien passée. Mais cela n'a pas été documenté par le code source de la manière généralement acceptée. Certains langages (comme Python) manquent de variables vraiment privées, mais pratiquent toujours l'encapsulation.
S.Lott
6
@Oded: l'encapsulation est un concept de conception . Différentes langues ont différentes implémentations du concept. Un langage avec une déclaration privée permet une mise en œuvre. Un langage de programmation fonctionnel avec des objets sans état peut avoir une implémentation différente. Python (qui manque private) a encore une autre implémentation du concept d'encapsulation.
S.Lott
1
@S Lott; Oded - L'encapsulation est bonne et s'appuyer sur du code où les variables privées sont fréquemment directement accessibles à partir d'autres classes est une mauvaise encapsulation. En python, vous faites cela en accédant aux variables privées __à 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.
dr jimbob
2
@drjimbob: Le code Python utilise rarement le __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.
S.Lott
10

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).

Joris Timmermans
la source
4

J'ai déjà entendu le terme "objet nu".

Raku
la source
1
C'est certainement une façon déroutante de nommer ceux qui envisagent le modèle des objets nus
Matthieu
1
Ouais, ça m'a aussi troublé.
Raku
2

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.

Martin York
la source
2

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 $_fieldss'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 $_fieldsqui 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.

rwos
la source
1

J'appellerais ces variables des variables de membre public .

Olivier Jacot-Descombes
la source
-2

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.

Ryathal
la source
3
Ce n'est pas parce que c'est tout ce que vos getters et setters font maintenant que cela sera toujours le cas. Et si l'ajout de validation à un setter nécessite de parcourir des dizaines de milliers de lignes de code pour trouver partout où cette propriété est accessible, vous perdrez instantanément la douzaine de secondes que vous vous êtes sauvées en évitant volontairement l'encapsulation la première fois.
Plutor
@Plutor: Si c'est tout ce que l'objet fera jamais (par exemple, parce qu'il représente un message envoyé à un autre processus ou un enregistrement dans une base de données), alors c'est OK; ce sont des choses qui devraient être hautement conservées.
Donal Fellows