¿Se utiliza un término cuando las variables internas se declaran públicas y accesibles?

10

Si alguien escribe código para que se pueda acceder a una variable interna $ _fields sin utilizar los métodos getter / setter, ¿hay un término apropiado para describirlo?

Algo lo suficientemente educado como para usar con la administración :)

PeterB
fuente
99
¿Falta de encapsulación?
Oded
@Oded Creo que tienes razón: la falta de encapsulación / pobre lo describe bien
PeterB
Las dos frases en las que pensé al intentar responder a esta pregunta fueron "abstracción permeable" y "alcance suelto": ¿a qué se refieren cada una de ellas (fuera de mi cabeza)?
PeterB
1
La abstracción con fugas es cuando intentas abstraer un concepto pero realmente no funciona: los conceptos subyacentes aún se filtran (los ORM sobre SQL y los marcos web sobre HTTP / HTML tienden a ser abstracciones con fugas).
Finalizado el
@PeterB: para agregar a la explicación de Oded, vea esto: joelonsoftware.com/articles/LeakyAbstraction.html
Joris Timmermans el

Respuestas:

30

Exponer a los miembros privados nunca es algo bueno en una sociedad educada ...

Esta práctica es la falta de / pobre encapsulación.

Oded
fuente
66
+1, Bueno, no sacarías tus partes privadas en la oficina, ¿verdad?
StuperUser
66
-1: La encapsulación realmente sucedió y sucedió bien. Pero no fue documentado a través del código fuente en la forma comúnmente aceptada. Algunos lenguajes (como Python) carecen de variables verdaderamente privadas, pero aún practican la encapsulación.
S.Lott
66
@Oded: la encapsulación es un concepto de diseño . Diferentes lenguajes tienen diferentes implementaciones del concepto. Un lenguaje con una declaración privada permite una implementación. Un lenguaje de programación funcional con objetos sin estado podría tener una implementación diferente. Python (que carece private) tiene otra implementación más del concepto de encapsulación.
S.Lott
1
@S Lott; Oded: la encapsulación es buena y depender del código en el que las variables privadas a las que se accede con frecuencia directamente desde otras clases es una encapsulación deficiente. En python, puede hacer esto accediendo a variables privadas de nombre de otra clase o ignorando las convenciones de un solo prefijo de subrayado (aunque si su captador está haciendo otro comportamiento; realmente debería usarlo __para el cambio de nombre). Otros lenguajes también pueden tener una pobre encapsulación, por ejemplo, reflexión en Java y aritmética de puntero en C ++ para obtener variables privadas. Python simplemente no hace que la sintaxis lo haga tan engorroso.
dr jimbob
2
@drjimbob: el código de Python rara vez usa el cambio de __nombre. Sin el __, el diseño aún refleja una buena encapsulación. Afirmar que "público" significa "falta de encapsulación / pobre" es incorrecto. El concepto aún está presente. El código fuente carece de la decoración adecuada.
S.Lott
10

Además de la falta de encapsulación ya mencionada por Oded, dependiendo del lenguaje de programación y sus paradigmas también podría ser "datos antiguos" (donde no es necesariamente un antipatrón o un olor a código).

Joris Timmermans
fuente
4

He escuchado el término "objeto desnudo" antes.

Raku
fuente
1
Sin duda, es una forma confusa de nombrar a aquellos que consideran el Patrón de objetos desnudos
Matthieu
1
Sí, eso también me confundió.
Raku
2

Se llama bolsa de propiedades.

Por lo general, se usa para contener un conjunto de propiedades posiblemente relacionadas (donde cada una de ellas podría ser un objeto de clase que tenga o no los especificadores de acceso adecuados). Pero la estructura circundante es solo una bolsa de propiedades.

Martin York
fuente
2

Se llama "no seguir un estándar de codificación específico".

El OP escribió:

Se puede acceder a una variable interna $ _fields sin utilizar métodos getter / setter

Eso podría estar en contra de su estándar, y (por lo tanto) podría ser olor a código. Pero no es necesariamente una pobre encapsulación. Exponer una variable interna (como en "solo de uso interno") sobre getter y setters al mundo exterior sería aún peor.

La pregunta es: ¿debería $_fieldsser accesible para el mundo exterior?

Si es así, tenemos un caso en el que agregaría métodos getter / setter. Estos métodos no encapsulan nada más que el hecho de que $_fieldses una variable de algún tipo (a diferencia de algo calculado / obtenido / etc. sobre la marcha). Dependiendo del idioma, es probable que aún filtre el tipo (también conocido como detalle de implementación) hacia el exterior. Si siempre quiere getters / setters, o solo cuando es "necesario" es un problema estándar de codificación.

Si no$_fields debe ser accesible, entonces, bueno, no acceda a él. Si debe evitar que otros accedan a él a nivel de idioma (privado y amigos) o no (lo que podría facilitar la depuración en ciertas circunstancias) es, nuevamente, un problema estándar de codificación.

El tema de la encapsulación es completamente ortogonal a esto. Violar la encapsulación es absolutamente posible con getters y setters. Es aún más fácil entrar, porque las campanas de alarma de la mayoría de las personas no suenan cuando ven un montón de captadores y establecedores, código que aparentemente sigue las mejores prácticas. Código, que bien podría introducir muchas más dependencias en los detalles de implementación internos que una variable llamada $_fieldsque no se especifica como private.

Soy fanático de las malas analogías: llamar a esa pobre encapsulación es como llamar asesino a alguien que tiene una pistola.

rwos
fuente
1

Llamaría a tales variables miembros públicos variables .

Olivier Jacot-Descombes
fuente
-2

si sus métodos setter / getter no son más que

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

entonces solo hacer una variable púbica es solo guardar algo de tipeo fuera de algunos casos extremos donde la diferencia es importante.

Ryathal
fuente
3
El hecho de que eso sea todo lo que sus captadores y colocadores hacen ahora no significa que así será siempre. Y si agregar validación a un setter requiere peinar a través de decenas de miles de líneas de código para encontrar donde sea que se acceda a la propiedad, explotará instantáneamente la docena de segundos que guardó evitando deliberadamente la encapsulación la primera vez.
Plutor
@Plutor: Si eso es todo lo que el objeto hará (por ejemplo, porque representa un mensaje enviado a otro proceso o un registro en una base de datos), entonces está bien; Esas son cosas que deben ser altamente conservadas.
Donal Fellows