2012-07-14 29 views
5

últimamente tengo la sensación de que las variables de instancia tienen los mismos problemas de variables globales, busqué en Google y encontré this old article que describe más o menos el problema potencial que estoy viendo.¿Las variables de instancia son las nuevas variables globales?

¿Qué buenas prácticas usa para evitar que los mismos problemas de variables globales afecten variables de instancia o variables de clase?

Respuesta

2

Las clases son mucho más pequeñas que la estructura global, por lo que el impacto de una variable de instancia es mucho menor. Al mantener un tamaño de clase pequeño y adherirse estrechamente al principio de responsabilidad única, se evita gran parte de la desventaja de una variable global. Si la variable de instancia se crea a partir de un parámetro pasado, a menudo hago que el parámetro requerido en el constructor haga que la dependencia sea explícita. Además, la variable de instancia se encapsula bien, nunca se modifica directamente fuera de los métodos de la instancia, lo que hace que sea muy fácil determinar dónde se modifica la variable de instancia. Finalmente, la variable de instancia debe tener sentido para la clase como un todo o debe ser privada.

0

Las variables de instancia solo son accesibles dentro de una clase específica. Por lo tanto, para evitar que las variables de instancia se usen demasiado, mantenga las clases pequeñas. Si una clase crece, decida si partes de ella se pueden refactorizar en otra clase más pequeña que utiliza la clase original.

0

Ni las variables de instancia ni las variables globales ni ningún tipo de variable tienen "problemas" ... Todas son herramientas. El problema es que a veces muchos programadores eligen usar la "herramienta incorrecta". Debe pensar cuidadosamente qué significan sus elecciones, para que pueda tomar la decisión correcta.

Usar una variable global para algo, como CurrentUserName ... Significa que está diciendo que CurrentUserName es algo que se conoce universalmente. Y ese "solo puede haber un" CurrentUserName en cada momento. Y eso probablemente sea falso si alguna vez desea permitir que los usuarios inicien sesión al mismo tiempo (a menos que tenga mucha suerte y ambos usuarios tengan el mismo nombre) ...

Un uso incorrecto realzado con variables de instancia es si pone la dirección de correo electrónico de un usuario como una variable de instancia, y luego se da cuenta de que cada usuario puede tener múltiples direcciones de correo electrónico.

También daría un ejemplo con la herencia, porque creo que lo dejará más claro: Un problema relacionado con la herencia es, por ejemplo, si está modelando el problema típico de Estudiante, Maestro e intenta hacer Estudiante una subclase de Persona y Maestro una subclase de Persona. Y luego se da cuenta de que algunas personas pueden ser ambas ...

El estudiante que hereda de Persona es una relación estática que no puede modificarse en tiempo de ejecución. Y los Estudiantes y Maestros no son relaciones estáticas ... Una persona no puede ser ninguna de las dos cosas, y luego comienza a ser un estudiante, y luego comienza a ser un maestro, y luego deja de ser ambos, y sin embargo, siempre será la misma persona, y ese modelo no puede manejar eso ....

Volviendo al usuario, el usuario está "asociado" con la cuenta de varios correos electrónicos ... Si pones una variable de instancia, estás diciendo que es solo " asociado "con una sola cuenta de correo electrónico, y está contradiciendo su dominio problemático, y es por eso que tendrá problemas ...

Lo mismo se aplica si dice que solo hay un nombre de usuario actual conocido mundialmente ... ..

El problema en todos los casos es t Si tiene un dominio problemático y está modelando incorrectamente ... Tiene que hacer que su programa y su modelo se comporten de manera similar al dominio problemático ... Si no lo hace, tendrá problemas , cualquiera que sea la herramienta que elija para resolver su problema.

BTW: También creo que el usuario que tiene una lista de direcciones de correo electrónico está equivocado, pero eso se debe a un conjunto de motivos completamente diferente. De hecho, me gustaría utilizar un

class ContactInformation 
{ 
    User contact; 
    EMailAddress email; 
} 

y recordar que los objetos no "poseer" ni "tener" otros objetos ... Esa es una decisión de implementación ... Objetos simplemente "saben" otros objetos ...

Cuestiones relacionadas