maybe

Option zamiast wzorca TryGetValue(…, out value)

Posted on

Przedstawię dziś klasę całkiem naturalną z punktu widzenia programisty funkcyjnego. Gdyby to przełożyć na język bliski naturalnemu to jest to konstrukcja, która “albo posiada wartość zadeklarowanego typu, albo tej wartości nie ma”. Posłużę się od razu przykładami.

Są przypadki, gdzie nie wiemy czy dostaniemy wartość czy nie. Klasyczny przypadek to parsowanie. Gdy korzystamy z wzorca TryGetX kod wygląda:

int value;
if(int.TryParse(currentLine, out value))
{
    // happy path
}
else
{
    // else path
}

Typ ten można przekazywać dalej do innych funkcji lub zwracać z aktualnej funkcji. Dzięki temu dalej w flow działania aplikacji nie potrzebujemy 2 różnych funkcji przyjmujących raz happy path a raz failure path. Ostatecznie na końcu i tak trzeba “rozpakować” tą wartość, ale po drodze mogą zdarzyć się na przykład funkcje logujące, albo obsługujące wspólnie “brak danych” jak np HTTP 404. W przykładzie z TryGetX() wiadomość o sukcesie mamy tylko

var maybeResult = GetResults(data);
if(maybeResult.HasValue == false)
{
    return HttpStatusCode.NotFound; // 404
}

Jak na przykład może wyglądać taka klasa (inne nazwy to Maybe):

Advertisements