Entry: Perl - クラスの定数引数はインスタンスメソッドで指定する
Perl - クラスの定数引数はインスタンスメソッドで指定する
Initial post:
2010.05.21
|
Last modified:
2010.05.21
Perlでやたら定数風関数を使うようにしてみた。最近この方針を徹底しているけど、後で後悔しなきゃいいが。
use strict; use warnings; use Switch; $a = MyClass1->new; $a->crud($a->MODE_CREATE); $a->crud($a->MODE_READ); $a->crud($a->MODE_UPDATE); $a->crud($a->MODE_DELETE); package MyClass1; use strict; use warnings; use Switch; sub MODE_CREATE() {1} sub MODE_READ() {2} sub MODE_UPDATE() {3} sub MODE_DELETE() {4} sub new { return bless {}, shift; } sub crud { my ($self, $mode) = @_; switch ($mode) { case MODE_CREATE {print "create\n"} case MODE_READ {print "read\n"} case MODE_UPDATE {print "update\n"} case MODE_DELETE {print "delete\n"} } }
名前つき引数としてのハッシュ引数は可読性が高いんだけど、名前を文字列で入力するとミスしやすい。なので下記のようにする。
use strict; use warnings; my $ins = MyClass2->new(); print $ins->some_method( $ins->ARG_NAME => 'saito', $ins->ARG_ADDR => 'sapporo' ); print "\n"; package MyClass2; use strict; use warnings; sub ARG_NAME() {1} sub ARG_ADDR() {2} sub new { return bless {}, shift; } sub some_method { my ($self, %hash) = @_; return $hash{ARG_NAME()}. ' lives in '. $hash{ARG_ADDR()}; }
定数風関数はメソッド呼び出しできるので
- アロー演算子により、クラスが期待する値だけがIDEの補完候補にあがる(クラスを取り違える心配がない)。
- パッケージ修飾が不要(本当の定数だと$Path::To::Module::ARG_NAMEとか長い)。
- 継承もできる(ただし主要なIDEでは継承先まで補完できない)。
Perl Best Practiceが届いた。けど、まだ読めてない。
Subscribe to my RSS feed