Tuesday, July 29, 2008

Dispatch Table Versus Big elsif

Yang dimaksud dengan big elsif itu adalah baris kode yang seperti ini:

use strict;
use warnings;
use feature qw/say/;

my $input = <STDIN> ;
chomp $input;
if($input eq 'striker') {
move_striker();
} elsif($input eq 'winger') {
move_winger();
} elsif($input eq 'playmaker') {
move_playmaker();
} elsif($input eq 'stopper') {
move_stopper();
} else {
unknown_player_type();
}

sub move_striker {
say 'going to move striker';
# dan seterusnya
}

sub move_winger {
say 'going to move winger';
# dan seterusnya
}

sub move_playmaker {
say 'going to move playmaker';
# dan seterusnya
}

sub move_stopper {
say 'going to move stopper';
# dan seterusnya
}

sub unknown_player_type {
say 'i think this person is just a fan, not a player';
# dan seterusnya
}

Dulu, saya sering banget gunain big elsif, dan setiap melihat big elsif itu ada perasaan rendah diri, lalu browsing untuk mencari 'style' yang lebih baik dan akhirnya dapat satu keyword, yaitu menggunakan tehnik dispatch table.

Dispatch table bisa dikatakan adalah Hash, dimana value nya adalah reference ke suatu subrutin (atau bisa juga anonymous subroutine). Untuk kode di atas mungkin versi dispatch table nya akan seperti ini :

my %dispatch = (
striker => \&move_striker,
winger => \&move_winger,
playmaker => \&move_playmaker,
stopper => \&move_stopper,
unknown => \&unknown_player_type,
);

exists $dispatch{$input} ? $dispatch{$input}->()
: $dispatch{'unknown'}->();

Setelah melihat lagi style seperti ini, rasa rendah diri agak lumayan menghilang :)
Entah lah dari sisi performansi atau sisi lainnya, yang jelas dispatch table terasa lebih elegan.

Saturday, July 26, 2008

Closure

Mungkin, saya orang yang paling membenci istilah-istilah dalam dunia programming, mungkin saya sudah berpikiran rumit terlebih dahulu tentang istilah-istilah tersebut, misal object oriented, class, scaffolding dan lain sebagainya dan salah satunya adalah closure.

Namun setelah melihat penjelasan sedikit dari bukunya Damian Conway, ternyata closure itu hanyalah sebuah subrutin yang bisa mengakses variabel leksikal (In Perl, a closure is just a subroutine that refers to one or more lexical variables declared outside the subroutine it self, itu yang Damian Conway katakan).

my $var = 'foo';
sub my_sub {
print $var, "\n";
}


Itulah closure :)

Lalu apabila kita punya sebuah naked block seperti ini

{
my $var = 'foo';
}

Tentu saja $var tidak bisa di akses di luar naked block tersebut, hanya closure yang bisa mengakses $var

{
my $var ='foo';
sub print_sub {
print $var,"\n";
}
}
print_sub();

So that's closure :)