25
ヽ(*゚д゚)ノVisitor パターン 1 2011/04/25 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 2011426日火曜日

java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Embed Size (px)

DESCRIPTION

java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Citation preview

Page 1: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

ヽ(*゚д゚)ノ<Visitor パターン

12011/04/25

第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』2011年4月26日火曜日

Page 2: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

ID:yuroyoroゆろよろ

2

お前、誰よ?

2011年4月26日火曜日

Page 3: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Visitorパターンって

3

2011年4月26日火曜日

Page 4: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Listやツリーなど

構造の中を巡回し

要素の型に応じて

適切な処理を

行うためのパターン

4

2011年4月26日火曜日

Page 5: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

訪問者

5

2011年4月26日火曜日

Page 6: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

来訪者?

6

2011年4月26日火曜日

Page 7: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

登場人物

Visitor : 構造を廻る処理を表す

Acceptor : 個々の要素

7

2011年4月26日火曜日

Page 8: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Visitor

interface vistor {

void visitFoo(Foo foo);

void visitBar(Bar foo);

}

※Acceporの具象クラス毎に

VisitXXXを用意するのがポイント

8

Acceptor毎の処理

2011年4月26日火曜日

Page 9: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Acceptor

interface Acceptor {

void accept(Visitor visitor);

}

class Foo implements Acceptor{

public void accept(Visitor visitor){

visitor.visitFoo(this);

}

} 9

自分の型に応じたvisitXXXを呼び出す

2011年4月26日火曜日

Page 10: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

10

<interface>Acceptor

<interface>Visitor

<class>Foo

<class>SomeVisitor

<class>Bar

2011年4月26日火曜日

Page 11: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

10

<interface>Acceptor

<interface>Visitor

<class>Foo

<class>SomeVisitor

<class>Bar

accept(this)

2011年4月26日火曜日

Page 12: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

10

<interface>Acceptor

<interface>Visitor

<class>Foo

<class>SomeVisitor

<class>Bar

visitFoo(this)

2011年4月26日火曜日

Page 13: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

10

<interface>Acceptor

<interface>Visitor

<class>Foo

<class>SomeVisitor

<class>Bar

accept(this)

2011年4月26日火曜日

Page 14: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

10

<interface>Acceptor

<interface>Visitor

<class>Foo

<class>SomeVisitor

<class>Bar

visitBar(this)

2011年4月26日火曜日

Page 15: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

10

<interface>Acceptor

<interface>Visitor

<class>Foo

<class>SomeVisitor

<class>Bar

2011年4月26日火曜日

Page 16: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

面倒ですね?

何がうれしい?

11

2011年4月26日火曜日

Page 17: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

たいていの場合、

再帰で書ける

12

2011年4月26日火曜日

Page 18: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

再帰の問題点

void recurcive(Acceptor ac){

if( ac instanceof Foo) { ... }

else if { ac instanceof Bar {...}

}

13

2011年4月26日火曜日

Page 19: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

instanceofって……。

Acceptorの種類が増えたら

if-else追加とか……。

14

2011年4月26日火曜日

Page 20: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Visitorパターンだと

visitXXXを追加しないと

コンパイルエラー

15

2011年4月26日火曜日

Page 21: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

Visitorとは

↓void recurcive(Acceptor ac){

if( ac instanceof Foo) { ... }

else if { ac instanceof Bar {...}

}

↓を抽象化したもの

16

2011年4月26日火曜日

Page 22: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

•Acceptorが増えても既存のAcceptorには影響がない

•Vistorは型安全なswitch文を表している

•visitXXXというメソッドは、switch文のcase節に相当する

17

2011年4月26日火曜日

Page 23: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

•構造の変化の影響範囲をコンパイラがチェックしてくれる

•処理の実装漏れがなくなる

•テスト範囲が明確になる

18

2011年4月26日火曜日

Page 24: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

こんど秀和システムさんから

Scalaの本出ます

19

2011年4月26日火曜日

Page 25: java-ja 第1回 チキチキ『( ゜ェ゜)・;’.、ゴフッ』 - Visitor

ScalaでのVisitorパターンや

ジェネリックスを利用した

デザパタなど

書いてます!

20

2011年4月26日火曜日