Upload
yuki-kimoto
View
581
Download
0
Embed Size (px)
DESCRIPTION
Perl module Simo Tutrial
Citation preview
簡単オブジェクト指向Simo 入門
自己紹介 ハンドルネーム perlcodesample ブログ サンプルコードによる Perl 入門 年齢 28 歳 出身 奈良 職業 システムエンジニア 今はパフォー
マンス評価の仕事
本日の話題 自作モジュール Simo の紹介
Simo って何 ? オブジェクト指向を簡単にするモジュー
ル Moose よりも記述が簡潔 Class::Accessor よりは機能が豊富 Class::Accessor と Moose の中間
Simo の特徴 その 1 アクセッサの定義が簡単にできる 用意された new フィールドにデフォルト値を設定したり、
制約をかけたりできる。 記法は Moose より簡単。より短く書ける。
Simo の特徴 その 2 制約に違反したときに例外オブジェクトを
投げる。 → 詳細なエラー処理が可能 オブジェクトを操作するメソッドを提供
ここからはコードのサンプル
クラス定義package Book;use Simo;
sub title{ ac }sub author{ ac }sub price{ ac }
use Simo; アクセッサ定義は ac 関数を呼ぶだけ。 use strict; use warnings; は Moose と同じく自動
クラスを使うuse Book;
my $book = Book->new( title => ‘Good news’, auhtor => ‘Kimoto’, price => 2000); 使い方は普通のクラスと同じ new がすでに準備されていて使うことができる。
アクセッサのオプションの紹介
デフォルト default
package Book;use Simo;
sub price{ ac default => 2000 }
デフォルト値はフィールドに値がなかった場合に使用される。
default の Moose との相違点package Book;use Simo;
sub author{ ac default => [ ‘Kiomoto’, ‘Tanaka’ ]} リファレンスはデータがコピーされる。 内部的には Storable::dclone を使用 オブジェクトの生成には使わない
オブジェクトの構築 auto_buildsub host{ ac defalut => ‘some.host’ }
sub net_ftp{ ac auto_build => 1 }sub build_net_ftp{ my $self = shift; $self->net_ftp( Net::FTP->new( $self->host ) )} net_ftp を呼ぶと build_net_ftp が自動で呼ばれる。
auto_build の使い道 他のフィールドの値に基づいてオブジェク
トを構築したい場合に使用する。 複雑なデフォルト値の設定を行い時に使用
する。 データベースハンドルなどの構築に利用す
ると便利
フィールドの制約 constrain
package Book; use Simo;use Simo::Constrain qw( is_int );
sub price{ ac constrain => \&is_int } 設定される値を制約する。 Simo::Constrain は制約関数を提供するモジュー
ル
制約違反に対する例外処理 制約違反を起こしたときは、 Simo::Error
クラスのオブジェクトが投げられる。 Simo::Error オブジェクトは、例外を
キャッチしなかった場合は文字列として、キャッチした場合はオブジェクトとして利用できる。
例外を起こしたフィールドのキーや値、パッケージ名などの詳細な情報が取得できるため、細かな例外処理が行える。
例外処理のサンプルuse Book;use Simo::Util qw( err );
my $book = eval{ Book->new( price => 1900, ) }; if( my $err = err ){ if( $err->attr eq ‘price’ ){ # やりたいエラー処理を行う。 }}
値のフィルタ filter
package Book;use Simo;sub title{ ac filter => sub{ uc } }
値を設定したときにフィルタが適用される。
トリガ trigger
package Button;use Simo;
sub color{ ac trigger => \&paint } sub paint{ # 再描画の処理 }
値が設定された直後に呼び出されるフック
読み取り専用 read_only
package Book;use Simo;sub title{ ac default => 'Good news', read_only => 1} 値が設定された場合は例外を発生させる。
必要不可欠なフィールドpackage Book;use Simo;
sub title{ ac }sub author{ ac }sub REQUIRED_ATTRS{ qw/title author/} REQUIRED_ATTRS というメソッドで指定できる。
継承package Magazine;use Simo( base => 'Book' );
base で指定できる。
ミックスインpackage Book;use Simo( mixin => [ 'Class::Cloneable', 'Clas
s::Comparable' ] );
Simo の mixin は単なる多重継承。 コードを読む人に明示することが目的。
オブジェクトを便利に使う オブジェクトを便利に作成するだけでな
く、オブジェクトを便利に使うことができる。
Simo::Util の o ( オー関数 ) がオブジェクト指向に必要な便利なメソッドを提供
o( $book )->some_method のように使用する。
ハッシュの取り出しo($book)->get_hash( qw/title author/ );
{ title => 1, author => 2 } のようなハッシュを取り出すことができる。
クローン、シリアライズmy $book_copy = o($book)->clone
my $book_str = o($book)->freeze; my $book = o->thaw( $book_str );
クローンのための clone メソッド、シリアライズのための freeze, thaw メソッド。
バリデイター$book->validate( title => sub{ length $_ < 100 }, price => sub{ $_ > 0 } );
フィールドの値が正しい範囲にあるかチェックする
範囲内にないと例外 (Simo::Error) を投げるので、eval でキャッチして詳細なエラーチェックが可能
エンコード、デコードo($book)->decode_values( 'utf8', q/title author/);
オブジェクトが持つ複数のフィールドの値をデコード、エンコードすることができる。
配列の値、ハッシュの値もデコード、エンコードしてくれる。
Simo まとめ クラスの作成が簡単にできる。 詳細なエラーチェックができる。 オブジェクトを扱うための便利なメソッド
を提供。
オブジェクト指向のモジュールを作るときは、一度お試しください。非常に短いコードで、モジュールを記述できます。
ご清聴ありがとうございました。