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.

No comments: