fc2ブログ

初心者のためのC#プログラミング本格入門69 - メソッドを追加したら即テスト

 この記事は、初心者のためのC#プログラミング本格入門68の続きです。前回は、ユーザーストーリーを発展させ、テストとプログラムを発展させる技法について解説しました。今回は、新しいテストファーストの心得を解説します。
 前回サンプルプログラムの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();
}

やったね♪今度こそテストが成功します。
 今回解説したように、新しいメソッドを追加したら直ぐに、新しいテストを作ってチェックします。また、テストをパスする最低限のプログラムしか書いていない事に注意して下さい。テストファーストのプログラミングでは、基本的に余計なプログラムを書きません。何故ならば、あれこれ考えてプログラムを作ろうとすると、思考が乱れてそこにバグが生まれるからです。それに余分なプログラムは贅肉です。プログラムの贅肉も極力無い方がいいです。特に初心者の方は慣れていないので混乱しやすいと思います。贅肉を作るためにプログラミングが進まないなんて損だと思いませんか?プロと初心者の違いがそこにあります。
 ちょっとプログラミングに慣れてくると、あれこれ考えがちですが、プロは余計な動きをしません。黙々とテストを追加して、そのテストをパスするプログラムを作るだけです。この様に書くと「楽しくないんじゃないか?」という疑問が湧くかと思います。ですが、それはむしろ逆です。テストファーストで開発すると、進行状況が見えてプログラミングがより一層楽しくなります。誰しも目的地が分からないよりも、目的地に向かって進んでクリアする方が楽しいと思います。
 「楽しくプログラミングして楽しく学ぶ」それが私のポリシーです。プログラミング上達のコツは、プログラミングをどれだけ楽しいものに出来るかだと言っても過言ではありません。楽しくなければ長続きしませんから上達しません。学習を耐えて努力をするものと考えず、楽しんだ結果上達するものだと考えて下さい。一緒にプログラミングを楽しみましょう。次回はさらなるテクニックを解説します。お楽しみに。
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター