「やる夫で学ぶTDD」 四日目 CSVParserで学ぶ実践TDD #ytdd
やらない夫:1. もっとも簡単なもの, 値に「"」「,」のいずれも含まず、かつかつ値を""でくくらない。 List<String> ls=csvParser.parse("a,b,c"); #ytdd
2011-02-06 23:44:46やらない夫:2. 値に「,」を含む。値に「,」を含むと、値は「"」でくくられるのが、CSVファイルの仕様。 List<String> ls=csvParser.parse("\"a,d\",b,c"); #ytdd
2011-02-06 23:44:52やらない夫:3. 値に、「,」と「"」を含む。「"」自体は前に「"」を使って表現するのがCSVファイルの仕様。 List<String> ls=csvParser.parse("\"a,d\"\"\",b,c"); #ytdd
2011-02-06 23:44:57やらない夫:4. 最初は空白でその後に「"」自体を含む。 最初に出た以外の「"」は値になるのがCSVファイルの仕様。 ls=csvParser.parse(" \"a\" ,b,c"); #ytdd
2011-02-06 23:45:03やらない夫:5. 2.と5.の組み合わせ。これはパーサを状態遷移モデルとして表現することに対するエラー推測。 ls=csvParser.parse("b,c, \"a\" ,\"b\",\"c \""); #ytdd
2011-02-06 23:45:08やらない夫:ちなみに実際のCSVファイルは値に改行や普通に日本語も含んだりできて、もっと複雑なので今回は簡易版であることに注意な。 #ytdd やる夫:これに対して、どう実装していくんだお。 #ytdd
2011-02-06 23:45:26やらない夫:単純に、splitするのは無理だとはわかったよな。ということはとりあえず、文字を1つずつたどって解析していくことにしよう。 #ytdd
2011-02-06 23:45:49やる夫:一文字一文字読むループを作っていけばいいのかお。こうかお? for (int i = 0; i < line.toCharArray().length; i++) { #ytdd
2011-02-06 23:45:57やる夫:(本当は最初使いました)「""」の連続を考えると、一部先読みをしなければならない可能性がありそうだと思ったお。というか、イテレーターあんまり好きじゃないお!! #ytdd
2011-02-06 23:46:14やる夫:文字を読んでいったときに、今、初期状態なのか、「"」でくくられた状態で文字を見ているか、普通のパースをしているかの状態分析とかが必要な気がするお。 #ytdd
2011-02-06 23:46:28やる夫:やる夫のゲームの世界ではキャラクターは状態を持っているオブジェクトとして表現するので、今回のCSVパーサーもまさにそれに似ているのでおもいついたんだお! #ytdd
2011-02-06 23:47:28やらない夫:じゃあ、ちょっと 簡単な奴でいいから書いてみようか。UMLのステートマシン図がいいかな。astah communityが無料で使えてお勧めだ。 #ytdd
2011-02-06 23:47:54やらない夫:書けるわけないだろう。これはある程度、コード書きながら書いたものだ。しかし、この手のパーサ系のコードを書く場合、ある程度状態遷移モデルを記述したほうとっかりやすいな。 #ytdd
2011-02-06 23:50:25やらない夫:そうだ。まずは、初期状態と通常処理の遷移を満たす、テストケースと実装をしていく。先ほどのケースだと1.だな。 #ytdd
2011-02-06 23:50:38やらない夫:次に、初期状態から、ダブルクオーテーション内、そして通常処理への状態遷移を満たすテストケースと実装をしていく。先ほどのケースだと2がそれだ。 #ytdd
2011-02-06 23:50:49やらない夫:状態遷移モデルのカバレッジについては、いくつかカバレッジ基準があるが、ここでは、単純に全遷移にしておこう。ソフトウェアテスト技法ドリルの後半で出てくるので読んでおいてほしい。 #ytdd
2011-02-06 23:51:09