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