Mooseメモ

業務メモ。

Class::Accessor::Fast を使って書かれたモジュール群を Moose を使って書き換え中。。
使い始めてまだ3日くらい。使いこなせるようにがんばる。

Mooseについて

Mooseは Meta Object Protocol (MOP) という概念を採用したオブジェクト定義の技法を提供する。
(Class::MOP のラッパー)
Webアプリケーションフレームワークの Catalyst も5.8系からMooseベースになったとのこと。

型制約

Mooseで指定したアトリビュートは、生成されたアクセサで値を設定する際にバリデーションを走らせることができ、has に渡す isa 引数に型を指定することによってトリガーされる。以下は組み込みで定義されている型制約の図。Maybe[‘a] は、例えば Maybe[Int] と指定した場合、Int または undef として扱われる。

遅延評価

必要な時だけ値が計算されるので計算量を低減できる。アトリビュートの初期化において、複数の値から1つのオブジェクトを生成する時などに利用する。has の lazy_build フラグをセットすると、初期化時に_build_”アトリビュート名” という名前のメソッドを自動的に探索して実行する。

・確認

・出力結果

Role, Traits

Role を使うと機能(API)中心の設計ができるようになる。

また、Moose 0.89_01以降には、ネイティブトレート (native traits)が組み込まれている。
(以前のバージョンでは、MooseX::AttributeHelpers の metaclass などを使って実現)
以下は、Role, traits を使ったオブザーバパターンの実装例。

・クライアント

Role, traits を使うことでこんな感じで簡潔に記述できる。また、アトリビュートやサブルーチンが記述された Role を with したクラス内では、その Role のアトリビュートにアクセスでき、サブルーチンも呼び出すことができる (Rubyのmix-inのような使い方)。

他の機能についてもちょっとずつ調べて追記する予定。

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です