「やる夫で学ぶTDD」 四日目 CSVParserで学ぶ実践TDD #ytdd

某SIerで if(true == false) のような神コードのインスペクションで廃人化しているやらない夫こと太田先生の「やる夫で学ぶTDD」四日目です。 今回は、リアルペアプロを基にしたやりとり。
6
Kenichiro Ota @oota_ken

やらない夫:1. もっとも簡単なもの, 値に「"」「,」のいずれも含まず、かつかつ値を""でくくらない。 List<String> ls=csvParser.parse("a,b,c"); #ytdd

2011-02-06 23:44:46
Kenichiro Ota @oota_ken

やらない夫:2. 値に「,」を含む。値に「,」を含むと、値は「"」でくくられるのが、CSVファイルの仕様。 List<String> ls=csvParser.parse("\"a,d\",b,c"); #ytdd

2011-02-06 23:44:52
Kenichiro Ota @oota_ken

やらない夫:3. 値に、「,」と「"」を含む。「"」自体は前に「"」を使って表現するのがCSVファイルの仕様。 List<String> ls=csvParser.parse("\"a,d\"\"\",b,c"); #ytdd

2011-02-06 23:44:57
Kenichiro Ota @oota_ken

やらない夫:4. 最初は空白でその後に「"」自体を含む。 最初に出た以外の「"」は値になるのがCSVファイルの仕様。 ls=csvParser.parse(" \"a\" ,b,c"); #ytdd

2011-02-06 23:45:03
Kenichiro Ota @oota_ken

やらない夫:5. 2.と5.の組み合わせ。これはパーサを状態遷移モデルとして表現することに対するエラー推測。 ls=csvParser.parse("b,c, \"a\" ,\"b\",\"c \""); #ytdd

2011-02-06 23:45:08
Kenichiro Ota @oota_ken

やる夫:なんか、CSVファイルって結構複雑だお・・・ #ytdd

2011-02-06 23:45:21
Kenichiro Ota @oota_ken

やらない夫:ちなみに実際のCSVファイルは値に改行や普通に日本語も含んだりできて、もっと複雑なので今回は簡易版であることに注意な。 #ytdd やる夫:これに対して、どう実装していくんだお。 #ytdd

2011-02-06 23:45:26
Kenichiro Ota @oota_ken

やらない夫:単純に、splitするのは無理だとはわかったよな。ということはとりあえず、文字を1つずつたどって解析していくことにしよう。 #ytdd

2011-02-06 23:45:49
Kenichiro Ota @oota_ken

やる夫:一文字一文字読むループを作っていけばいいのかお。こうかお? for (int i = 0; i < line.toCharArray().length; i++) { #ytdd

2011-02-06 23:45:57
Kenichiro Ota @oota_ken

やらない夫:簡易forを使わなかった理由は? #ytdd

2011-02-06 23:46:04
Kenichiro Ota @oota_ken

やる夫:(本当は最初使いました)「""」の連続を考えると、一部先読みをしなければならない可能性がありそうだと思ったお。というか、イテレーターあんまり好きじゃないお!! #ytdd

2011-02-06 23:46:14
Kenichiro Ota @oota_ken

やらない夫:最初の理由は正しいが、次の理由はなあ。 #ytdd

2011-02-06 23:46:21
Kenichiro Ota @oota_ken

やる夫:文字を読んでいったときに、今、初期状態なのか、「"」でくくられた状態で文字を見ているか、普通のパースをしているかの状態分析とかが必要な気がするお。 #ytdd

2011-02-06 23:46:28
Kenichiro Ota @oota_ken

やらない夫:鋭いな。やる夫。 #ytdd

2011-02-06 23:46:33
Kenichiro Ota @oota_ken

やる夫:やる夫のゲームの世界ではキャラクターは状態を持っているオブジェクトとして表現するので、今回のCSVパーサーもまさにそれに似ているのでおもいついたんだお! #ytdd

2011-02-06 23:47:28
Kenichiro Ota @oota_ken

今日は遅くまで協力本当にありがとうね! RT @ioki: なんか始まってるww #ytdd

2011-02-06 23:47:42
Kenichiro Ota @oota_ken

やらない夫:じゃあ、ちょっと 簡単な奴でいいから書いてみようか。UMLのステートマシン図がいいかな。astah communityが無料で使えてお勧めだ。 #ytdd

2011-02-06 23:47:54
Kenichiro Ota @oota_ken

やる夫:やらない夫、一気にこんなステートマシン図書けたのかお?!すごすぎだお! #ytdd

2011-02-06 23:50:15
Kenichiro Ota @oota_ken

やらない夫:書けるわけないだろう。これはある程度、コード書きながら書いたものだ。しかし、この手のパーサ系のコードを書く場合、ある程度状態遷移モデルを記述したほうとっかりやすいな。 #ytdd

2011-02-06 23:50:25
Kenichiro Ota @oota_ken

やる夫:そして簡単なテストケースと簡単な状態遷移からやっていくんかお。 #ytdd

2011-02-06 23:50:32
Kenichiro Ota @oota_ken

やらない夫:そうだ。まずは、初期状態と通常処理の遷移を満たす、テストケースと実装をしていく。先ほどのケースだと1.だな。 #ytdd

2011-02-06 23:50:38
Kenichiro Ota @oota_ken

やらない夫:次に、初期状態から、ダブルクオーテーション内、そして通常処理への状態遷移を満たすテストケースと実装をしていく。先ほどのケースだと2がそれだ。 #ytdd

2011-02-06 23:50:49
Kenichiro Ota @oota_ken

やる夫:そして、状態遷移の全遷移を満たすテストケースを最終的に作成すればいいんかお。 #ytdd

2011-02-06 23:50:54
Kenichiro Ota @oota_ken

やらない夫:状態遷移モデルのカバレッジについては、いくつかカバレッジ基準があるが、ここでは、単純に全遷移にしておこう。ソフトウェアテスト技法ドリルの後半で出てくるので読んでおいてほしい。 #ytdd

2011-02-06 23:51:09