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.
