úterý 30. června 2015

Hádanka - poznáte o jakou aplikaci jde? Aneb jak neprogramovat, ale jak se programuje

Inspirací pro následující krátký kód byla web aplikace, kterou představilo jedno nejmenované ministerstvo v tomto roce a jako další nápovědu mohu uvést, že její potřeba dnes končí. Aplikace sice neověřovala věk potřebný k pití alkoholu , ale jinak se chová víceméně stejně, to jest má stejnou chybu jaké jsem se v ukázce dopustil já - ujistí vás, že máte vše v pořádku, i když nemáte. Uhádnete, o jakou aplikaci jde?



Tady je kód:

using System;

public class Program
{
    public static void Main()
    {
        string age;

        Console.WriteLine("Ověrovací aplikace věku pro konzumaci alkoholu dle nejmenovaného státního úřadu");

        while (!string.IsNullOrEmpty(age = GetAge()))
        {
            Console.WriteLine(CanDrink(age) ? "Váš věk je v pořádku a dejte si pivo" : "Dnes ještě rozhodně nepijte");

        }

        Console.WriteLine("Děkujeme za použití naší aplikace");
    }

    public static string GetAge()
    {
        Console.Write("Zadejte věk a nebo stiskněte Enter pro ukončení:");
        return Console.ReadLine();
    }

    public static bool CanDrink(string age)
    {
        double realAge;

        if (double.TryParse(age, out realAge))
        {
            if (realAge < 18 && realAge > 0)
                return false;
        }

        return true;
    }
}

Ke spuštění je pak na v on-line editoru .NET Fiddle na https://dotnetfiddle.net/TO7J9f

2 komentáře:

  1. Aplikace vyhodnotí nečíselný vstup (ale i -1) jako platný. Logika funkce CanDrink by měla být psaná defenzivně, neboli cokoliv platné podmínky by mělo vracet "false".

    OdpovědětVymazat
  2. Pěkná odpověď - takhle nějak fungovala webova aplikace MDCR - www.dokonciregistraci.cz. Nijak neověřovala vstup a byla schopna vypsat hlášení, že VRAK je registrován v pořádku :-) - když už tedy pominu skutečnost, že místo vypisování kódu z dokladu se stačilo na doklad jen podívat a bylo jasné, jestli je nutné navštívit úřad a nebo ne.

    OdpovědětVymazat