Občas dělám i code review hotového kódu a některé věci se neustále opakují či se vyskytují v kódu poměrně často a tak mne napadlo, že by nebylo špatné na ně upozornit a nabídnout k zamyšlení či diskuzi. První příspěvek bude věnován kódu, který provádí rozhodnutí dle výčtové hodnoty, tedy enumu.
Například vznikne takovýto výčtový typ:
public enum Option
{
One = 1,
Two = 2
}
Výše uvedené hodnoty pak často vedou k programátora k rozhodování se pomocí následujícího kódu, kdy předpokládá, že buď má proměnná jednu určitou hodnotu a pokud ne, tak musí mít druhou.
if (userOption == Option.One)
Console.WriteLine("One");
else
Console.WriteLine("Two");
Což ovšem platí jen do okamžiku, než někdo přidá další hodnoty, například doplní definici enum takto:
public enum Option
{
Unknown = 0,
One = 1,
Two = 2,
Three = 3
}
Podobné chyby se ale my programátoři často dopouštíme, i pokud má výčtový typ více hodnot než dvě a my se z nějakého důvodu domníváme, že stejně může nabývat jen dvou námi vybraných hodnot. Takto napsaný kód není příliš odolný proti změnám ve výčtovém typu a ve výsledku se pak program často chová "podivně".
Jak to tedy napsat správně? Podle mne takto:
switch (userOption)
{
case Option.One: Console.WriteLine("One"); break;
case Option.Two: Console.WriteLine("Two"); break;
default: throw new NotImplementedException();
}
Pokud se objeví hodnota, s kterou kód nepočítal, vyhodí se výjimka. A nebo se může provést úprava hodnoty a zalogování chyby, aby šlo později daný kód upravit, tedy například napsat kód takto:
switch (userOption)
{
case Option.One: Console.WriteLine("One"); break;
case Option.Two: Console.WriteLine("Two"); break;
default:
Console.WriteLine("Not implemented value {0}, processing as {1}",
userOption,
Option.One);
goto case Option.One;
}
Upozornění: kód je napsán jen pro účely tohoto článku, má jen ilustrovat problém. K podobným chybám může dojít i při nepoužití výčtu, jen se to na něm dobře ilustruje.
Žádné komentáře:
Okomentovat