初心者のためのC#プログラミング本格入門61 - テストを使って思考を整理整頓しよう
前回の最後で「エラーを出す方がいい」という旨を書きました。それは、実務的な観点から言える事です。プログラミングをする時、人は色々な事を考えます。その行為は混乱をもたらします。特に初心者の頃はそうです。ならばさっさとテストプログラム実行して結果を確認する方が早いと言えます。前回の例がこれに該当します。今現在正しく式が解析できるのかどうかは実行してみれば分かります。結果は「解析出来ない」です。その結果を確認すれば前に進めます。もし、プログラムを見て悩んでいるだけならば、その結論を出すのに時間がかかるかもしれません。
この考えをさらに発展させ、これから実現するプログラムを予め作ると、プログラミングが早くできるようになります。予め作っているわけですから、エラーが出るのは当たり前です。従って、エラーを出しつつプログラミングを進めるという事になります。この様な考え方をテストファーストと呼びます。テストファーストの概念はそれだけではないのですが、一度に全てを理解できませんので少しずつ解説していきます。
サンプルプログラムの作成に話しを戻します。「解析が出来ていない」という事柄をよく考えてみましょう。解析の成功有無はどうやって判定していますか?それを考えれば自ずと答えは出ます。
//簡単な式が指定された場合の解析処理をテストする
public void AnalyzeSimpleExpression()
{
string value = "1 + 2";
this.target.AnalyzeExpression( value );
if ( target.Success == false )
{
System.Console.WriteLine(
"簡単な式が解析できていません。" );
}
}
答えは「Successプロパティの値がtrueの時、解析は成功していると判断している。」です。つまり、Successプロパティをtrueに設定すればよいのです。それを念頭に置き、改めて解析処理を確認しましょう。
public void AnalyzeExpression( string inputValue )
{
//式を分割
DivisionAnalyzer( inputValue );
}
確認すると式を分解する処理しかしていない事が分かります。という事は・・・
public void AnalyzeExpression( string inputValue )
{
//式を分割
DivisionAnalyzer( inputValue );
//式の有効性をチェック
ValidityExpression();
}
以上のように式の有効性をチェックすれば、解析の成功有無が正しく判定できるようになります。では、何を持って式が有効とするのでしょうか?その答えは、実のところ答えは既に出ています。オブジェクトのコンポジションをして、細かい処理を別のオブジェクトに任しているのですから、式の有効性はAnalyzerに聞けば分かります。早速、ValidityExpressionメソッドを作ってみましょう。
private void ValidityExpression()
{
foreach ( Analyzer obj in this.analyzers )
{
if ( obj.Success == false )
{
this.success = false;
return;
}
}
this.success = true;
}
Analyzerオブジェクトは複数あるので、全てのAnalyzerオブジェクトに指定された式の有効性を聞いています。それだけでは面白くないので新しい文法foreachループを使っています。今までforループ、whileループ、do-whileループの計3つのループを紹介してきました。いずれのループを使っても実現できるのですが、コレクション系のオブジェクトを使ってループ処理をする時は、foreachループを使った方が簡潔に表現できます。コレクション系のオブジェクトを使って処理をする時は、foreachループを使用しましょう。
以上で今回は終わりです。テストファーストをすると思考が整理されます。その事が少しでも味わってもらえればいいなと考えています。今回は思考の整理が実感できなかったという人も、サンプルプログラムを複雑化していくのでいずれ味わえると思います。次回はさらに話しを前に進めます。お楽しみに。