54
オブジェクト指向言語Perl id:lapis25 [email protected] Kansai.pm Meeting #8/20070310

OO language Perl

Embed Size (px)

DESCRIPTION

オブジェクト指向言語Perl Kansai.pm meeting #08

Citation preview

Page 1: OO language Perl

オブジェクト指向言語Perl

id:[email protected]

Kansai.pm Meeting #8/20070310

Page 2: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 2

……オブジェクト指向言語??

Perlオブジェクト指向言語

Larry Wall 著

Page 3: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 3

この発表は…• Perlに関して人前で話すのははじめて• オブジェクト指向の専門家でもない• ネタはほとんどなし…• ご容赦をヽ(;́Д`)ノ

Page 4: OO language Perl

「混沌とした話をしているね.もっと抽象的にいいなさい」

(朽ちる散る落ちる/森博嗣)

Page 5: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 5

Perlのオブジェクト指向の基本

• オブジェクト →単なるリファレンス

• クラス →単なるパッケージ

• メソッド →単なるサブルーチン

Page 6: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 6

終了

Page 7: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 7

もっと詳しく!

Page 8: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 8

基本の詳細

Page 9: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 9

クラス

Page 10: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 10

クラスを作成する

• クラスを作るにはパッケージを使う• パッケージはPerlにおける名前空間

Page 11: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 11

クラスの例

package Class;

これだけ

Page 12: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 12

メソッド

Page 13: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 13

メソッドを作成する• メソッドとは,特定のクラスに関連づけられたサブルーチン

• パッケージの中にサブルーチンを書くだけで,パッケージに関連づけられる

Page 14: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 14

メソッドの例

package Class;

sub method { #処理}

Page 15: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 15

メソッドの呼び出し方

$obj_ref->method('args');

Class::method($obj_ref, 'args');

Page 16: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 16

メソッドでリファレンスを使用する

package Class;sub method {    my ($self, @args) = @_; #処理}

• 第1引数として受け取った,オブジェクトのリファレンスを$selfに代入する

Page 17: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 17

オブジェクト

Page 18: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 18

「何をできるのか

 自分で知っているデータ

 なんだよ!!」

オブジェクトとは…

Page 19: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 19

オブジェクトを作成する

• bless関数を使う• blessとは「祝福する」というような意味• blessの対象はあくまでリファレンスで指される「モノ」

Page 20: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 20

オブジェクト作成の例

bless $hash_ref, 'Class';

• マークする「モノ」へのリファレンス• クラスの名前

Page 21: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 21

#A bless実行前

bless $hash_ref, 'Class';

$hash_ref

A

print ref($hash_ref);#HASH

#B bless実行後print ref($hash_ref);#Class

'Perl'_name

'script'_type

'01'_id

B

'Perl'_name

'script'_type

'01'_id

Class

Page 22: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 22

基本は以上

Page 23: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 23

その他の機構

Page 24: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 24

コンストラクタ

• 単なるサブルーチン• 慣習としてnewという名前がつけられる• blessされたリファレンスを返す

Page 25: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 25

コンストラクタの例

package Class;sub new { my ($class, @args) = @_; return bless { @args }, $class;}

Page 26: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 26

コンストラクタの呼び出し方

$obj_ref = Class->new( $id, $type );

$obj_ref = Class::new('Class',$id, $type);

Page 27: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 27

デストラクタ

• DESTROYという名前のサブルーチン• オブジェクトが消滅する寸前に呼び出される• あまり使わない?

Page 28: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 28

継承

Page 29: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 29

Perlの継承とは

• メソッドの継承のみ• 実際には継承するクラスからメソッドを検索する仕組み

• 属性データの直接継承はしない• コンストラクタ・デストラクタの階層的呼び出しはしない

Page 30: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 30

継承する方法• 配列@ISAを使う• いま(5.005以降)はbaseプラグマを使う• 複数のクラスからの継承を行うには,複数のクラス名を記述する(多重継承)

Page 31: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 31

継承の例

package PerlHacker;use base qw( Programmer Obfuscator );

package Programmer;use base qw( Coder Documenter );

Page 32: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 32

継承の構造

Programmer Obfuscator

PerlHacker

Coder Documenter

use base qw( Programmer Obfuscator );

use base qw( Coder Documenter );

Page 33: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 33

メソッド検索は深さ優先

Programmer Obfuscator

PerlHacker

Coder Documenter

1

2

3 4

5

Page 34: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 34

その他の継承に関する機構• 疑似パッケージ UNIVERSAL‒ すべての親クラスからメソッドが見つからなかった場合に呼び出される‒ あらゆるメソッドが追加可能‒ 汚染に注意

• 疑似パッケージ SUPER‒ 現在のクラスの親クラスを指す‒ 継承と同様の検索を行う

Page 35: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 35

その他の手法

Page 36: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 36

アクセサ

• Perlには組み込まれていない• 自分で作成する必要がある• 以前はよくAUTOLOADという機能を使って作成されていた→やめた方がよい• 実際はモジュールを使うことが多い

Page 37: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 37

カプセル化

• Perlには組み込まれていない• _(アンダスコア)で始まるメソッド・属性は内部からのみ利用される,という慣習がある• クロージャを使ったカプセル化ができる• 実際はモジュールを使うことが多い

Page 38: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 38

Perlはオブジェクト指向もTMTOWTDI

Page 39: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 39

blessできるものは他にも• ハッシュ• 配列• スカラ• 正規表現• サブルーチン• 型グロブ

Page 40: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 40

かなり省略しました• すべての先祖クラスのメソッドを呼び出す• データ継承• ポリモーフィズム• ダックタイピング• Singleton• etc...

Page 41: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 41

すべて説明すると本が書けます

Page 42: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 42

いまどきのやり方

Page 43: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 43

知りたいなら…

Catalystを見るんだ!

Page 44: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 44

Catalystで使われている•Class::Accessor(::fast)

–アクセサ.コンストラクタも作成•Class::Data::Inheritable

–継承可能,オーバーライド可能なクラスデータ作成

Page 45: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 45

多重継承関連のモジュール• NEXT

–これもCatalystで使われている–継承関連を検索して次のクラスを指すための疑似クラス

• Class::C3– DBICで使われている–多重継承時のメソッド検索順番決定のためのアルゴリズムC3を使ったプラグマモジュール.NEXT使うより高速(らしい)

Page 46: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 46

Class::Std

• Damian先生おすすめ• インサイドアウトオブジェクト• 完全なカプセル化を提供• Perlベストプラクティスで解説

Page 47: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 47

Perl6

Page 48: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 48

Perl6は本物のOOPらしい

• ちゃんと調べてません :-(• 「まるごとPerl」に紹介が少しだけある

Page 49: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 49

まとめ

Page 50: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 50

Perlのオブジェクト指向は…どうみても

あとづけなの…

本当にありがt(ry

Page 51: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 51

Perlのオブジェクト指向は…

• 後付けです• 最低限が故に作り方でなんでもできる• なんでもできるが故に複雑• 意識せずに使ってることも多い• 使わないことも選択肢の一つ

Page 52: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 52

Kansai.pm Perl勉強会

• Perlの勉強とPerlerの交流を目的• テーマを決めてみんなで勉強• やり方もみんなで考えよう• 第0回目として4月か5月の開催を画策

Page 53: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 53

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

Page 54: OO language Perl

070310 Kansai.pm Meeting #8/01-Perl-oo 54

参考文献等• http://d.hatena.ne.jp/lapis25/20070223/1172170845 にまとめてあります

• 自由に使って欲しいはてなちゃん画像(http://d.hatena.ne.jp/km37/20061115#1163528818 )

• 自由に使えるナオヤ素材(http://beta.g.hatena.ne.jp/sugio/20060221/naoya )

• 誰でも貼れる小飼弾ジェネレーター(http://blogpal.seesaa.net/article/28486173.html)