PerlにはOOP機能がありますが、それらが使用されることはほとんどありません。メソッドとプロパティを使用してPerlオブジェクトをどのように作成して使用しますか?
7 に答える
あなたは間違いなく見てみるべきですMoose
。
package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}
Mooseは、(とりわけ)コンストラクター、アクセサーメソッド、および型チェックを無料で提供します。
したがって、コードでは次のことができます。
my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15); # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5); # FAILS! Free type check.
良い出発点Moose::Manual
はMoose::Cookbook
基本的なものだけが必要な場合はMouse
、完全ではありませんが、コンパイル時のペナルティのほとんどがないものを使用することもできます。
ムース、間違いなく。
package Person;
use Moose;
has age => ( isa => Int, is => 'rw');
has name => ( isa => Str, is => 'rw');
1;
すぐに、new() メソッドと、'has' で定義したばかりの属性のアクセサ メソッドが無料で手に入ります。したがって、次のように言えます。
my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";
等々。それだけでなく、アクセサ メソッドは無料で型チェックされます (標準の型だけでなく、独自の型も定義できます)。さらに、サブクラス化のための「extends」、ロール/特性のための「with」、および優れた堅牢で保守可能な OO コードを作成するという実際の仕事に取り掛かることができるその他のあらゆる種類の素晴らしいものを取得します。
TMTOWTDIですが、これは機能します。
現在、私はObject :: InsideOutを使用しています。オブジェクトが必要なときはいつでも、それは非常に優れており、標準の祝福されたハッシュオブジェクトよりも多くの機能を提供します。そうは言っても、もし私が新しいプロジェクトを始めていたら、私はムースを真剣に見ていました。
公式のPERLドキュメントを読むのは良いことですが、独自のオブジェクトフレームワークをロールしたり、ハッシュを使用してオブジェクトを構築したりすることはお勧めしません。簡単な道を進み、オブジェクトの「プライベート」変数に直接「ピーク」するのは遠いです。カプセル化を完全に破り、オブジェクトをリファクタリングしたいときにこれが戻ってきます。
Perl オブジェクトは単なる bless ハッシュではありません。彼らは祝福された参照です。それらは bless されたハッシュ参照である可能性がありますが (ほとんどの場合はそうです)、bless されたスカラー参照または配列参照でも同じように簡単に使用できます。
CPANサイトの公式チュートリアルは良いです。
CodeProjectにはCamelPOOPという良い記事もあります。
Perl で OO を実行する場合は、Moose を参照することを強くお勧めします。ただし、Perl での OO の意味を理解していないと、あまり役に立ちません。Perl OO が内部でどのように機能するかをよりよく理解するために、ブログに概要を書きました。
データ構造の観点から見ると、オブジェクトはいくつかの追加機能を備えた参照です。インタプリタは、これらの特別な参照をオブジェクトとして扱うことを知っています。これは、それらがキーワード「bless」で「祝福」されているためです。祝福された参照には、オブジェクトであることを示すフラグが含まれています。基本的に、これはメソッドを定義して呼び出すことができることを意味します。
たとえば、基本的な hashref を作成した場合、これは機能しません: $hashref->foo();
しかし、blessed hashref (別名オブジェクト) を作成すると、これは機能します: $blessed_hashref->foo();
Moose は Perl の OOP の優れたモジュールです。これは、強制可能な OO レイヤーを作成し、アクセサー メソッドを自動的に処理するため、多数のゲッターとセッターを定義する必要がないためです。Devel::Peak を使用して Perl インタープリターがオブジェクトを格納する方法を確認することに興味がある場合は、上記のブログ エントリへのリンクをたどってください。
一見すると、各クラスはパッケージです。パッケージ変数@ISA を(できればコンパイル時に)設定して、(必要に応じて複数の) 継承を確立します。bless (REFERENCE [, CLASSNAME]);を使用して、既存のデータ (多くの場合、常にではありませんが、インスタンス変数を格納するために使用される匿名ハッシュ) からオブジェクトを作成します。$obj->methodname(@ARGS) のようなオブジェクト メソッドと、"CLASSNAME"->methodname(@ARGS) のようなクラス メソッドを呼び出します。多重継承メソッドの解決順序は、mroを使用して変更できます。
これはやや最小限であり、カプセル化を強制しないため、より多くの機能または異なる機能を提供するさまざまなモジュールが多数あります。