スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

初心者のためのC#プログラミング本格入門71 - 不完全さと共に歩もう

 この記事は、初心者のための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. 簡単なテストを作る
  2. エラーを出してテストが実行されている事を確認
  3. テストを修正してより有効なテストにする
  4. テストをパスする事を考えてプログラミング
  5. テストがパスできなければ原因を考える
  6. 原因からプログラムの修正場所を発見する
  7. プログラムを修正してテスト
  8. テストが成功したら直ぐに次の事を考える
  9. 新しいプログラムを作るために1へと戻る
およその手順は以上です。この時のポイントは、一度に沢山の事を考えずに意識を集中させる事です。手を止めて色々考えるのではなく、気になる事があったら全てテストを作って試します。テストファーストとは、テストを通じて思考の集中と連続させるプログラミング技法とも言えます。
 初心者にありがちな失敗は、意識が集中しない事と、意識が連続しない事です。テストファーストを行って、効果的なプログラミング学習をしましょう。また、状況を考えない非現実的な完璧主義も学習の障害になります。完璧さを求めず、少しずつ覚えて生きましょう。気楽にした方が逆に高い学習効果を生むのです。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

インドリ

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カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。