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

Simo Tutrial

Embed Size (px)

DESCRIPTION

Perl module Simo Tutrial

Citation preview

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_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 が自動で呼ばれる。

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', 'Clas

s::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

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