simo tutrial
DESCRIPTION
Simo TutrialTRANSCRIPT
![Page 1: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/1.jpg)
簡単オブジェクト指向Simo 入門
![Page 2: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/2.jpg)
自己紹介 ハンドルネーム perlcodesample ブログ サンプルコードによる Perl 入門 年齢 28 歳 出身 奈良 職業 システムエンジニア 今はパフォーマ
ンス評価の仕事
![Page 3: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/3.jpg)
本日の話題 自作モジュール Simo の紹介
![Page 4: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/4.jpg)
Simo って何 ?
オブジェクト指向を簡単にするモジュール Moose よりも記述が簡潔 Class::Accessor よりは機能が豊富 Class::Accessor と Moose の中間
![Page 5: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/5.jpg)
Simo の特徴 その 1
アクセッサの定義が簡単にできる 用意された new フィールドにデフォルト値を設定したり、制
約をかけたりできる。 記法は Moose より簡単。より短く書ける。
![Page 6: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/6.jpg)
Simo の特徴 その 2
制約に違反したときに例外オブジェクトを投げる。 → 詳細なエラー処理が可能
オブジェクトを操作するメソッドを提供
![Page 7: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/7.jpg)
ここからはコードのサンプル
![Page 8: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/8.jpg)
クラス定義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](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/9.jpg)
クラスを使うuse Book;
my $book = Book->new( title => ‘Good news’, auhtor => ‘Kimoto’, price => 2000); 使い方は普通のクラスと同じ new がすでに準備されていて使うことができる。
![Page 10: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/10.jpg)
アクセッサのオプションの紹介
![Page 11: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/11.jpg)
デフォルト default
package Book;
use Simo;
sub price{ ac default => 2000 }
デフォルト値はフィールドに値がなかった場合に使用される。
![Page 12: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/12.jpg)
default の Moose との相違点package Book;use Simo;
sub author{ ac default => [ ‘Kiomoto’, ‘Tanaka’ ]} リファレンスはデータがコピーされる。 内部的には Storable::dclone を使用 オブジェクトの生成には使わない
![Page 13: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/13.jpg)
オブジェクトの構築 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](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/14.jpg)
auto_build の使い道
他のフィールドの値に基づいてオブジェクトを構築したい場合に使用する。
複雑なデフォルト値の設定を行い時に使用する。
データベースハンドルなどの構築に利用すると便利
![Page 15: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/15.jpg)
フィールドの制約 constrain
package Book; use Simo;
use Simo::Constrain qw( is_int );
sub price{
ac constrain => \&is_int
} 設定される値を制約する。 Simo::Constrain は制約関数を提供するモジュール
![Page 16: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/16.jpg)
制約違反に対する例外処理 制約違反を起こしたときは、 Simo::Error ク
ラスのオブジェクトが投げられる。 Simo::Error オブジェクトは、例外をキャッ
チしなかった場合は文字列として、キャッチした場合はオブジェクトとして利用できる。
例外を起こしたフィールドのキーや値、パッケージ名などの詳細な情報が取得できるため、細かな例外処理が行える。
![Page 17: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/17.jpg)
例外処理のサンプル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](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/18.jpg)
値のフィルタ filter
package Book;
use Simo;
sub title{ ac filter => sub{ uc } }
値を設定したときにフィルタが適用される。
![Page 19: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/19.jpg)
トリガ trigger
package Button;
use Simo;
sub color{ ac trigger => \&paint }
sub paint{ # 再描画の処理 }
値が設定された直後に呼び出されるフック
![Page 20: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/20.jpg)
読み取り専用 read_only
package Book;
use Simo;
sub title{
ac default => 'Good news',
read_only => 1
} 値が設定された場合は例外を発生させる。
![Page 21: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/21.jpg)
必要不可欠なフィールドpackage Book;use Simo;
sub title{ ac }sub author{ ac }sub REQUIRED_ATTRS{ qw/title author/} REQUIRED_ATTRS というメソッドで指定できる。
![Page 22: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/22.jpg)
継承package Magazine;
use Simo( base => 'Book' );
base で指定できる。
![Page 23: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/23.jpg)
ミックスインpackage Book;
use Simo( mixin => [ 'Class::Cloneable', 'Class::Comparable' ] );
Simo の mixin は単なる多重継承。 コードを読む人に明示することが目的。
![Page 24: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/24.jpg)
オブジェクトを便利に使う オブジェクトを便利に作成するだけでなく、
オブジェクトを便利に使うことができる。 Simo::Util の o ( オー関数 ) がオブジェク
ト指向に必要な便利なメソッドを提供 o( $book )->some_method のように使用す
る。
![Page 25: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/25.jpg)
ハッシュの取り出しo($book)->get_hash(
qw/title author/
);
{ title => 1, author => 2 } のようなハッシュを取り出すことができる。
![Page 26: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/26.jpg)
クローン、シリアライズ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](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/27.jpg)
バリデイター$book->validate( title => sub{ length $_ < 100 }, price => sub{ $_ > 0 } );
フィールドの値が正しい範囲にあるかチェックする
範囲内にないと例外 (Simo::Error) を投げるので、 eval でキャッチして詳細なエラーチェックが可能
![Page 28: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/28.jpg)
エンコード、デコードo($book)->decode_values(
'utf8',
q/title author/
);
オブジェクトが持つ複数のフィールドの値をデコード、エンコードすることができる。
配列の値、ハッシュの値もデコード、エンコードしてくれる。
![Page 29: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/29.jpg)
Simo まとめ
クラスの作成が簡単にできる。 詳細なエラーチェックができる。 オブジェクトを扱うための便利なメソッドを
提供。
オブジェクト指向のモジュールを作るときは、一度お試しください。非常に短いコードで、モジュールを記述できます。
![Page 30: Simo Tutrial](https://reader033.vdocuments.mx/reader033/viewer/2022061114/5462af4fb1af9f71408b5264/html5/thumbnails/30.jpg)
ご清聴ありがとうございました。