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