正直なところ、Perl の未加工の OO プリミティブに関する知識が、新しいコードを作成する上でどれほど価値があるかわかりません。@ISA や "use base" や "bless" をコードで長い間使用していません。私が行う OO はすべて Moose MOP を介して行われます。(もちろん、インスタンスを rebless しますが、単に "bless" する代わりに $meta->rebless_instance を使用します。よりクリーンです!)
とにかく、私はまずムースを独学します。簡単に始めてすぐに生産性を高めることができ、Perl とプログラミング全般に習熟するにつれて詳細を理解できます。
例として:
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10'; # for 'say'
use MooseX::Declare;
class Point {
has [qw/x y/] => ( is => 'ro', isa => 'Num', required => 1 );
method new_from_ordered_pair(ClassName $class: Num $x, Num $y){
return $class->new( x => $x, y => $y );
}
method distance(Point $a: Point $b){
return sqrt( ($a->x - $b->x)**2 + ($a->y - $b->y)**2 );
}
}
my $origin = Point->new_from_ordered_pair(0,0);
my $point = Point->new_from_ordered_pair(3,4);
say '(3,4) is '. $point->distance($origin). ' units away from the origin.';
Perl の実装の詳細と格闘する必要がなくなったことに注目してください。Perl で OO を行う方法ではなく、プログラムの詳細について簡単に心配することができます。「Point.pm」ファイルを作成する必要さえありません。クラス定義をインラインにすることができます。
また、このコードは、Perl や Moose (または MooseX::Declare) の詳細に精通していないプログラマーでも、ほとんどすべてのプログラマーにとってすぐに理解できると思います。
(ところで、この例は、メソッド シグネチャの ":" 構文で少し奇妙に機能しました。通常、最初の引数として $self と呼ばれる自分自身のインスタンスを取得します。シグネチャの : の前に何か他のものを指定すると、変数の型と名前を変更することができます.また、毎回 new の引数として型を入力する必要がないように、"new_from_ordered_pair" も書きましx => $x, y => $y
た.これは単なる砂糖です.
最後に、ここでは「無料」で多くのことを得ることができます。これらを試して、役立つエラー メッセージに注意してください。
Point->new; # x is required
Point->new_from_ordered_pair('foo', 'bar'); # x needs to be a number
$point->distance('some string'); # $b needs to be a Point
これらはすべて無料で入手でき、プログラムのデバッグが容易になります。これを避ける理由はありません。これにより、プログラミングが本当に楽しくなります (そして、プログラムの信頼性が高まります... 無料で!)
あ、もう一つ。Moose を使用すると、クラスをイントロスペクトできます。これはすぐには重要ではないかもしれませんが、あると便利です。Devel::REPL を開き、「do "test.pl"」と入力して Point クラスをロードし、次のように言います。
map { $_->name } Point->meta->get_all_attributes;
結果は['x', 'y']
です。ソースコードがなくても、クラスが持つ属性を見つけることができます。「普通の」Perl OO でそれをやってみてください。(この種のことが、豊富な MooseX:: 名前空間を可能にします。イントロスペクションは必要ないかもしれませんが、CPAN から信頼できるモジュールを使用する機能を楽しむことができます。)