たとえば、$fooの中身によって似たような処理をするメソッドを使い分けたいみたいとき、こう書くより、
sub some_method { my ($self, $foo, $args) = @_; if ($foo eq 'bar') { Some::Class->do_bar($args); } else { Some::Class->do_baz($args); } }
こう書いた方が好み。
sub some_method { my ($self, $foo, $args) = @_; $method = $foo eq 'bar' ? 'do_bar' : 'do_baz'; Some::Class->$method($args); }
さらに言うとこっちの方がすっきり。
my $METHOD_MAP = +{ bar => 'do_bar', baz => 'do_baz', }; sub some_method { my ($self, $foo, $args) = @_; $method = $METHOD_MAP->{$foo}; Some::Class->$method($args); }
メソッドの中身が薄いならこういう書き方してもいいかな。
my $METHOD_MAP = +{ bar => sub { # do something }, baz => sub { # do something }, }; sub some_method { my ($self, $foo, $args) = @_; $METHOD_MAP->{$foo}->($args); }
でもたぶん、メソッドでなく渡すクラスで処理を分ける方が設計的には良い場合が多いかな。case-by-caseだけど。
sub some_method { my ($self, $foo_class, $args) = @_; $foo_class->run($args); }
何も結論が無いけど、できる限り分岐は少なくしたいので一番上みたいなはちょっと少なくしたいなと思ったのでした。