辞書を片手に~PatternResponderの作成(3)
ToDoリスト
・パターン辞書から応答例のグループを作る
つぎはこれだ。
今のloadDictionary()では、パターンの方しか取得することが出来ない。
応答例の方もまとめて取れるようにしたい。
loadDictionary()がTreeMapを返せば良いのでは?
まずは、テストを書く。
public void testLoadDictionary() throws FileNotFoundException {
TreeMap result1 = PatternResponder.loadDictionary(new FileReader("dics/first.dat"));
Pattern[] pat1 = null;
assertEquals(new Pattern[] { Pattern.compile("今日はさむいね"),
Pattern.compile("チョコたべたい"), Pattern.compile("きのう10円ひろった") },
pat1);
TreeMap result2 = PatternResponder.loadDictionary(new FileReader("dics/add.dat"));
Pattern[] pat2 = null;
assertEquals(new Pattern[] { Pattern.compile("今日はさむいね"),
Pattern.compile("チョコたべたい"), Pattern.compile("きのう10円ひろった"),
Pattern.compile("それからそれから?") },
pat2);
}
どうも長くなったので、こんな感じで一時変数を使った。まだ、コンパイルは通らない。
loadDictionary()をTreeMapを返すように変更する。
public static TreeMap loadDictionary(FileReader reader) {
String[] patternStrings = RandomResponder.loadDictionary(reader);
Pattern[] patterns = new Pattern[patternStrings.length];
for (int index=0;index < patterns.length; index++) {
patterns[index] = Pattern.compile(patternStrings[index]);
}
return new TreeMap((Object[])patterns);
}
適当に書いたらEclipseに怒られたので、素直にドキュメントを探す。
ドキュメントを読むとTreeMapがキーの昇順にソートするということに今更気づく。
HashMapに変更するか?しかし、それだと順序保証がなくなるし。
ArrayListは?これは、パターンから応答例を引っ張ってくるのが大変になるし。
いや、それは今のタスクでは無い。先ずは応答例を取得しなければ・・・。
ぐだぐだ悩みすぎて、リズムが崩れたので、一旦全てを捨ててシャワーに入ることにする。
シャワーから出た。
さっきは、悩みすぎた。TDDなんだから、今はテストしやすいように考えなくては。
一番テストがしやすい方法は新規メソッドの追加だろう。既存メソッドには影響を与えない。
応答例を取得するloadDictionaryResponse()をテストしよう。
まずはStringの配列を返せばいいだろう。
public void testLoadDictionaryResponse() throws FileNotFoundException {
assertEquals(new String[0],
PatternResponder
.loadDictionaryResponse(new FileReader("dics/first.dat")));
}
こんな感じで。first.datには応答例の方が入っていないので、空のString配列が返って来るということでいいか?
いや、パターンと同数の空文字列の配列の方がいいだろう。
public void testLoadDictionaryResponse() throws FileNotFoundException {
assertEquals(new String[]{"","",""},
PatternResponder
.loadDictionaryResponse(new FileReader("dics/first.dat")));
}
QuickFixでスタブ実装。
public static String[] loadDictionaryResponse(FileReader reader) {
// TODO Auto-generated method stub
return null;
}
試しにテストを実行してみると、当然Red。よしよし。
このテストクラスには、String配列用のAssertEqualsが無いので、別のテストクラスからコピペする。
テスト実行。まだ、Red。で、仮実装。
public static String[] loadDictionaryResponse(FileReader reader) {
return new String[]{"","",""};
}
Green。ようやく進める・・・。