July 25th, 2006 by depesz | Tags: | 5 comments »
Did it help? If yes - maybe you can help me?

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?

  1. konieczność doinstalowania nowego modułu. nie jest to problem per se, ale niepotrzebna czynność
  2. konieczność modyfikowania kodu – zamiana wszędzie open na open_file
  3. jeśli gdziekolwiek robimy własną obsługę błędu open() to nie możemy zamienić na open_file
  4. 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.

  1. 5 comments

  2. # D-
    Jul 25, 2006

    Ale Exception to na mój mały rozumek nie to samo co die.
    (dd sensowności chwilowo abstrahując)

  3. Jul 25, 2006

    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.

  4. # D-
    Jul 25, 2006

    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 🙂

  5. Jul 25, 2006

    jeszcze nie oceniam książki. na razie oceniam jeden (w/g mnie) nietrafiony fragment.

  6. # m.
    Jul 26, 2006

    o fatal tez jest w tej ksiazce…

Leave a comment