Ich habe eine Klasse, die eingehende Over-the-Air-Nachrichten verarbeitet und analysiert. In Abhängigkeit von der Ausgabe des Befehls, muss ich einige UI Änderungen umgehen wie Etiketten hervorheben, das Hinzufügen von Text zu Textfelder usw. Die erste Option war ich mit ist:C# Bessere Möglichkeit, mehrere if/else if-Anweisungen zu behandeln
void IncomingMessageIfStatements(Message msg, Host host)
{
byte resp;
if (ParseMessageOptionOne(msg, out resp))
{
// Do some windows form stuff
}
else if (ParseMessageOptionTwo(msg, out resp))
{
// Do some windows form stuff
}
else if (ParseMessageOptionThree(msg, out resp))
{
// Do some windows form stuff
}
}
private bool ParseMessageOptionOne(Message msg, out byte resp)
{
throw new NotImplementedException();
}
private bool ParseMessageOptionTwo(Message msg, out byte resp)
{
throw new NotImplementedException();
}
private bool ParseMessageOptionThree(Message msg, out byte resp)
{
throw new NotImplementedException();
}
Dies funktioniert, aber ich werde mehr else if
Aussagen und es könnte hässlich werden. Der nächste Weg, den ich sah, ist:
void IncomingMessageSwitchStatements(Message msg, Host host)
{
byte resp = 0;
byte someByte = 0;
bool output = false;
switch (someByte)
{
case 1:
output = ParseMessageOptionOne(msg, out resp);
break;
case 2:
output = ParseMessageOptionTwo(msg, out resp);
break;
case 3:
output = ParseMessageOptionThree(msg, out resp);
break;
default:
//handle exception here
break;
}
if (output && resp == 0x01)
{
UpdateUiFromHere();
}
}
private void UpdateUiFromHere()
{
// handle UI updates here
}
Dies sieht viel sauberer und funktioniert wie vorgesehen. Aber dann fing ich an, Dictionary<byte, Func<bool>>
zu betrachten und dachte, dass das vielleicht ein besserer Ansatz zur Lösung der Behandlung von mehreren eingehenden Bedingungen (möglicherweise 20) war.
Irgendwelche Vorschläge zu den Best Practice sollte ich gehen, gegeben, was benötigt wird?
Die 'Schalter' Version wird immer execure Standardzweig ... Sie sagen, es ist wie beabsichtigt funktioniert? –
Scheint, dass der Block "if else" logisch nicht der gleiche wie der "switch case" ist.ParseMessageOptionX gibt bool zurück, woher kommt someByte? –
Switch ist besser als wenn/sonst wenn/sonst. Wenn es jedoch eine große Anzahl von Bedingungen gibt, würde eine Nachschlagetabelle (Wörterbuch) Ihren Code prägnanter machen. – RJM