2010-07-17 20 views
7

Cada vez que escribo captadores triviales (obtengo funciones que simplemente devuelven el valor del miembro) me pregunto por qué los lenguajes no solo tienen un modificador de acceso de "solo lectura" que permitiría leer el valor de los miembros del objeto, pero no le permite configurarlas como cosas const en C++.¿Por qué los idiomas de oop no tienen un modificador de acceso de "solo lectura"?

Los modificadores privados, protegidos y de acceso público le otorgan acceso total (de lectura/escritura) o ningún acceso.

Escribir un captador y llamarlo siempre es lento, porque la invocación de funciones es más lenta que el simple acceso a un miembro. Un buen optimizador puede optimizar estas llamadas, pero esto es "mágico". Y no creo que sea una buena idea aprender cómo funciona un optimizador de un determinado compilador y escribir código para explotarlo.

Entonces, ¿por qué tenemos que escribir accesos, leer solo las interfaces en todas partes en la práctica cuando solo un nuevo modificador de acceso haría el truco?

ps1: por favor, no digas cosas como 'Rompería la encapsulación'. Un público foo.getX() y un público pero de solo lectura foo.x harían lo mismo.

EDITAR: No he compuesto mi publicación clara. Lo siento. Quiero decir que puedes leer el valor del miembro afuera pero no puedes configurarlo. Solo puedes establecer su valor dentro del alcance de la clase.

+4

Su ps1 supone que un Property Getter es siempre una simple encapsulación de una variable de campo, que no siempre es el caso. Por ejemplo, el getter de propiedad puede ser un cálculo que incluye múltiples campos, una concatenación de campos, etc. El getter de propiedad encapsula la lógica y, por lo tanto, la implementación interna se puede cambiar fácilmente. –

+0

En respuesta a su edición, la respuesta de Marcelo Cantos o la mía satisfarán su necesidad perfectamente. – BoltClock

Respuesta

11

Está generalizando incorrectamente de uno o algunos lenguajes OOP que conoce a los lenguajes OOP en general. Algunos ejemplos de lenguajes que implementan atributos de sólo lectura:

  • C# (gracias, Darin y tonio)
  • Delphi (= Object Pascal)
  • Rubí
  • Scala
  • Objective-C (gracias , Rano)
  • ... más?

Personalmente, me molesta que Java no tenga esto (¿todavía?). Habiendo visto la función en otros idiomas, la escritura repetitiva en Java parece tediosa.

+1

¿Convierte el 'final' de Java? – BoltClock

+1

@BoltClock: Buen punto, pero un campo final no tiene la misma semántica que una propiedad de solo lectura. Este último generalmente permitirá a la clase una puerta trasera privada para cambiar el valor subyacente mientras se mantiene la encapsulación segura contra el exterior, lo que puede ser un buen beneficio. 'final' es ... final. –

+0

Si el 'final' de Java no cuenta, el' val' de Scala tampoco debe contar. – missingfaktor

0

Las propiedades C# permiten definir propiedades de solo lectura fácilmente. Vea esto article.

2

C# tiene readonly, Java y algunos otros tienen final. Puede usarlos para hacer que las variables de sus miembros sean de solo lectura.

En C#, solo puede especificar un getter para su propiedad, por lo que solo se puede leer, no cambiar.

private int _foo; 

public int Foo 
{ 
    get { return _foo; } 
} 
+2

public int Foo {get; conjunto privado;} es otra forma de lograr esto. Sin la declaración adicional – btlog

2

En realidad, no, no son lo mismo. Public foo.getX() aún permitiría que el código de clase interno escriba en la variable. Un foo.x de solo lectura también sería de solo lectura para el código de clase interno.

Y hay algunos idiomas que sí tienen dicho modificador.

+0

Parece que en C# solo significa que todavía puede modificar la variable en la clase, pero desde el exterior es de solo lectura (http://msdn.microsoft.com/en-us/library/acdd6hb7%28VS.71 % 29.aspx). – Frank

+1

Los campos de solo lectura de C# se pueden asignar solo una vez en la declaración o en el constructor. –

5

En C#, se puede definir una propiedad automática con diferentes eliminatorias de acceso al conjunto y obtener:

public int Foo { get; private set; } 

De esta manera, la implementación de la clase se puede jugar con la propiedad al contenido de su corazón, mientras que el código del cliente puede solo léelo.

0

En Delphi:

strict private 
    FAnswer: integer; 
public 
    property Answer: integer read FAnswer; 

declara una respuesta propiedad de sólo lectura que accede FAnswer ámbito privado.

0

La pregunta en gran parte se reduce a: ¿por qué no todos los idiomas tienen una propiedad const como C++?

Es por esto que no es en C#:

Anders Hejlsberg: Sí. Con respecto a const, es interesante, porque nosotros escuchamos esa queja todo el tiempo también: "¿Por qué no tienes const?" Implícito en la pregunta es, "¿Por qué no tiene const que se aplica por el tiempo de ejecución ?" Eso es realmente lo que la gente está pidiendo, aunque no vienen y lo dicen de esa manera.

La razón por la que const funciona en C++ es porque puede descartarla. Si no pudo rechazarlo, entonces su mundo sería una mierda. Si declara un método que toma una const Bla, puede pasar una Bla no const. Pero si es el , no puede hacerlo. Si declara un método que toma un Bla no const, no puede pasarlo a const Bla. Entonces ahora estás atrapado. Entonces, usted necesita gradualmente una versión de const de todo lo que no es const, y usted termina con un mundo de sombras. En C++ usted salga con la suya, porque como con cualquier cosa en C++ es puramente opcional si desea esta verificación o no. Puedes golpear la constness lejos si no te gusta.

Ver: http://www.artima.com/intv/choicesP.html

Así, la const wy razón funciona en C++ es porque se puede trabajar alrededor de ella. Lo cual es sensato para C++, que tiene sus raíces en C.

Para lenguajes administrados como Java y C#, los usuarios esperarían que const fuera tan seguro como, por ejemplo, el recolector de basura. Eso también implica que no puedes evitarlo, y no será útil si no puedes evitarlo.

+0

Ese tipo claramente no sabe C++. Es cierto que puedes descartar la const, pero es increíblemente raro que alguna vez lo haga. – Puppy

+0

@DeadMG: Si busco en la búsqueda de código de google, obtengo 32000 visitas para const_cast. Como punto de referencia: dynamic_cast obtiene casi 60000. Así que no somos solo yo y Anders los que creemos que necesitan const_cast. –

+0

La necesidad no es igual a querer información al respecto, o cree que la necesita cuando no la necesita. La cantidad de resultados en un motor de búsqueda es una métrica realmente, realmente irrelevante. Si agrupó 5 millones de líneas de código y descubrió que ocurría a menudo, eso sería diferente. – Puppy

Cuestiones relacionadas