初心者のためのC#プログラミング本格入門68 - ユーザーストーリーとプログラムを発展させよう
前回サンプルプログラムに、「誤った式を解析後、正しい式をエラーとみなしてしまう。」という問題がある事が分かりました。その問題を一緒に解決していきましょう。
先ず考えるべき事は問題の発生源です。解析処理の問題を発見するには、やはりAnalyzeExpressionメソッドのプログラムを見る必要があります。早速見てみましょう。
public void AnalyzeExpression( string inputValue )
{
//式を分割
DivisionAnalyzer( inputValue );
//式の有効性をチェック
ValidityExpression();
}
ここで今回解決する問題を思い返すと、「式の有効性をチェック」が重要です。どの様に式の有効性をチェックしているのかが分かれば問題を解決できます。
private void ValidityExpression()
{
foreach ( Analyzer obj in this.analyzers )
{
if ( obj.Success == false )
{
this.success = false;
return;
}
}
this.success = true;
}
ValidityExpressionメソッドのプログラムを読めば、「全ての式が有効である場合のみ有効な式」だと判定している事が分かります。複数の式を計算するためには、個々の式が正しくなければなりません。従って、ValidityExpressionメソッド単体からしてみれば、これは妥当なプログラムだと言えます。しかしながら、今のままでは一つの誤りだけで全てが台無しになってしまいます。どうすればいいのでしょうか?読者の皆様は、一度考えてみて下さい。考えましたか?この問題の解決方法はいくつか方法が考えられます。ですが、注意が必要です。初心者の人は、色々考え過ぎてしまい、既存のプログラムを変更してしまう傾向がありますが、無闇に仕様を変更しては駄目です。何故ならば、問題が起こる都度、プログラムを大幅に変えてしまうと、新しい問題が発生する確率が高くなるからです。また、実務で仕様を頻繁に変更すると、集団作業では混乱が生じます。
ではどうすればいいのかと言いますと、最低限の変更を行うのがベストです。今回の場合、一番簡単かつ自然な解決法は「誤った式を取り除く」事です。プログラムを使う人は大概、誤った式を入力すれば修正しようと考えます。ですから、これは理にかなっていると言えます。
解決方法が決まったので、ユーザーストーリーに沿ったテストにプログラムを追加します。
//間違った式を指定した後、正しい式を分析する。
public void ErrorAndSuccess()
{
//間違った式を指定
string errorValue = "1 @ 2";
this.target = new MultiAnalyzer();
this.target.AnalyzeExpression( errorValue );
if ( target.Success == true )
{
System.Console.WriteLine(
"誤った式を解析できていません。" );
}
//間違った式を取り除く
this.target.RemoveErrorExpression();
//正しい式を受け入れるか?
string value = "1 + 2";
this.target.AnalyzeExpression( value );
if ( target.Success == false )
{
System.Console.WriteLine(
"誤った式後に指定した正しい式を解析できていません。" );
}
}
「間違った式を取り除く」動作をつけて加えています。現段階では、RemoveErrorExpressionメソッドを定義していませんので文法エラーになります。この様なとき便利な機能が開発ソフトに備わっています。プログラム下に赤い波線が出た状態で、マウスを移動させると「メソッドスタブを作るオプション」が表示されます。それをクリックしたら、ひとまずメソッドが定義されます。非常に便利なので是非使ってみて下さい。テストが完成したので実行すると・・・エラーが発生した旨が表示されます。この原因は、まだRemoveErrorExpressionメソッド内のプログラムを作っていないからです。テストが実行できる事を確認したので、RemoveErrorExpressionメソッドのプログラムを作りましょう。プログラムの内容は、「間違った式を取り除く」です。RemoveAtメソッドを使えば作れます。一度考えてみて下さい。
それでは、模範解答を発表します。今まで学習した文法を使えば以下のようになります。
//間違った式を取り除く
//internalからpublicに変えるのを忘れずに
public void RemoveErrorExpression()
{
for ( int i = 0; i < this.analyzers.Count; ++i )
{
if ( this.analyzers[ i ].Success == false )
{
this.analyzers.RemoveAt( i );
}
}
}
簡単ですよね?forループとif分を使えば、このプログラムは作れます。これで、ErrorAndSuccessテストが成功します。この様に、ユーザーストーリーに沿ってテストとプログラムを発展させていけば、プログラミングが簡単になります。初心者がプログラミングを難しく感じる原因は「難しく考えるから」です。難しい事を考えれば、誰でも難しく感じてしまいます。ならば、初めから難しく考えなければいいのです。無理に背伸びせず、一歩々着実にプログラムを発展させていきましょう。この方法ならば、初心者でも無理なく実用的なプログラミングの学習が出来ます。