Ich arbeite auf einer Online-Buchungsseite (Fluggesellschaft) und ich möchte überprüfen, ob die gewählte Route des Benutzers/Kunden nach einigen Einstellungen gültig ist. Die bestehenden Codes verwenden eine Menge Enums und ich habe viele If/If Else/Else gemacht, um eine bestimmte Enum einer bestimmten Aktion zuzuordnen, die ich wollte. 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?
Karte enum zu einer Funktion/Aktion mit Enum-spezifischen Methode
Hier ist eine vereinfachte Version des Codes App die gleichen Klassennamen/ENUM-Werte usw. aus der realen App:
// 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; }
}
Hier einige Beispiel-Nutzung:
// 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")
};
Einige Code-Validierung I schrieb, um verschachteltes if/else if/else zu löschen enum passender:
Und hier ist der unordentliche Code, den ich ändern will:
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;
}
Legende:
RegionCode
= Abfahrtsbahnhof/Herkunft
TravelRegionCode
= Ankunftsbahnhof/Ziel
Between
= Routen müssen nur aus dem seine gegebenen Abfahrts- und Ankunftsbahnhof und umgekehrt (ex NY-JP oder JP-NY)
From
= von einer bestimmten Station zu beliebigen Strecken (ex AU-All)
To
= alle Routen zu einer bestimmten Station (ex All -AU)
Wenn Sie feststellen können, die .Any
aller oben genannten Bedingungen sind die gleichen mit geringfügigen Änderungen. Ich möchte, wenn möglich, die Code-Redundanz reduzieren. Ich habe KeyValuePair
verwendet, also habe ich sowohl Abfahrtsbahnhof als auch Ankunftsbahnhof auf einem einzigen Datentyp.
Irgendwelche Ideen, wie ich diesen Code weniger chaotisch/schön machen könnte? Ich weiß, dass ich auch IsRouteValid()
hart codiert habe, aber ich bin 100% sicher, dass Directionality
nur die 3 möglichen Kombinationen haben konnte. RegionType
auf der anderen Seite könnte mehrere verschiedene Kombinationen wie Station-Station, Bahnhof-Country, Country-Station, Land-Land usw. haben
Erwartete Ausgabe:
Gültig/Wahre für die erste Strecke (NY- JP)
Ungültige/Falsch für die zweite Route (NY-AU)
Gültig/Wahre für den dritten Weg (JP-NY) [seit Directionality
ist Between
]
Vielen dank für das Lesen dieses sehr lange Abfrage und dank im Voraus für dein Feedba ck und Vorschläge.
Ähnliche Beitrag: