Sto lavorando su un sito di prenotazione online (compagnia aerea) e voglio verificare se il percorso scelto dall'utente/cliente è valido in base ad alcune impostazioni. I codici esistenti usano un sacco di enumerazioni e mi sono trovato a fare un sacco di if/if else/else per mappare un enum specifico ad una particolare azione che volevo accadesse. What I want to do is to write a enum-specific method that would do the mapping for me. Is there any standard way to do this?
Mappare enum a una funzione/azione utilizzando il metodo enum specifico
Ecco una versione semplificata del codice applicazione utilizzando gli stessi nomi di classe valori/enum, ecc dal reale applicazione:
// real app has 9 members, shortened for simplicity's sake
public enum RegionType
{
Station,
Country,
All
}
public enum Directionality
{
Between,
From,
To
}
// simplified version
public class Flight
{
public RegionType RegionType { get; set; }
public RegionType TravelRegionType { get; set; }
public string RegionCode { get; set; }
public string TravelRegionCode { get; set; }
public string RegionCountryCode { get; set; }
public string TravelRegionCountryCode { get; set; }
public Directionality Directionality { get; set; }
}
Ecco qualche esempio dell'uso:
// valid flight
Flight flight = new Flight()
{
RegionCode = "NY",
CountryCode = "JP",
RegionType = RegionType.Station,
TravelRegionType = RegionType.Country,
Directionality = Directionality.Between
};
// these are the station code/country code that user selected
// needs to be validated against the Flight object above
var userSelectedRoutes = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("NY", "JP"),
new KeyValuePair<string, string>("NY", "AU"),
new KeyValuePair<string, string>("JP", "NY")
};
Alcuni codice di validazione I ha scritto per diminuire l'accoppiamento annidato if/else if/else:
private bool IsRouteValid(Directionality direction, string origin,
string destination, string departure, string arrival)
{
// both departure station and arrival station
if (direction == Directionality.Between)
{
return (origin.Equals(departure, StringComparison.OrdinalIgnoreCase)
&& destination.Equals(arrival, StringComparison.OrdinalIgnoreCase)
|| origin.Equals(arrival, StringComparison.OrdinalIgnoreCase)
&& destination.Equals(departure, StringComparison.OrdinalIgnoreCase));
}
else if (direction == Directionality.From)
{
return (origin.Equals(departure,
StringComparison.OrdinalIgnoreCase));
}
else if (direction == Directionality.To)
{
return (destination.Equals(arrival,
StringComparison.OrdinalIgnoreCase));
}
return false;
}
Ed ecco il codice disordinato voglio cambiare:
if (flight.RegionType == RegionType.Station
&& flight.TravelRegionType == RegionType.Country)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.RegionCode, flight.TravelRegionCode));
}
else if (flight.RegionType == RegionType.Country
&& flight.TravelRegionType == RegionType.Station)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.CountryCode, flight.RegionCode));
}
else if (flight.RegionType == RegionType.Station
&& flight.TravelRegionType == RegionType.Station)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.RegionCode, flight.TravelRegionCode));
}
else if (flight.RegionType == RegionType.Station
&& flight.TravelRegionType == RegionType.All)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.RegionCode, route.Value));
}
else if (flight.RegionType == RegionType.All
&& flight.TravelRegionType == RegionType.Station)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
route.Key, flight.TravelRegionCode));
}
else if (flight.RegionType == RegionType.All
&& flight.TravelRegionType == RegionType.All)
{
return true;
}
else
{
return false;
}
Legenda:
RegionCode
= stazione di partenza/origine
stazione TravelRegionCode
= arrivo/destinazione
Between
= percorsi devono essere solo dal data stazione di partenza e stazione di arrivo e viceversa (ex NY-JP o JP-NY)
From
= da stazione particolare a qualsiasi rotta (ex AU- Tutti)
To
= eventuali rotte per una particolare stazione (ex Tutti -AU)
Se si potesse notare, la .Any
di tutte le condizioni di cui sopra sono gli stessi con lievi modifiche. Voglio ridurre la ridondanza del codice, se possibile. Ho usato KeyValuePair
quindi ho sia la stazione di partenza che la stazione di arrivo su un singolo tipo di dati.
Qualche idea su come posso rendere questo codice meno disordinato/bello? So che ho anche programmato il codice IsRouteValid()
ma sono sicuro al 100% che Directionality
potrebbe avere solo le 3 combinazioni possibili. RegionType
d'altra parte potrebbe avere diverse diverse combinazioni come Stazione-Stazione, Stazione-Country, Country Stazione, Paese-Paese ecc
Output previsto:
Valido/True per primo itinerario (NY- JP)
Invalid/falso per il secondo percorso (NY-AU)
valido/vero per il terzo percorso (JP-NY) [dal Directionality
è Between
]
grazie per aver letto questa lunghissima query e grazie in anticipo per il tuo feedba ck e suggerimenti.
post simile: