java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - strategy
DESCRIPTION
TRANSCRIPT
![Page 1: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/1.jpg)
( ゜ェ゜)・;'.、ゴフッStrategy
都元ダイスケ @daisuke_m2011/04/25
![Page 2: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/2.jpg)
都元ダイスケ• @daisuke_m
• @j5ik2oの部下
• 日経ソフトウエア
• Java
• Jiemamy
• Apache Mahout
![Page 3: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/3.jpg)
Strategy(戦略)• 戦略のオブジェクト化
• アルゴリズムを実行時に選択できる
• 実行時 コンパイル時
• 通常(?)アルゴリズムはコンパイル時に選択するもの → 書いた通りに動く
![Page 4: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/4.jpg)
クラス図
• これ見てもわかんねーんだよな…。
![Page 5: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/5.jpg)
http://ja.wikipedia.org/wiki/Strategy_パターン
詳しくは
![Page 6: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/6.jpg)
ベタな例だが "ソート"
• java.io.File のソートをしてみる
![Page 7: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/7.jpg)
ベタな例だが "ソート"
• java.io.File のソートをしてみる
![Page 8: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/8.jpg)
ベタな例だが "ソート"
• java.io.File のソートをしてみる
![Page 9: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/9.jpg)
ベタな例だが "ソート"
• java.io.File のソートをしてみる
![Page 10: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/10.jpg)
ベタな例だが "ソート"
• java.io.File のソートをしてみる
![Page 11: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/11.jpg)
Fileをソートする• …どうやって?
• いや、ファイル名で…
• え、ディレクトリが先?
• そうじゃなくて今回はサイズ順で…
• file1, file2, file10 を上手いこと…
![Page 12: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/12.jpg)
Strategyを使わないと• case1 : ゴリ押し
• いや、うちのソートは名前順だから
• case2 : if~elseif~elseif…
• あり得そうなすべての可能性をがんばって想像しました
![Page 13: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/13.jpg)
イメージ/* 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](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/14.jpg)
Strategyを使うと
• case 3 : ソート方法(戦略)は私が決めない
• 戦略はあなたが教えてね。
• case 4 : デフォルトはあるけど変えられるよ
• 特殊な事したい時は、戦略を教えてね。
![Page 15: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/15.jpg)
論よりコード
![Page 16: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/16.jpg)
論よりコード
![Page 17: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/17.jpg)
論よりコード
![Page 18: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/18.jpg)
論よりコード
![Page 19: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/19.jpg)
論よりコード
![Page 20: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/20.jpg)
あらためてクラス図
• "戦略" という概念を発見して抽象化
![Page 21: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/21.jpg)
Strategyパターン• どんな時?• 処理の詳細を固定せず、自由度を保つ• どうすれば?• その処理に「戦略」という概念を発見• ソート処理 → 比較戦略• SQL出力 → RDBMS実装戦略• パターンは何でもそうだけどやりすぎ注意
![Page 22: java-ja 第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - Strategy](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/23.jpg)
/* 普通の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](https://reader034.vdocuments.mx/reader034/viewer/2022051322/546328c7b4af9f581c8b4b27/html5/thumbnails/24.jpg)
Client c = new Client(★);c.run();
123ヾ(。´Д`。)ノ456ヾ(。´Д`。)ノ789 ヾ(。´Д`。)ノ101112 ヾ(。´Д`。)ノ13 ヾ(。´Д`。)ノ
12Fizz4BuzzFizz78FizzBuzz11Fizz13
★に new FizzBuzzStrategy() を入れれば、普通のFizzBuzz。
★に new NabeatsuStrategy() を入れれば、世界のNabeatsu。