Pracuję na stronie rezerwacji online (linie lotnicze) i chcę sprawdzić, czy trasa wybrana przez użytkownika/klienta jest ważna zgodnie z niektórymi ustawieniami. Istniejące kody używają wielu wyliczeń i odkryłem, że robię dużo, jeśli/jeśli jeszcze/else, aby zmapować konkretne wyliczenie na konkretne działanie, które chciałem zrealizować. 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?
Mapowanie do funkcji/działania przy użyciu metody specyficznej dla enum
Oto uproszczona wersja kodu aplikacji przy użyciu tych samych nazw klas/wartości enum itp od rzeczywistych aplikacji:
// 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; }
}
Oto niektóre wykorzystanie próbki:
// 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")
};
Niektóre kod walidacji I napisał, aby pomniejszyć zagnieżdżone, jeśli/else jeśli/else wylicza dopasowanie:
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;
}
A oto niechlujny kod Chcę zmienić:
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
= stacja wyjazdu/pochodzenia
stacja TravelRegionCode
= przyjazd/przeznaczenia
Between
= trasy musi być tylko z daną stację odlotów i przylotów i odwrotnie (np. NY-JP lub JP-NY)
From
= z konkretnej stacji na dowolne trasy (np. AU-Wszystkie)
To
= wszelkie drogi do konkretnej stacji (ex Wszystko -AU)
Jeśli można wypowiedzenia .Any
wszystkich powyższych warunków są takie same z niewielkimi zmianami. Chcę, jeśli to możliwe, zmniejszyć nadmiarowość kodu. Użyłem KeyValuePair
, więc mam zarówno stację odlotową, jak i przybycie na jednym typie danych.
Jakieś pomysły, w jaki sposób mogę uczynić ten kod mniej niechlujnym/pięknym? Wiem, że również mocno zakodowałem IsRouteValid()
, ale jestem w 100% pewien, że Directionality
może mieć tylko 3 możliwe kombinacje. RegionType
z drugiej strony może mieć kilka kilka kombinacji jak Station-Station, Station-country, country-Station, Country-Country itp
oczekiwany wynik:
Ważny/true dla pierwszej trasy (nY- JP)
Nieprawidłowy/Fałsz do drugiej drogi (NY-AU)
Ważny/true dla trzeciej drogi (JP-NY) [od Directionality
jest Between
]
Dziękuję za przeczytanie tego bardzo dużo zapytań i dzięki z góry dla twojego feedba ck i sugestie.
podobnym stanowisku: