Datový typ enum

Proměnné a datové typy

SSŠVT


Datový typ enum

Typ enum je uživatelsky definovaný hodnotový typ, který se používá pro kódování předem známého výčtu možností (stavů, kategorií, úrovní apod.).

Představme si například hru piškvorky. Na čtverečkované hrací ploše má každé políčko jeden ze 3 stavů:

  1. Buď je políčko prázdné.
  2. Nebo je v políčku zapsán symbol křížku ("x").
  3. Anebo je v něm symbol kolečka ("o").

Pokud nepoužijeme enum, můžeme stavy políčka kódovat např. celým číslem (třeba 0 znamená prázdné políčko, 1 znamená křížek, 2 kolečko), přičemž všude v programu budou uvedena "natvrdo" pouze tato čísla.

Příklad kusu kódu:

public class Game
{
    // ...

    public string CodeToHumanReadableString(int code)
    {
        switch (code)
        {
            case 0:
                return "prázdné";
            case 1:
                return "křížek";
            case 2:
                return "kolečko";
            default:
                throw new Exception($"Unknown status code: {code}");
        }
    }

    public bool IsSquareEmpty(int code)
    {
        if ((code == 1) || (code == 2))
        {
            return false;
        }
        return true;
    }

    // ...
}
        

Datový typ enum nám pomůže udělat náš zdrojový kód čitelnějším pro člověka, který si náš projekt prohlíží poprvé a neví, že jsme někde (na jiném místě) udělali rozhodnutí, že 0 znamená prázdné políčko, 1 křížek a 2 kolečko.

Nejdříve tedy definujeme nový typ pro stav políčka.

public enum SquareStatus
{
    Empty,
    Cross,
    Nought
}
        

A potom přepíšeme původní code snippet třídy Game:

public class Game
{
    // ...

    public string CodeToHumanReadableString(SquareStatus code)
    {
        switch (code)
        {
            case SquareStatus.Empty:
                return "prázdné";
            case SquareStatus.Cross:
                return "křížek";
            case SquareStatus.Nought:
                return "kolečko";
            default:
                throw new Exception($"Unknown status code: {code}");
        }
    }

    public bool IsSquareEmpty(SquareStatus code)
    {
        if ((code == SquareStatus.Cross) || (code == SquareStatus.Nought))
        {
            return false;
        }
        return true;
    }

    // ...
}
        

Je vidět, že takto je náš program mnohem přehlednější a čitelnější.