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ý?"
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; ... }
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?
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 { ... };