w firmie mamy kupioną książkę “perl hacks" napisaną przez chromatic‘a z damianem conwayem i curtisem poe.
książkę czytał znajomy, przeczytał. trafiła do mnie.
otworzyłem na chybił – trafił. i znalazłem taki o to kawałek:
zaczęło się od tego, że funkcja open() zwraca kod błędu. a lepiej by było by zwracała exceptiona.
rozwiązanie z książki:
use File::Exception; sub open_file { my ($name, $mode) = @_; open my $fh, $mode, $name or File::Exception->throw( "file" => $name, "mode" => $mode, "error" => "$!" ); return $fh; }
no i potem wszędzie w kodzie zamieniamy open(…) na open_file(…).
eh. i to ma być efektywne programowanie?
jakie widzę z tym problemy?
- konieczność doinstalowania nowego modułu. nie jest to problem per se, ale niepotrzebna czynność
- konieczność modyfikowania kodu – zamiana wszędzie open na open_file
- jeśli gdziekolwiek robimy własną obsługę błędu open() to nie możemy zamienić na open_file
- jeśli gdziekolwiek używamy open() do np. czytania z pipe'a, to też nie możemy zamienić
ogólnie – przerobienie istniejącego kodu w/g tej regułki uważam, za całkowitą porażkę.
a jak zrobić to sensownie? użyć standardowego w perlu modułu fatal:
use Fatal qw(open);
i to wszystko. nie trzeba przerabiać kodu – wystarczy jedna deklaracja. a jeśli gdzieś mamy własny handling? wystarczy zmodyfikować use'a:
use Fatal qw(:void open);
no i dodatkowo – fatal potrafi obsłużyć nie tylko open. zasadniczo można przez niego zrobić exceptiony do praktycznie każdej funkcji/builtin'a.
i w ten oto sposób zraziłem się do książki poprzez przeczytanie losowego kawałka. zobaczymy co będzie dalej.
Ale Exception to na mój mały rozumek nie to samo co die.
(dd sensowności chwilowo abstrahując)
exceptiony w perlu są właśnie robione poprzez die (no albo croak 🙂
różnią się od “normalnych” tym, że przekazujesz nie stringa tylko obiekt.
i tak, wiem, że przekazując exceptionowi obiekt można zrobić jakieś fajne catch() określonego typu.
ale jeśli mówimy o tym by w ogóle przejść ze zwracania kodu błędu na exception – to nie ma (w/g mnie) sensu rzucać ludzi na głęboką wodę od razu dając coś takiego.
a nawet chcąc od razu rzucać obiektowe exceptiony nie wiem czy użyłbym tak skomplikowanego rozwiązania.
To zależy co w tej książce było wcześniej/później (bo może rozwiązanie wynika z “w tym rozdziale uczymy Xa i Yka).
Po bożemu pewnie trzeba było to napisać tak, jak jest napisany Fatal – za pomocą typeglobów. Może właśnie “wrzucania na głęboką wodę” typeglobów chcieli uniknąć 🙂
Książki nie znam, ale po jednym fragmencie bym jej nie oceniał.
Inna sprawa, że ostatnio zaglądam od czasu do czasu do polskiej wersji Perl Best Practices Conwaya i niektóre praktyki (choć ideologicznie słuszne) są cokolwiek mało naturalne. Więc jest też jakaś szansa, że za ww. przykładem kryje się jakaś ideologia 🙂
jeszcze nie oceniam książki. na razie oceniam jeden (w/g mnie) nietrafiony fragment.
o fatal tez jest w tej ksiazce…