sobota 13. prosince 2014

Poznámky z code review 1

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