MooseはPerlプログラミング言語のオブジェクトシステムの拡張です。その目的は[ 1 ] 、Perl 5に現代的なオブジェクト指向プログラミング言語の機能を導入し、オブジェクト指向Perlプログラミングの一貫性を高め、煩雑さを軽減することです。
特徴
Mooseはメタオブジェクトプロトコル(MOP)である を基盤として構築されていますClass::MOP。MOPを用いることで、MooseはMooseを使用するすべてのクラスに対して 完全な型イントロスペクションを提供します。
クラス
Moose を使用すると、プログラマーはクラスを作成できます。
- クラスには 0 個以上の属性があります。
- クラスには 0 個以上のメソッドがあります。
- クラスは0個以上のスーパークラス(親クラスとも呼ばれます)を持ちます。クラスはスーパークラスから継承します。Mooseは多重継承をサポートしています。
- クラスには0個以上のメソッド修飾子があります。これらの修飾子は、クラス自身のメソッド、祖先から継承されたメソッド、またはロールによって提供されるメソッドに適用できます。
- クラスは 0 個以上のロール (他のプログラミング言語では特性とも呼ばれます) を実行します。
- クラスにはコンストラクターとデストラクタがあります。
- クラスにはメタクラスがあります。
属性
属性は、それを定義するクラスのプロパティです。
- 属性には常に名前があり、その他の定義特性がいくつかある場合があります。
- 属性の特性には、読み取り/書き込みフラグ、型、アクセサー メソッド名、委任、既定値、遅延初期化などがあります。
役割
Mooseのロールはトレイトに基づいています。ミックスインと同様のタスクを実行しますが、継承ではなく水平方向に構成されます。また、インターフェースにも似ていますが、インターフェースの一部の実装とは異なり、デフォルト実装を提供できます。ロールはクラスだけでなく、個々のインスタンスにも適用できます。
- ロールには 0 個以上の属性があります。
- ロールには 0 個以上のメソッドがあります。
- ロールには 0 個以上のメソッド修飾子があります。
- ロールには 0 個以上の必須メソッドがあります。
拡張機能
CPANには多数のMoose拡張モジュールがあります。2012年9月現在、MooseX名前空間には266のディストリビューションに855個のモジュールが含まれています。[ 2 ]これらのほとんどは、Task::Mooseモジュールでオプションとしてインストールできます。[ 3 ]
例
これはクラスPointとそのサブクラスPoint3Dの例です。
パッケージPoint ; use Moose ; use Carp ; 'x'を持ちます=> ( isa => 'Num'、is => 'rw' )。 'y'を持ちます => ( isa => 'Num'、is => 'rw' )。サブクリア { my $self = shift ; $self- > x ( 0 ); $ self- > y ( 0 ); } sub set_to { @_ == 3またはcroak "引数の数が正しくありません" ; my $self = shift ; my ( $x , $y ) = @_ ; $self- > x ( $x ); $self- > y ( $y ); } Point3Dパッケージ; Mooseを使用 ; Carpを使用;'Point'を拡張します。 'z'がある=> ( isa => 'Num'、is => 'rw' ); 'clear'の後に=> sub { my $self = shift ; $self- > z ( 0 ); }; sub set_to { @_ == 4またはcroak "引数の数が正しくありません" ; my $self = shift ; my ( $x , $y , $z ) = @_ ; $self- > x ( $x ); $self- > y ( $y ); $self- > z ( $z ); } Point3Dset_to()クラスに新しいメソッドが追加されているため、 Point3Dインスタンスの場合、Pointクラスで定義されている同名のメソッドは呼び出されません。一方、このメソッドはサブクラスで置き換えられるのではなく拡張されるため、両方のメソッドは正しい順序で実行されます。 clear()
これは拡張機能を使用した場合も同様ですMooseX::Declare。
MooseX::Declare を使用します。 クラスPoint { 'x'を持ちます ( isa => 'Num'、is => 'rw' )。 'y'を持ちます( isa => 'Num'、is => 'rw' )。メソッドclear { $self- > x ( 0 ); $self- > y ( 0 ); } メソッドset_to ( Num $x , Num $y ) { $self- > x ( $x ); $self- > y ( $y ); } } クラスPoint3DはPointを拡張します { has 'z' => ( isa => 'Num'、is => 'rw' );クリア後 { $self- > z ( 0 ); } メソッドset_to ( Num $x , Num $y , Num $z ) { $self- > x ( $x ); $self- > y ( $y ); $self- > z ( $z ); } } 参照
- Raku (プログラミング言語) § オブジェクト指向プログラミング、Moose のインスピレーション
- Joose (フレームワーク)、Moose に触発されたJavaScriptフレームワーク
- Catalyst(ソフトウェア)、Mooseを使用したWebアプリケーションフレームワーク
参考文献
- ^ 「Moose - Perl用のポストモダンオブジェクトシステム」 。 2017年3月6日閲覧。
- ^ CPANのMoose拡張機能
- ^タスク::ムース