この記事は、
初心者のためのC#プログラミング本格入門70の続きです。前回は、テストオブジェクトとテストの心得について解説しました。今回は、さらなるテストファーストの心得を解説します。
現在、MultiAnalyzerオブジェクトの解析処理をプログラミングしました。次は、計算処理を行うプログラムを作ります。解析処理が完全ではない事を気にする人がいるかもしれません。ですが、その様な細かい事は考えずに前に進みます。先ずはその理由を解説します。
プログラミングには色々な要素があります。ですがそれら全てを考慮していては前に進みません。これは、何でも反対する人を想像すると分かりやすいと思います。世の中には、何か新しいアイデアを出した人や、前に進もうとする人にケチをつけて何でも反対する人がいます。この手の人は、「○○だから駄目」と何でももっともらしい理由をつけて反対しますが、そういった人に従っていれば物事は前に進みません。何事でもそうなのですが、細かい事に拘り完璧にしないと駄目だという姿勢は物事を停滞させます。何故ならば、
物事に完璧な状態はなく、プログラミングで完璧さを求めることなど不可能だからです。
例えば、プログラミングに完璧さを求めると、OSを作れる程の知識と技術力、プログラミング言語そのものを作れる程の知識と技術力、ハードウェアを作れる程の知識と技術力・・・など永遠に学ぶべきものがあります。しかしながら、基礎的なプログラミングもできない状態で、OSやプログラミング言語を作れませんし理解も出来ません。従って、
初めから完璧さを求めると矛盾が生じるので、不完全なまま学習をするしかないのです。
アマチュアの人に限って色々言いがちですが、プロの人はあまりそういう事を言いません。何故ならば、実務では不完全なのは普通の状態だからです。仕事が始まった時点で、全ての仕様(作るべきものや機能など)が完璧に決定し、仕事をする時点でその事に関して、完璧な知識を持っていることなどありません。ですから、不完全さを前提に、徐々に完成させるように仕事を進めます。
プログラミングの学習も当然初めから完璧な事はありえません。そもそも完璧な状態ならば学習が終わっており、学習する必要などありません。ですから、分からない事だらけだとしり込みせず、「
学習している時点で知らない事があって当然」だと考え、積極的にプログラミングをしていきましょう。
計算処理を作るには、ひとまずテストを考える所から始めます。早速テストを作ってみましょう。
class MultiAnalyzerTest
{
//他のプログラムは省略
//全てのテストを実行する
public void ExecuteAllTest()
{
this.AnalyzeSimpleExpression();
this.ErrorExpressionCheck();
this.ErrorAndSuccess();
this.AllErrorExpressionDelete();
this.CalculateSimpleExpression();
}
// 簡単な式1つの計算処理をチェックする
public void CalculateSimpleExpression()
{
int value1 = 10;
int value2 = 100;
string inputValue = value1 + " + " + value2;
this.target = new MultiAnalyzer();
this.target.AnalyzeExpression( inputValue );
float result = target.Calculation();
float rightValue = value1 + value2;
if ( rightValue != result )
{
System.Console.Write(
inputValue + "の計算が正しくありません。" );
System.Console.Write(
" 正しい値:" + rightValue );
System.Console.WriteLine( " 処理結果;" + result );
}
}
}
テストを作り終えたら、ひとまずテストを実行(デバッグなしで実行 Ctrlキー+F5キー)してみましょう。まだCalculationメソッドをちゃんと作っていないのでエラーメッセージが表示される筈です。テストがちゃんと実行される事を確認するための作業ですからこれでOKです。
さて、計算をするにはどうすればよいのでしょうか?その答えは簡単です。MultiAnalyzerオブジェクトはコンポジションオブジェクトなので、Analyzerオブジェクトに計算処理も任せましょう。複数の式を計算するのであれば、そう簡単ではありませんが、この簡単なテストをパスする事だけを考えるので、今は最低限しか考えません。
できましたか?模範解答を見る前にプログラミングして下さい。
class MultiAnalyzer
{
//他のプログラムは省略
//計算式の計算結果を返す
public float Calculation()
{
float result = 0.0f;
foreach ( Analyzer analyze in analyzers )
{
result = analyze.Calculation();
}
return result;
}
}
拍子抜けしたかもしれませんが、
余計な事は考えないのがテストファーストの原則なのでこれでOKです。テストを増やせば自然と良くなるので、初めは「return 110;」の様なプログラムでもよいぐらいです。
数回にわたってテストファーストとテストを解説してきたので、今まで解説してきた事を簡潔に纏めます。
【実践的なプログラミングの手順】
- 簡単なテストを作る
- エラーを出してテストが実行されている事を確認
- テストを修正してより有効なテストにする
- テストをパスする事を考えてプログラミング
- テストがパスできなければ原因を考える
- 原因からプログラムの修正場所を発見する
- プログラムを修正してテスト
- テストが成功したら直ぐに次の事を考える
- 新しいプログラムを作るために1へと戻る
およその手順は以上です。この時のポイントは、
一度に沢山の事を考えずに意識を集中させる事です。手を止めて色々考えるのではなく、気になる事があったら全てテストを作って試します。テストファーストとは、テストを通じて
思考の集中と連続させるプログラミング技法とも言えます。
初心者にありがちな失敗は、意識が集中しない事と、意識が連続しない事です。テストファーストを行って、効果的なプログラミング学習をしましょう。また、状況を考えない非現実的な完璧主義も学習の障害になります。完璧さを求めず、少しずつ覚えて生きましょう。気楽にした方が逆に高い学習効果を生むのです。
テーマ : プログラミング
ジャンル : コンピュータ