Né le variabili di istanza né le variabili globali né alcun tipo di variabile hanno "problemi" ... Sono tutti strumenti. Il problema è che a volte molti programmatori scelgono di utilizzare lo "strumento sbagliato". Devi pensare attentamente a cosa significano le tue scelte, in modo da poter fare la scelta giusta.
Utilizzo di una variabile globale per qualcosa, come CurrentUserName ... Significa che si sta dicendo che CurrentUserName è qualcosa di universalmente noto. E che "ci può essere solo un" CurrentUserName ogni volta. E probabilmente sarà falso se vuoi consentire agli utenti di essere loggati contemporaneamente (a meno che tu non sia davvero fortunato, e entrambi gli utenti abbiano lo stesso nome) ...
Un uso errato eseguito con variabili di istanza è se si inserisce l'indirizzo e-mail di un utente come variabile di istanza e quindi ci si rende conto che ciascun utente può disporre di più indirizzi e-mail.
Vorrei anche dare un esempio di ereditarietà, perché penso che renderà più chiaro: Un problema correlato con l'ereditarietà è ad esempio se si sta modellando il tipico Studente, problema Insegnante e si prova a fare Studente una sottoclasse di Persona e Insegnante una sottoclasse di Persona. E poi ti rendi conto che alcune persone potrebbero essere entrambe ...
Lo studente che eredita da Persona è una relazione statica che non può essere modificata in fase di runtime. E gli studenti e gli insegnanti non sono relazioni statiche ... Una persona non può essere né l'una né l'altra, quindi iniziare a essere uno studente, e quindi iniziare a essere un'insegnante, e quindi smettere di essere entrambe, e tuttavia sarà sempre la stessa persona, e quel modello non può gestire quello ....
Tornando all'utente, l'utente è "associato" con più account di posta elettronica ... Se si inserisce una variabile di istanza si sta affermando che è solo " associato "con un singolo account di posta elettronica, e tu stai contraddicendo il tuo dominio problema, ed è per questo che avrai problemi ...
Lo stesso vale se si dice che esiste solo un nome utente corrente globalmente conosciuto .. ..
Il problema in tutti i casi è t hai un dominio problematico e lo stai modellando in modo sbagliato ... Devi fare in modo che il tuo programma e il tuo modello si comportino in modo simile al dominio del problema ... Se non lo fai, avrai problemi , quale strumento scegli per risolvere il tuo problema.
BTW: Penso anche che l'utente abbia una lista di indirizzi e-mail sbagliata, ma è per una serie di motivi completamente diversa. Avevo in realtà uso un
class ContactInformation
{
User contact;
EMailAddress email;
}
e ricordo che gli oggetti non "possedere", né "avere" altri oggetti ... Questa è una decisione di implementazione ... Oggetti basta "sapere" altri oggetti ...