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

24
( ゜ェ゜);'.、ゴフッ Strategy 都元ダイスケ @daisuke_m 2011/04/25

Upload: daisuke-miyamoto

Post on 11-Nov-2014

1.653 views

Category:

Technology


5 download

DESCRIPTION

 

TRANSCRIPT

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

( ゜ェ゜)・;'.、ゴフッStrategy

都元ダイスケ @daisuke_m2011/04/25

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

都元ダイスケ• @daisuke_m

• @j5ik2oの部下

• 日経ソフトウエア

• Java

• Jiemamy

• Apache Mahout

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

Strategy(戦略)• 戦略のオブジェクト化

• アルゴリズムを実行時に選択できる

• 実行時   コンパイル時

• 通常(?)アルゴリズムはコンパイル時に選択するもの → 書いた通りに動く

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

クラス図

• これ見てもわかんねーんだよな…。

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

ベタな例だが "ソート"

• java.io.File のソートをしてみる

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

ベタな例だが "ソート"

• java.io.File のソートをしてみる

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

ベタな例だが "ソート"

• java.io.File のソートをしてみる

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

ベタな例だが "ソート"

• java.io.File のソートをしてみる

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

ベタな例だが "ソート"

• java.io.File のソートをしてみる

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

Fileをソートする• …どうやって?

• いや、ファイル名で…

• え、ディレクトリが先?

• そうじゃなくて今回はサイズ順で…

• file1, file2, file10 を上手いこと…

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

Strategyを使わないと• case1 : ゴリ押し

• いや、うちのソートは名前順だから

• case2 : if~elseif~elseif…

• あり得そうなすべての可能性をがんばって想像しました

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

イメージ/* case1 */void sort(List<File> target) { // sort by name}

/* case2 */void sort(List<File> target, String type) { if ("name".equasls(type)) { // sort by name } else if ("size".equals(type)) { // sort by size } else { // default ... }}

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

Strategyを使うと

• case 3 : ソート方法(戦略)は私が決めない

• 戦略はあなたが教えてね。

• case 4 : デフォルトはあるけど変えられるよ

• 特殊な事したい時は、戦略を教えてね。

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

論よりコード

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

論よりコード

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

論よりコード

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

論よりコード

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

論よりコード

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

あらためてクラス図

• "戦略" という概念を発見して抽象化

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

Strategyパターン• どんな時?• 処理の詳細を固定せず、自由度を保つ• どうすれば?• その処理に「戦略」という概念を発見• ソート処理 → 比較戦略• SQL出力 → RDBMS実装戦略• パターンは何でもそうだけどやりすぎ注意

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

public interface Strategy { String process(int i);}

public class Client {

Strategy strategy;

public Client(Strategy strategy) { this.strategy = strategy; }

public void run() { for (int i = 1; i <= 100; i++) { System.out.println(strategy.process(i); } }}

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

/* 普通のFizzBuzz */public class FizzBuzzStrategy implements Strategy { public String process(int i) { if (i % 3 == 0 && i % 5 == 0) return "FizzBuzz"; if (i % 3 == 0) return "Fizz"; if (i % 5 == 0) return "Buzz"; return String.valueOf(i); }}

/* 世界のNabeatsu */public class NabeatsuStrategy implements Strategy { public String process(int i) { if (i % 3 == 0 || String.valueOf(i).contains("3")) { return i + " ヾ(。´Д`。)ノ";; } return String.valueOf(i); }}

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

Client c = new Client(★);c.run();

123ヾ(。´Д`。)ノ456ヾ(。´Д`。)ノ789 ヾ(。´Д`。)ノ101112 ヾ(。´Д`。)ノ13 ヾ(。´Д`。)ノ

12Fizz4BuzzFizz78FizzBuzz11Fizz13

★に new FizzBuzzStrategy() を入れれば、普通のFizzBuzz。

★に new NabeatsuStrategy() を入れれば、世界のNabeatsu。