Názor k článku Programovací jazyky z vývojářského pekla od andy - > Tak to je programátorova chyba. No vidíš, a...

  • Článek je starý, nové názory již nelze přidávat.
  • 2. 5. 2016 22:59

    andy (neregistrovaný)

    > Tak to je programátorova chyba.

    No vidíš, a překladač tuhle chybu odhalí. A o tom to je. A protože já tyhle chyby dělám docela často (obzvláště, když má nějaké funkce víc parametrů), tak jsem moc rád, že za mě překladač tyhle chyby odhalí.

    > Dále, kompilátor v tvém případě zařve a ale za běhu, až tam

    Pokud tam uživatel pošle špatná data, tak je to chyba uživatele, ne programátora a těžko na to něco přijde při kompilaci - ale na druhou stranu, lze napsat program, který ten vstup validuje, a pokud tam uživatel dá číslo, tak se to bude chovat slušně.

    > jestli je uuid validní

    což přesně předchozí kód dělá.

    Jinak, protože to zřejmě vůbec nechápeš (a to nemyslím špatně, já jsem to taky objevil poměrně nedávno), kompletní produkční kód, který vypadá následovně:

    instance FromJSON Message where
    parseJSON = withObject "Message" $ \obj -> Message <$> obj .: "uuid" <*> obj .: "content"

    Tak je cca. ekvivalentní následujcímu kódu v nějakém jazyku bez typové kontroly:

    parseJSON (Json json) {
    Object obj = toObject(json);
    if (obj == null) return (null, error("Message object expected."));
    Json val = obj.lookup("uuid");
    if (val == null) return (null, error("UUID key not found"));
    (UUID uuid, res) = UUID.parseJSON(val);
    if (res != ok) return (null, res);
    val = obj.lookup("con­tent");
    if (val == null) return (null, error("content key not found"));
    (Text text, res) = Text.parseJSON(val);
    if (res != ok) return (null, res);
    return Message(uuid, text);

    Ta funkce nehází žádné výjimky, všechno kontroluje, všechno konvertuje, pokud nesedí data, vrátí chybu. Zkus se zamyslet, jestli takovýhle kód píšeš (a kolik chyb tam uděláš, kolik věcí zapomeneš zkontrolovat). Já ten kód výše píšu naprosto běžně a prostor pro chybu je výrazně menší.