myslim, ze uzavery predevsim zprehlednuji kod
ono poouzit neco ve stylu
if ($debug) {
$get_addr = &prepare_load_addrs_from_array(@ARGV);
} else {
$get_addr = &prepare_load_addrs_from_dhcpconf();
}
while ( $addr = &$get_addr ) {
if ( &is_ftp_active($add) ) {
# save addr
}
}
je mnohem prehlednejsi a bude to nejspise i rychlejsi nez jine moznosti, nebo se mylim? ... :-)
Obavam se, ze to rychlejsi nebude. Snad krome pripadu, ze si pri vytvareni uzaveru neco predpocitate.
Pokud by vam hodne zalezelo na rychlosti tak bych doporucoval neco jako :
use constant DEBUG => scalar(@ARGV);
...
sub get_addr {
if (DEBUG) {
udelej neco s @ARGV
} else {
udelej neco s dhcpconf()
}
zbytek kodu
}
Optimalizator totiz uz pri kompilaci pozna ktera vetev toho if()u neni potreba a odoptimalizuje ji i ten test.
Samozrejme pouze v pripade, ze DEBUG je definovano jako konstanta uz pred tim if()em.
#uzavery se sdilenim promennych
sub prepare_sl {
my ($last) = @_;
my ( $rs_s, $rs_l );
$rs_s = sub {
if ( $last % 2 ) { $last++ }
else { $last += 2 };
print $last."\n";
};
$rs_l = sub {
if ( $last % 2 ) { $last += 2 }
else { $last ++ };
print $last."\n";
};
return ($rs_s, $rs_l );
}
( $dalsi_sudeA, $dalsi_licheA ) = prepare_sl(57);
( $dalsi_sudeB, $dalsi_licheB ) = prepare_sl(27);
&$dalsi_sudeA(); #58
&$dalsi_sudeA(); #60
&$dalsi_licheA(); #61
&$dalsi_licheB(); #29
&$dalsi_sudeB(); #30
&$dalsi_licheA(); #63
&$dalsi_licheB(); #31
# PS: neprisel nekdo nato jak vkladat do prispevku
# na rootu prog. kod? hodilo by se <PRE> a </PRE>
# nebo aslespon
Perl nepouzivam, ale zarazila me veta v uvodu clanku: "metoda shora-dolu se neda pouzit na velke projekty..." (volne).
Metoda shora-dolu je pomerne ustaleny termin pro dekompozici problemu na mensi (dilci) celky, kdy se zacina nejvyssi urovni - tedy tim co chceme ziskat. Postupne pridavame dalsi vrstvy, ktere poskytuji zakladnejsi funkce az se nakonec dostaneme na sluzby poskytovane programovacim jazykem.