simo tutrial

30
簡簡簡簡簡簡簡簡簡簡 Simo 簡簡

Upload: yuki-kimoto

Post on 10-Nov-2014

1.429 views

Category:

Business


0 download

DESCRIPTION

Simo Tutrial

TRANSCRIPT

Page 1: Simo Tutrial

簡単オブジェクト指向Simo 入門

Page 2: Simo Tutrial

自己紹介 ハンドルネーム perlcodesample ブログ サンプルコードによる Perl 入門 年齢  28 歳 出身 奈良 職業 システムエンジニア 今はパフォーマ

ンス評価の仕事

Page 3: Simo Tutrial

本日の話題 自作モジュール Simo の紹介

Page 4: Simo Tutrial

Simo って何 ?

オブジェクト指向を簡単にするモジュール Moose よりも記述が簡潔 Class::Accessor よりは機能が豊富 Class::Accessor と Moose の中間

Page 5: Simo Tutrial

Simo の特徴 その 1

アクセッサの定義が簡単にできる 用意された new フィールドにデフォルト値を設定したり、制

約をかけたりできる。 記法は Moose より簡単。より短く書ける。

Page 6: Simo Tutrial

Simo の特徴 その 2

制約に違反したときに例外オブジェクトを投げる。 → 詳細なエラー処理が可能

オブジェクトを操作するメソッドを提供

Page 7: Simo Tutrial

ここからはコードのサンプル

Page 8: Simo Tutrial

クラス定義package Book;use Simo;

sub title{ ac }sub author{ ac }sub price{ ac }

use Simo; アクセッサ定義は ac 関数を呼ぶだけ。 use strict; use warnings; は Moose と同じく自動

Page 9: Simo Tutrial

クラスを使うuse Book;

my $book = Book->new( title => ‘Good news’, auhtor => ‘Kimoto’, price => 2000); 使い方は普通のクラスと同じ new がすでに準備されていて使うことができる。

Page 10: Simo Tutrial

アクセッサのオプションの紹介

Page 11: Simo Tutrial

デフォルト default

package Book;

use Simo;

sub price{ ac default => 2000 }

デフォルト値はフィールドに値がなかった場合に使用される。

Page 12: Simo Tutrial

default の Moose との相違点package Book;use Simo;

sub author{ ac default => [ ‘Kiomoto’, ‘Tanaka’ ]} リファレンスはデータがコピーされる。 内部的には Storable::dclone を使用 オブジェクトの生成には使わない

Page 13: Simo Tutrial

オブジェクトの構築 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 が自動で呼ばれる。

Page 14: Simo Tutrial

auto_build の使い道

他のフィールドの値に基づいてオブジェクトを構築したい場合に使用する。

複雑なデフォルト値の設定を行い時に使用する。

データベースハンドルなどの構築に利用すると便利

Page 15: Simo Tutrial

フィールドの制約 constrain

package Book; use Simo;

use Simo::Constrain qw( is_int );

sub price{

ac constrain => \&is_int

} 設定される値を制約する。 Simo::Constrain は制約関数を提供するモジュール

Page 16: Simo Tutrial

制約違反に対する例外処理 制約違反を起こしたときは、 Simo::Error ク

ラスのオブジェクトが投げられる。 Simo::Error オブジェクトは、例外をキャッ

チしなかった場合は文字列として、キャッチした場合はオブジェクトとして利用できる。

例外を起こしたフィールドのキーや値、パッケージ名などの詳細な情報が取得できるため、細かな例外処理が行える。

Page 17: Simo Tutrial

例外処理のサンプルuse Book;use Simo::Util qw( err );

my $book = eval{     Book->new(         price => 1900,     ) }; if( my $err = err ){ if( $err->attr eq ‘price’ ){ # やりたいエラー処理を行う。 }}

Page 18: Simo Tutrial

値のフィルタ filter

package Book;

use Simo;

sub title{ ac filter => sub{ uc } }

値を設定したときにフィルタが適用される。

Page 19: Simo Tutrial

トリガ trigger

package Button;

use Simo;

sub color{ ac trigger => \&paint }

sub paint{ # 再描画の処理 }

値が設定された直後に呼び出されるフック

Page 20: Simo Tutrial

読み取り専用 read_only

package Book;

use Simo;

sub title{

ac default => 'Good news',

read_only => 1

} 値が設定された場合は例外を発生させる。

Page 21: Simo Tutrial

必要不可欠なフィールドpackage Book;use Simo;

sub title{ ac }sub author{ ac }sub REQUIRED_ATTRS{     qw/title author/} REQUIRED_ATTRS というメソッドで指定できる。

Page 22: Simo Tutrial

継承package Magazine;

use Simo( base => 'Book' );

base で指定できる。

Page 23: Simo Tutrial

ミックスインpackage Book;

use Simo( mixin => [ 'Class::Cloneable', 'Class::Comparable' ] );

Simo の mixin は単なる多重継承。 コードを読む人に明示することが目的。

Page 24: Simo Tutrial

オブジェクトを便利に使う オブジェクトを便利に作成するだけでなく、

オブジェクトを便利に使うことができる。 Simo::Util の o ( オー関数 ) がオブジェク

ト指向に必要な便利なメソッドを提供 o( $book )->some_method のように使用す

る。

Page 25: Simo Tutrial

ハッシュの取り出しo($book)->get_hash(

qw/title author/

);

{ title => 1, author => 2 } のようなハッシュを取り出すことができる。

Page 26: Simo Tutrial

クローン、シリアライズmy $book_copy = o($book)->clone

my $book_str = o($book)->freeze;

my $book = o->thaw( $book_str );

クローンのための clone メソッド、シリアライズのための freeze, thaw メソッド。

Page 27: Simo Tutrial

バリデイター$book->validate( title => sub{ length $_ < 100 }, price => sub{ $_ > 0 } );

フィールドの値が正しい範囲にあるかチェックする

範囲内にないと例外 (Simo::Error) を投げるので、 eval でキャッチして詳細なエラーチェックが可能

Page 28: Simo Tutrial

エンコード、デコードo($book)->decode_values(

'utf8',

q/title author/

);

オブジェクトが持つ複数のフィールドの値をデコード、エンコードすることができる。

配列の値、ハッシュの値もデコード、エンコードしてくれる。

Page 29: Simo Tutrial

Simo まとめ

クラスの作成が簡単にできる。 詳細なエラーチェックができる。 オブジェクトを扱うための便利なメソッドを

提供。

オブジェクト指向のモジュールを作るときは、一度お試しください。非常に短いコードで、モジュールを記述できます。

Page 30: Simo Tutrial

ご清聴ありがとうございました。