Hlavní navigace

Názory k článku Perličky: objektové výjimky

  • Článek je starý, nové názory již nelze přidávat.
  • 15. 7. 2008 16:00

    wayan (neregistrovaný)

    Na další pokračování článku mě upozornil kolega. Zarazil jsem se už na první ukázce:

    sub rada { 
    	my $max = shift // 0;
    	croak "Parametr musi byt kladny" if $max " = 0; 
            local ($\, $,) q/ /); 
            print (1 .. $max); 
    }; 
    

    Operátor // je sice elegantní, ale poměrně nový, přidaný až v Perlu 5.10, to znamená, že uživatelé se staršími Perly si nevrznou. Navíc děláte zbytečně flexibilní rozhraní, defaultní hodnota horní meze nemá smysl.

    local ... je nesmyslná masáž ega. Co chcete udělat? Vytisknout všechny prvky řady oddělené mezerami a za ně znak konce řádku, což je: print join(' ', 1 .. $max), "\n"; Proč na to používat obskurní globální proměnné, jejichž význam je nutné dohledávat v manuálu a kvůli "čistotě" je lokalizovat? Ženský s tím neohromíte a mě taky ne :-)

    Za "normálními" subroutinami se většinou nepíše středník - prohlédněte si svoji instalaci Perlu. Je to sice hloupost, ale zbytečně nutíte čtenáře k přemýšlení typu: "... nikdo tady středníky nepíše, autor k tomu má jistě nějaký důvod. Ale jaký?"

  • 15. 7. 2008 17:41

    Michal Svoboda
    Dekuji za pripominky. Vemu to odzadu. Strednik je tam navic. Jak rikate je to hloupost, ale jelikoz jste si toho vsiml tak zde mate odpoved: neni to zadna konspirace, nejspis jsem na nej zapomnel pri nejakem testovani :-)

    Local... neni masaz ega, ale prvni vec ktera me napadla. Mate pravdu, join by se asi hodil vic. Priste to muzu napsat tak. Za $\ ja ale hlavy netrham, jsou i brutalnejsi veci.

    Nakonec jsem si nechal defined-or a vubec novinky perlu 5.10. Zde musim nesouhlasit. Ackoliv je tato verze venku jiz pomerne dlouho, chapu, ze spousta lidi ma stale starsi verzi 5.8. Proto na takovou vec upozornim (v pripade // to bylo v nekterem z minulych dilu, kde jsem to poprve pouzil). Na druhou stranu je ale skoda, abych to kvuli tomu nepouzival vubec. Naopak, chci, aby se novinky verze 5.10 dostaly do povedomi, a proto je pouzivam vsude, kde to ma smysl. (Viz take pouziti ~~ nekolik radku pod tim.)

    Snad Vas tyto drobne chyby neodradily od cteni celeho clanku a tudiz mohu odvodit ze tento je co se tyce tematu samotneho (vyjimky) v poradku :-)
  • 15. 7. 2008 18:48

    wayan (neregistrovaný)

    Jenomže defined-or tady smysl nemá a naopak je matoucí:

    sub rada {
    my $max = shift // 0;
    die bless {}, 'Rada::ZapornyParametr' if $max "= 0; .... 
    }
    

    Zavolám rada(), dostanu výjimku Rada::ZapornyParametr a ... budu se drbat na hlavě

    Asi by bylo logičtější něco v duchu:

    sub rada {
       die bless {}, 'Rada::ZadnyParametr' if !@_;
       my $max = shift;
       ...
    }
    
  • 15. 7. 2008 21:36

    Michal Svoboda
    To je spravny postreh a dokonce k tematu. Urcite by to tak bylo lepsi. Akorat kdyz uz se bavime o citelnosti, tak bych ty dva radky vymenil a dal tam unless defined $max.
  • 16. 7. 2008 16:33

    wayan (neregistrovaný)

    Občas používám Exception::Class, i když s ním mám malý "problém", který je dobře vidět i ve vašem příkladu:

    VelkyParametr->throw(
    		message => 'Parametr je prilis velky',
    		limit => $limit)
    

    Podle mě je totiž parametr message nadbytečný a měl by být implicitně daný třídou výjimky. Jaké rozumné message lze v kombinaci s VelkyParametr použít?

    Samozřejmě vypisovanou zprávu může určovat přímo třída bez message - dá se předefinovat metoda full_message v třídě výjimky. Zaráží mě ovšem, že na takovou věc nepamatoval autor Exception::Class v syntaxi importu. Jako by s takovým použitím příliš nepočítal.

    Máte na to nějaký názor?

  • 17. 7. 2008 21:01

    pht (neregistrovaný)

    Myslim si, ze jeho hlavnim ucelem je byt proste retezcovym atributem, jelikoz hodne vyjimek asi nejaky retezcovy atribut pouziva. (Napr. $!, nebo chybovou hlasku z SQL nebo LDAP nebo jineho systemu ... s VelkymParametrem asi moc ne.)

    Trochu divne ale je to, ze je to jediny atribut ktery se pouzije pri stringifikaci. Takze kdyz tam message nedate, tak vam neosetrena vyjimka nic nevypise a potichu chcipne. Samozrejme se da pretizit stringifikace, nebo nainstalovat rozumny SIG{__DIE__}, ale to je v rozporu s predikatem 'Laziness'. To pretizeni by melo jit celkem bezbolestne:

    package MyExc;
    
    our @ISA = qw/Exception::Class::Base/;
    
    sub full_message {
            return "blabla";
    }
    package RadaException;
    use Exception::Class (
            'SpatnyParametr' => {
                    isa             => 'MyExc'
            },
    ...a dal normalne
    

    a nebo to muzete znasilnit:

    *Exception::Class::Base::full_message = sub { ... };