この記事は、
初心者のためのC#プログラミング本格入門71の続きです。前回は、テストを通じた学習のやり方をまとめました。今回は、プログラミング習得の心得を解説します。
私は何度も「プログラミング本を読んだけども実際に出来ない」という悩みを持つ初心者の方と出会いました。そうした悩みを持つ初心者の方は、「自分には才能がない」、「理解力が足りないのだろうか」、「やはり文系は駄目なのか」・・・といった心境になるそうです。ですが、心配要りません。実際にプログラミングが出来ないのは、貴方の能力や適性の問題ではありません。
プログラミングをやる人は理系の人だという誤解があるようですが、そもそも文系/理系なんて分類自体がナンセンスです。学問はそれほど単純ではありません。人類が積み重ねてきた英知を2分割にできません。プログラミングはプログラミングなのであって、○○系なんてものはありません。また、繰り返しになりますが才能云々は直ぐに答えを出すほど簡単ではありません。理解できないのはそういった問題ではなく、単純に
何事も繰り返さないと習得できないだけです。歴史に名を残すほどとなると才能が必要でしょうが、普通にちょっとしたプログラミングするだけならばだれでも出来ます。現にハッカーでもプロでも繰り返し学習をしています。一度で全てを完璧に習得し、永遠にその状態を維持する事なんて人外の天才でなければできないでしょう。悩むなんて時間の無駄。余計な心配はせずに反復的に学習しましょう。
復習を兼ねて、前回のテスト「CalculateSimpleExpression」と、計算処理の「Calculation」メソッドについて考えてみましょう。今のテストは実行できるか否かを確かめるためのものであり、大した意味はありません。この様なテストですと、前回述べたように「return 110;」でもパス出来てしまいます。AnalyzeSimpleExpressionの時と同様に改良しましょう。
改良のポイントは、テストに
網羅性があるのかという点と、
特徴ある値(最大値、最小値、中央値など)をチェックできているのかという点です。この2点を盛り込んだテストにするには、先ずは今のテストコードを整理して準備します。一度に全てをやろうとしては駄目です。段階を踏む事が肝心です。具体的には、テスト値が変わっても大丈夫な様に、新しいメソッドに汎用的なコードを抜き出します。
class MultiAnalyzerTest
{
//※他のプログラムは省略
//簡単な式1つの計算処理をチェックする
public void CalculateSimpleExpression()
{
int value1 = 10;
int value2 = 100;
CalculateTest( value1, value2 );
}
//計算処理をチェックする
private void CalculateTest( int value1, int value2 )
{
string inputValue = value1 + " + " + value2;
this.target = new MultiAnalyzer();
this.target.AnalyzeExpression( inputValue );
float result = target.Calculation();
float rightValue = rightValue = value1 + value2;
if ( rightValue != result )
{
System.Console.Write( inputValue +
"の計算処理が正しくありません。" );
System.Console.Write( " 正しい値:" + rightValue );
System.Console.WriteLine( " 処理結果;" + result );
}
}
}
コードを変えたらすぐに実行してみましょう。ブレークポイントをCalculateTestメソッド内のコードに設定し、デバッグ実行をすると、テストが実行されている事を確認できます。
これでひとまず安心ですが、現在のテストは演算子の部分に問題があります。今のままでは足し算しかチェックできていません。どの演算子でも大丈夫なように自分で改良してみましょう。
class MultiAnalyzerTest
{
//※他のプログラムは省略
//簡単な式1つの計算処理をチェックする
public void CalculateSimpleExpression()
{
int value1 = 10;
int value2 = 100;
CalculateTest( value1, value2, '+' );
}
//計算処理をチェックする
private void CalculateTest( int value1, int value2, char sign )
{
string inputValue = value1 + " " + sign + " " + value2;
this.target = new MultiAnalyzer();
this.target.AnalyzeExpression( inputValue );
float result = target.Calculation();
float rightValue = 0;
switch ( sign )
{
case '+':
rightValue = value1 + value2;
break;
case '-':
rightValue = value1 - value2;
break;
case '*':
rightValue = value1 * value2;
break;
case '/':
rightValue = value1 / value2;
break;
case '%':
rightValue = value1 % value2;
break;
}
if ( rightValue != result )
{
System.Console.Write( inputValue +
"の計算処理が正しくありません。" );
System.Console.Write( " 正しい値:" + rightValue );
System.Console.WriteLine( " 処理結果;" + result );
}
}
}
これで、任意の値と演算子を指定できる計算処理のテストが出来上がりました。
準備が出来たので、AnalyzeSimpleExpressionテストを参考にして、よりよいテストに改良します。
class MultiAnalyzerTest
{
//※他のプログラムは省略
//簡単な式1つの計算処理をチェックする
public void CalculateSimpleExpression()
{
//テストデータを準備
char[] signs = new char[] { '+', '-', '*', '/', '%' };
int[] values = new int[]
{
int.MinValue, int.MinValue + 1, int.MinValue / 2,
0, int.MaxValue / 2, int.MaxValue - 1, int.MaxValue
};
//全演算子と主要な数値の組み合わせをチェック
foreach ( char sign in signs )
{
foreach ( int v1 in values )
{
foreach ( int v2 in values )
{
this.CalculateTest( v1, v2, sign );
}
}
}
}
}
このテストを実行すると・・・動作が停止して怪しいダイアログボックスが表示されます。これでプログラムが間違っている事が分かったので、このダイアログボックスはひとまず閉じて、何が間違っているのかを考えます。次回へ続く・・・
テーマ : プログラミング
ジャンル : コンピュータ