初心者のためのC#プログラミング本格入門69 - メソッドを追加したら即テスト
前回サンプルプログラムのMultiAnalyzerに、RemoveErrorExpressionメソッドを追加しました。この様に新しいメソッドを追加した場合、すぐさま新しいテストを作成します。何故ならば、前回のテストはあくまでも「間違った式を指定した後、正しい式を分析する。」テストなので、他の状況を考慮していないからです。ErrorAndSuccessテストは、AnalyzeExpressionメソッドが主なテスト対象なので、このままでは安心できません。
RemoveErrorExpressionメソッドを使用する状況(ストーリー)は、「複数の間違った式を指定した後に実行する」です。ErrorAndSuccessテストは1つの間違った式を直後に取り除いていましたが、複数の式の場合はチェックしていません。そこで、全ての間違った式が取り除けるのかテストします。
class MultiAnalyzerTest
{
//全ての間違った式が削除できているかチェック。
public void AllErrorExpressionDelete()
{
//間違った式と正しい式を複数指定
this.target = new MultiAnalyzer();
string inputValue1 = "1 + 2";
this.target.AnalyzeExpression( inputValue1 );
string errorValue1 = "0 $ 20";
this.target.AnalyzeExpression( errorValue1 );
string errorValue2 = "1 @ 2";
this.target.AnalyzeExpression( errorValue2 );
string inputValue2 = "1 * 2";
this.target.AnalyzeExpression( inputValue2 );
//全ての間違った式を取り除いているか?
this.target.RemoveErrorExpression();
if ( this.target.Success == false )
{
System.Console.WriteLine(
"全ての間違った式を取り除けていません。" );
}
}
}
//新しいテストを追加
class TestProgram
{
static void Main()
{
MultiAnalyzerTest multiTests =
new MultiAnalyzerTest();
multiTests.AnalyzeSimpleExpression();
multiTests.ErrorExpressionCheck();
multiTests.ErrorAndSuccess();
multiTests.AllErrorExpressionDelete(); //ここに追加
}
}
テストを実行してみましょう。エラーが表示された筈です。原因を探ってみましょう。幸いマイクロソフト社が作った開発ソフトは、間違った所を探す機能が備わっています。先ずは、「//全ての間違った式を取り除いているか?」のコメントの下にあるプログラム「this.target.RemoveErrorExpression();」がある場所にカーソルを持って行って下さい。次に、「デバッグ」メニューの「ブレークポイントの設定/解除」を選択して下さい。すると、画面左に赤丸がついてプログラムの色も変わります。これで準備万端です。「デバッグ」メニューの「デバッグ開始」を選択して下さい。プログラムが実行された後、黄色い矢印が表示され、先ほど設定したプログラムでストップされます。この状態でF11ボタンを押すと、プログラムが1行ずつ実行されます。
さて、ストップしてどうするのかと言いますと、この状態で表示できる便利なウィンドウがあります。デバッグ→ウィンドウ→ローカルを順番に選びクリックすると、ローカルウィンドウが表示されます。ローカルウィンドウは、オブジェクトの状態が確認できます。この画面を見て、RemoveErrorExpressionメソッドの動きを観察しましょう。すると、間違った式を1つしか取り除いていない事が分かると思います。実際に確認してみて下さい。
複数の間違った式を取り除くにはどうしたらよいのでしょうか?一度考えて下さい。考え方としては、「1つの式を取り除けるプログラムを、全ての間違った式を取り除くまでループすればよい。」です。この考え方を元にすれば分かると思います。
模範解答を発表します。今まで学習してきた事を合わすと次の様になります。
//間違った式を取り除く
public void RemoveErrorExpression()
{
//間違った式を1つずつ取り除く
bool loopFlag = true;
while ( loopFlag == true )
{
//間違った式を1つ取り除く
int index = -1;
for ( int i = 0; i < this.analyzers.Count; ++i )
{
if ( this.analyzers[ i ].Success == false )
{
this.analyzers.RemoveAt( i );
index = i;
break;
}
}
//間違った式が1つも見つからない時処理終了
if ( index == -1 )
{
loopFlag = false;
}
}
}
これで複数の間違った式を取り除けます。テストを再度実行しましょう。すると・・・またエラーが表示されます。それは何故でしょうか?答えは「Successプロパティの値が変更されていないから」です。Successプロパティの値を変更するメソッドは、ValidityExpressionメソッドなので最後に呼び出しておきましょう。
//間違った式を取り除く
public void RemoveErrorExpression()
{
//先ほど書いたので省略
//改めて式全体を検証
this.ValidityExpression();
}
やったね♪今度こそテストが成功します。今回解説したように、新しいメソッドを追加したら直ぐに、新しいテストを作ってチェックします。また、テストをパスする最低限のプログラムしか書いていない事に注意して下さい。テストファーストのプログラミングでは、基本的に余計なプログラムを書きません。何故ならば、あれこれ考えてプログラムを作ろうとすると、思考が乱れてそこにバグが生まれるからです。それに余分なプログラムは贅肉です。プログラムの贅肉も極力無い方がいいです。特に初心者の方は慣れていないので混乱しやすいと思います。贅肉を作るためにプログラミングが進まないなんて損だと思いませんか?プロと初心者の違いがそこにあります。
ちょっとプログラミングに慣れてくると、あれこれ考えがちですが、プロは余計な動きをしません。黙々とテストを追加して、そのテストをパスするプログラムを作るだけです。この様に書くと「楽しくないんじゃないか?」という疑問が湧くかと思います。ですが、それはむしろ逆です。テストファーストで開発すると、進行状況が見えてプログラミングがより一層楽しくなります。誰しも目的地が分からないよりも、目的地に向かって進んでクリアする方が楽しいと思います。
「楽しくプログラミングして楽しく学ぶ」それが私のポリシーです。プログラミング上達のコツは、プログラミングをどれだけ楽しいものに出来るかだと言っても過言ではありません。楽しくなければ長続きしませんから上達しません。学習を耐えて努力をするものと考えず、楽しんだ結果上達するものだと考えて下さい。一緒にプログラミングを楽しみましょう。次回はさらなるテクニックを解説します。お楽しみに。