JAMADAM.COM

RSS Subscribe to my RSS feed

Stripe Calendar

Sep, 2010
Aug 1516171819202122232425262728293031 Sep 123456789

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が届いた。けど、まだ読めてない。