ムース(Perl)

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 ); } } 

参照

参考文献