辞書を片手に~PatternResponderの作成(3) | Pythonでなんか作ってみる

辞書を片手に~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。ようやく進める・・・。