Object Oriented Programming in Perl

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

1 C++ における OOP を用いた 書き方講座 H 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
© 2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます prototype.js と Perl で Ajax 株式会社はてな 伊藤 直也
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也. 講義計画(あくまで予定) 第 1 回 プログラミング言語の種類と歴史 第 2 回 eclipse の基本操作 第 3 回 eclipse のデバッグ機能 第 4 回 構造化プログラミングの復習 第 5 回 演習 第 6 回 構造化指向からオブジェクト指向へ.
なぜ今Pythonか? Pythonをお薦めする18の理由
Ex7. Search for Vacuum Problem
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
Ex8. Search for Vacuum Problem(2)
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
アルゴリズムとデータ構造1 2007年6月12日
最適化ソルバーのための Python言語入門
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
Ruby勉強会(第1回) 2006/06/29 竹内豪.
アルゴリズムとプログラミング (Algorithms and Programming)
ビューとコントローラ.
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
ピカチュウによる オブジェクト指向入門 (新版)
PHPの基礎と開発手法 Based on PHP5
応用プロジェクト後半 第2回(11/26) 担当:奥田教授
アルゴリズムとデータ構造 2011年6月20日
RMI ソフトウェア特論 第6回 /
コンパイラの解析 (2) GCJのデータ構造 - 1.
~手続き指向からオブジェクト指向へ[Ⅱ]~
第12回 2007年7月13日 応用Java (Java/XML).
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
JAVA入門後期⑩ 情報処理試験例題解説.
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
図書館職員のための アプリケーション開発講習会
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.
応用プロジェクト後半 第2回(12/11) 担当:奥田教授
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
Bellwork: There is a new Japanese student at North.
応用プロジェクト後半 第2回(12/5) 担当:奥田教授
変数,式,関数,クラス,コンストラクタ, クラスの属性アクセス,メソッド,親クラ スからの継承
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
Ex7. Search for Vacuum Problem
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
第8回放送授業.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
18. Case Study : Imperative Objects
cp-3. サブクラス,継承 (C++ オブジェクト指向プログラミング入門)
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
アルゴリズムとデータ構造 2012年6月21日
演算子のオーバーロード.
君ならどうする – ls-lRシェル Python編
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

Object Oriented Programming in Perl Tatsuhiko Miyagawa miyagawa@bulknews.net Edge, Co.,Ltd. / Shibuya Perl Mongers LL Saturday 2003

アジェンダ Perl OO Basic Perl OO Advanced 事例紹介 名前空間とbless 継承/デストラクタ AUTOLOAD/overload Perl OO Advanced Design Patterns Mix-in, AOP 事例紹介

Perl OO Basic Object-oriented Perl is a small amount of additional syntax and semantics, added to the existing imperative features of the language. Damian Conway in “Object Oriented Perl”

クラス/オブジェクト package と bless クラスは名前空間(package)で定義 メソッドはクラス内のサブルーチン package Dog; sub new { my($class, $name) = @_; bless { name => $name }, $class; } sub bark { my $self = shift; print “bark: $self->{name}”; use Dog; my $dog = Dog->new(‘Snoopy’); $dog->bark();

継承 @ISA 配列で表現(is-a) base プラグマ使用を推奨 多重継承も可能 package Animal; sub run { my $self = shift; print “running!”; } package Dog; # @Dog::ISA = qw(Animal); use base qw(Animal); sub bark { } use Dog; my $dog = Dog->new(‘Snoopy’); $dog->bark(); # Dog::bark $dog->run(); # Animal::run

デストラクタ DESTROYメソッド オブジェクト消滅時に実行 リファレンスカウンタ package Dog; sub DESTROY { my $self = shift; print “$self->{name}: Bye!”; } use Dog; my $dog1 = Dog->new(‘Scooby’); { my $dog2 = Dog->new(‘Scrappy’); } ! Scrappy: Bye! ! Scooby: Bye!

AUTOLOAD 未定義メソッドをキャッチ アクセサの自動生成 メソッドのキャッシング・遅延ロード package Dog; use vars qw($AUTOLOAD); my $accessors = { name => 1 }; sub AUTOLOAD { my $self = shift; (my $method = $AUTOLOAD) =~ s/.*://; return $self->{$method} if $accessors->{$method}; die “Unknown method: $method” } my $dog = Dog->new(‘Snoopy’); my $name = $dog->name();

演算子オーバーロード overload プラグマを使用 5.6以降は演算子が増えた fallback オプション package Dog; sub new { my($class, $name, $weight) = @_; # … } use overload q(“”) => \&name, q(0+) => \&weight, fallback => 1; sub name { shift->{name} } sub weight { shift->{weight} } my $dog = Dog->new(“Snoopy”, 13.5); printf “name is %s, weight is %f”, $dog, $dog;

UNIVERSAL すべてのオブジェクトの祖先クラス can(), isa() を定義 can() はメソッドのリファレンスを返す AUTOLOAD と併用すると … my $dog = Dog->new(); $dog->isa(‘Dog’); # true $dog->isa(‘Animal’); # true $dog->isa(‘Man’); # false my $bark = $dog->can(‘bark’); $man->$bark(); package UNIVERSAL; sub AUTOLOAD { my $self = shift; } すべてのクラスの未定義メソッドはここに!

public, private, protected 可視性 public, private, protected 用意されてません アトリビュートはアクセサメソッドで保護 private メソッドは _ を先頭に paranoia な人は caller() でチェック Class::Fields, Attribute::Protected

Perl OO Advanced

オブジェクトが1つしかないことは保証できない Design Patterns (1/3) Singleton Pattern スタティック変数はレキシカル変数を利用 パッケージ変数に格納 (Class::Singleton) package Printer; my $instance = Printer->new(); sub instance { $instance } package Printer; use base qw(Class::Singleton); sub _new_instance { … } オブジェクトが1つしかないことは保証できない

Design Patterns (2/3) Decorator Pattern AUTOLOAD を利用してメソッドを転送 Class::Decorator Class::Delegate package ReverseDecorator; sub new { my($class, $obj) = @_; bless { o => $obj }, $class; } sub AUTOLOAD { my($self, @args) = @_; (my $meth = $AUTOLOAD) =~ s/.*://; my @new_args = map reverse($_), @args; $self->{o}->$meth(@new_args);

Object::PerlDesignPatterns Class::* Modules Class::Composite Class::Prototype Object::PerlDesignPatterns Perl でパターンやるなら必読

Mix-in 多重継承はダイアモンド型の問題あり Exporter を利用して mix-in を実装 Ruby の Module に相当 mixin.pm (M.Schwern) package Speakable; use base qw(Exporter); @EXPORT = qw(speak); sub speak { my $self = shift; print “my name: “, $self->name; } package Man; use Speakable; sub speak { my $self = shift; print “my name: “, $self->name; } 実装を借りてくるようなイメージ

Aspect Oriented Programming AOP Aspect Oriented Programming PerlのOOは動的束縛 他クラスのメソッドを上書き Aspect.pm my $orig = Man->can(‘walk’); *Man::walk = sub { warn “Man::walk here”; goto &$orig; };

おまけ(1/2) rubyisms.pm Simon Cozens 作 Steal some features from Ruby package Foo; use rubyisms; sub initialize { self->{things} = [ @_ ]; self->another_method; } sub my_method { if ($interesting) { … } else { super } sub array_iterator (&@) { yield() for @_; } array_iterator { print $_[0], “\n” } (“Hello”, “World”);

おまけ(2/2) autobox.pm use builtin datatypes as first-class objects Perl 5.8.1 RC4 へのパッチ必要 use autobox; my $range = 10->to(1); my $ton = $range->[0]->mul(10); my $error = 3.14->minus(22/7); my $greeting = "Hello, World"->upper(); $greeting->to_lower(); $greeting->for_each(\&char_handler); my $arr = [ @_ ]->map(...)->sort(...);

Perl の OO は現場で使えるか?

Sledge (http://sl.edge.jp/) 事例紹介 Sledge (http://sl.edge.jp/) MVC なWebアプリケーションフレームワーク オブジェクト指向 アプリケーション: クラス ページ: メソッド Abstract Factory, Strategy, Singleton, Template Method などのパターンを利用 Class::DBI (O/R Mapping) とコンボが強力

エッジ社ではほぼ全てのプロジェクトで利用 Sledge の適用事例 エッジ社ではほぼ全てのプロジェクトで利用 プロジェクトあたりプログラマ 2-4名 開発期間 2w-6w 2001年夏に開発 2002年始めから標準化 浸透には時間がかかった Sledge 自体の安定性の問題もあり チーフエンジニアへの教育 各プロジェクトで採用→OJTとノウハウ共有(CVS, Wiki, Mailing List)

まとめ 基本的OO機能は備わっている 何でも動的 Hackすれば大体のことは実現できる 何をしてるかわかる人がやる $obj->$method(); push @{“$class\::ISA”}, $another; Hackすれば大体のことは実現できる 何をしてるかわかる人がやる 何をしてるかわからないようにする