16

¿Cuál es la ventaja de tener this/self/me puntero obligatorio explícito?¿Cuál es la ventaja de tener this/self puntero obligatorio explícito?

Según la teoría OOP, se supone que un método funciona principalmente (¿solo?) En las variables de los miembros y en los argumentos del método. Después de esto, debería ser más fácil para referirse a variables de miembro que a variables externas (desde el lado del objeto de vista) ... Explicita this lo hace más detallado más difícil para referirse a las variables de miembros que a las externas. Esto me parece contrario a la intuición.

Respuesta

19

Además de las variables miembro y los parámetros del método, también tiene variables locales. Una de las cosas más importantes sobre el objeto es su estado interno. La desreferenciación explícita de variables de miembro deja muy claro dónde hace referencia a ese estado y dónde está modificando ese estado.

Por ejemplo, si usted tiene un código como:

someMethod(some, parameters) { 
    ... a segment of code 
    foo = 42; 
    ... another segment of code 
} 

cuando rápidamente navegar a través de él, usted tiene que tener un modelo mental de las variables definidas en el segmento anterior para saber si es sólo una variable temporal o ¿Muta el estado de los objetos? Mientras que this.foo = 42 hace obvio que el estado de los objetos está mutado. Y si la desreferenciación explícita se usa exclusivamente, puede estar seguro de que la variable es temporal en el caso contrario.

Los métodos más cortos y bien factorizados lo hacen un poco menos importante, pero aún así, la comprensibilidad a largo plazo prevalece sobre la conveniencia al escribir el código.

+2

Ergo, "legibilidad del código". –

+0

Es útil cuando surge un problema de alcance (un foo de ámbito local ocultará la variable miembro de clases foo), pero teniendo en cuenta los comentarios de OP en otros lugares, no es estrictamente obligatorio, simplemente conveniente. –

+0

También necesito un 'modelo mental' para saber si estoy dentro de un 'si' o un 'mientras'; ¿Por qué no prefijamos todos esos comandos con esa información? – einpoklum

3

¿Qué ocurre si los argumentos de un método tienen el mismo nombre que las variables miembro? Entonces puede usar this.x = x por ejemplo. Donde this.x es la variable miembro y x es el argumento del método. Eso es solo un ejemplo (trivial).

+1

Agregué la palabra "obligatorio" porque eso es lo que estoy preguntando. –

3

Lo necesita para pasar el puntero/referencia al objeto actual en otro lugar o para protegerlo contra la autoasignación en un operador de asignación.

+0

Agregué la palabra "obligatorio" porque eso es lo que estoy preguntando. –

2

por lo general utilizan este (en C++) sólo cuando estoy escribiendo el operador de asignación o el constructor copia ya que ayuda a identificar claramente las variables. Otro lugar donde puedo pensar en usarlo es si los nombres de las variables de los parámetros de función son los mismos que los nombres de las variables miembro o si deseo matar a mi objeto usando , elimine este.

+0

¿Soy yo o llamar 'delete this' parece realmente incorrecto? –

+0

generalmente es una mala idea ... pero es posible que desee hacerlo en algunos casos como un objeto de referencia contado. – Naveen

+0

No tiene otra opción en el caso de un objeto contado por referencia si desea que la acción de "disminuir el contador, verificar el valor y eliminar si es necesario" sea un único método. – sharptooth

1

Por ejemplo, sería el caso en nombres de los miembros son los mismos que los aprobados con el método

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault) 
     { 
      this.screenTemplateID = screenTemplateID; 
      this.screenTemplateName = screenTemplateName; 
      this.isDefault = isDefault; 
     } 
4

Si se habla de "explícito self" en el sentido de Python, he aquí un interesting discussion sobre el tema. Aquí está Guido responding a Bruce Eckel's article. Los comentarios sobre el artículo de Bruce también son esclarecedores (algunos de ellos, de todos modos).

+0

Muy buen enlace. Gracias. –

+0

De nada. –

Cuestiones relacionadas