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