Sto cercando di implementare un'interfaccia web per un database utente. Gli ospiti possono creare ospiti per i loro corsi, gli ospiti possono essere cancellati dopo che il corso è terminato, ma devono rimanere nel database per un dato periodo di tempo. Se un host tenta di creare un guest già esistente nel database, possono verificarsi le seguenti cose:
- Il guest è già attivo ed è stato creato dallo stesso host,
- Il guest è già attivo ed è stato creato da un host diverso,
- Il guest è nello stato eliminato ed è stato creato dallo stesso host,
- Il guest è nello stato eliminato ed è stato creato da un host diverso.
Attualmente sto cercando di rappresentare lo stato dell'utente in questo enumer:
public enum GuestUserStatus
{
Unknown = 0,
NewGuest = 1,
ActiveSameHost = 10,
ActiveDifferentHost = 11,
DeletedSameHost = 20,
DeletedDifferentHost = 21
}
Questo mi permette di switch()
sullo stato utente impostato.
Tuttavia, per impostare lo stato dell'utente, attualmente sto usando repetetive se clausole come queste:
if (queriedUser.GuestDetails.Creator == creator)
{
if (queriedUser.GuestDetails.State == GuestState.Deleted)
{
currentStatus = GuestUserStatus.DeletedSameHost;
}
else
{
currentStatus = GuestUserStatus.ActiveSameHost;
}
}
else
{
if (queriedUser.GuestDetails.State == GuestState.Deleted)
{
currentStatus = GuestUserStatus.DeletedDifferentHost;
}
else
{
currentStatus = GuestUserStatus.ActiveDifferentHost;
}
}
Le clausole if annidate agiscono sulla stessa condizione ma con un risultato diverso.
C'è un modo per evitarlo? Ho esaminato l'enumerazione con [Flags]
e utilizzando le potenze di 2 come valori sottostanti, ma successivamente non ho più potuto utilizzare switch()
.
AGGIORNAMENTO: Si noti che ho le stesse condizioni due volte e risultati diversi per loro.
UPDATE2: provare ad indirizzare la domanda collegata Come per affrontare un anti-pattern a freccia "ramificato"? : Diciamo che implemento la risposta accettata di quella domanda. Questo mi darebbe qualcosa del genere:
bool activeSameHost = (queriedUser.Guest.Creator == creator && queriedUser.GuestDetails.State != GuestState.Deleted);
bool activeDifferentHost = (queriedUser.Guest.Creator == creator && queriedUser.GuestDetails.State == GuestState.Deleted);
bool inactiveSameHost = (queriedUser.Guest.Creator != creator && queriedUser.GuestDetails.State == GuestState.Deleted);
bool inativeDifferentHost = (queriedUser.Guest.Creator != creator && queriedUser.GuestDetails.State == GuestState.Deleted);
if(activeSameHost) currentStatus = GuestUserStatus.ActiveSameHost;
if(inactiveSameHost) currentStatus = GuestUserStatus.InactiveSameHost;
if(activeDifferentHost) currentStatus = GuestUserStatus.ActiveDifferentHost;
if(inactiveDifferentHost) currentStatus = GuestUserStatus.InactiveDifferentHost;
Non riesco a vedere il miglioramento. Certo, if
s non è più nidificato, ma l'unica cosa che è cambiata è la complessità che si sposta dalla% nidificata co_de nidificata all'assegnazione di variabili intermedie.