Hlavní navigace

Názor k článku Mercury: Programování s pomocí instalatéra od Ondřej Bojar - V Mercury jsou také výjimky, které je možné...

  • Článek je starý, nové názory již nelze přidávat.
  • 27. 2. 2004 17:37

    Ondřej Bojar (neregistrovaný)

    V Mercury jsou také výjimky, které je možné podle potřeby vyhazovat a chytat. A konkrétně dělení v základní knihovně je deklarováno jako deterministické (aby člověk nemusel opravdu každé lomítko ve svém kódu explicitně oifovávat) a pro nulu vyhazuje výjimku. Nechtěl jsem o výjimkách ale mluvit z pedagogických pohnutek. Osobně se mi více osvědčilo "nepříjemné" situace v kódu ošetřovat explicitně, řádnou úvahou nad každým selháním (a tady Mercury pomůže), než vyhazováním a chytáním výjimek (na to je expert Java). Mám obavu, že při hojném užívání výjimek člověk snadno vyrobí kód špagetový ještě v jednom rozměru navíc: kde se která výjimka produkuje a kde se která výjimka chytá. A tak radši o výjimkách mlčím, aby si lidé nezvykli tyhle špagety zamotávát.

    Správně jste pochopil, že všechno, co volá selhatelné, může selhat také. Výjimky jsou zavedeny proto, aby něco bylo z logického hlediska neselhatelné, ale v nárazu na skutečný svět přece jen nějak havarovalo. Osobně programy člením do dvou částí: v první fázi se vypořádám se vstupem a dostanu ho do struktur (pak už řetězec používám opravdu jako řetězec a nikdy ne jako seznam čárkou oddělených hesel, na to si zavedu seznam řetězců). Selhání (za běhu, např. výjimkou) na špatný vstup je tedy oznámeno brzo. Ve druhé fázi už vyhazuju prakticky jenom výjimku typu "Pro lenost nedoimplementováno.", a případně to dělení nulou, pokud jsem nějak nesprávně použil nějakou matematiku.

    Když tedy budete uvažovat jen to řádné selhání predikátu (a nikoli selhání za běhu), rozdíl je právě v tom, že o tomhle logickém selhání Mercury umí dopředu ověřit, zda může či nemůže nastat. Např. budete tvrdit, že vezmete první prvek seznamu, ale Mercury vám řekne: a co když je seznam prázdný, tohle přece může selhat. Takže vás donutí přidat explicitní kontrolu, jestli je seznam neprázný. A pro tu neplánovanou větev můžete pro začátek klidně říct "Pro lenost nedoimplementováno." Většinou ale podobná pobídka kompilátoru stojí za úvahu: ušetřím si čas s pozdějšími problémy, když to pořádně doimplementuju už teď?