simo tutrial
DESCRIPTION
Simo TutrialTRANSCRIPT
簡単オブジェクト指向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_build
sub 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', 'Class::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 まとめ
クラスの作成が簡単にできる。 詳細なエラーチェックができる。 オブジェクトを扱うための便利なメソッドを
提供。
オブジェクト指向のモジュールを作るときは、一度お試しください。非常に短いコードで、モジュールを記述できます。
ご清聴ありがとうございました。