スポンサーサイト

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

初心者のためのC#プログラミング本格入門119 - オブジェクト指向プログラミングは親をも使う

 この記事は、初心者のためのC#プログラミング本格入門118の続きです。前回は、オブジェクト指向プログラミングを行う際によくある間違いについて解説しました。今回は、オブジェクト指向プログラミングの技法のうちの一つである、オーバーロードと、使用する型の選別法について解説します。
 前回の最後に紹介した冗長なプログラムは、同様のプログラムが2か所あります。重複しているプログラムがあれば、極力1つにするのが鉄則です。何故ならば、重複して存在しているプログラムは、様々な弊害を生むからです。例えば、後で間違っていることに気づいた、やりたい内容が変わったなどといった理由で、プログラムを変更する際に、更新ミスを誘発します。重複して散在するプログラムを、全て正しいものに修正する行為は、煩雑かつ更新忘れの危険が伴います。他にもいくつか理由がありますが、初心者の方が混乱するだけなので、プログラムの重複は悪だと覚えてください。
 話を戻して、先ほどのプログラムの修正方法を考えます。こういった場合、リファクタリングという技法を使い、重複しているプログラムをメソッドにして取り出します。

//関係のないプログラムは省略
abstract class Test
{
    //全てのテストを実行する
    public void ExecuteAllTest()
    {
        string msg;
        System.Action[ ] tests = GetTests();
        foreach ( System.Action test in tests ) {
            try {
                test( );
            } catch ( TestFail e ) {
                this.Error( e );
            } catch ( System.InvalidOperationException e ) {
                this.Error( e );
            }
        }
    }
    
    protected void Error( TestFail e )
    {
        string msg = e.Message +
            System.Environment.NewLine +
            e.StackTrace;
        this.Error( msg );
    }

    protected void Error( System.InvalidOperationException e )
    {
        string msg = e.Message +
            System.Environment.NewLine +
            e.StackTrace;
        this.Error( msg );
    }
}

このプログラムを書き終わったら、一度デバッグ実行(F5)をして、結果が修正前と同様なのか確認してください。プログラムの修正は、このように確認しつつ少しずつ行います。
 同じ名前のメソッドを複数定義している点に注目してください。これは、オーバーロード(多重定義)というものです。オーバーロードは、オブジェクト指向プログラムの原則のうちの一つ、多態性という性質に対応した機能です。これで、ExecuteAllTestメソッドから重複したプログラムが消え、すっきりとしました。しかし、まだ問題が一つあります。それは、全く同じプログラムのオーバーロードメソッドが2つも存在することです。これも重複しているといえます。
 こんな時は、型の継承関係を確認します。具体的には、MSDNや書籍を調べましょう。その型はどのオブジェクトから派生しているか(どのオブジェクトの子か)書かれているはずです。もしそれでもわからない場合は、開発ソフトでF12キーを押してください。そうすればプログラムが読めれば親がわかります。皆様が調べたものとして話しを進めます。
 TestFailオブジェクトと、System.InvalidOperationExceptionオブジェクトの共通した親は、System.Exceptionオブジェクトです。System.InvalidOperationExceptionオブジェクトの直接の親は、SystemExceptionオブジェクトですが、そのまた親はExceptionオブジェクトなので、共通した親はSystem.Exceptionオブジェクトです。従って、System.Exceptionオブジェクトを使ってメソッドを定義します。

//関係のないプログラムは省略
abstract class Test
{
    //全てのテストを実行する
    public void ExecuteAllTest()
    {
        string msg;
        System.Action[ ] tests = GetTests();
        foreach ( System.Action test in tests ) {
            try {
                test( );
            } catch ( TestFail e ) {
                this.Error( e );
            } catch ( System.InvalidOperationException e ) {
                this.Error( e );
            }
        }
    }
    
    //親を使えば1つで済む
    protected void Error( System.Exception e )
    {
        string msg = e.Message +
            System.Environment.NewLine +
            e.StackTrace;
        this.Error( msg );
    }
}

親を使うというと聞こえは悪いですが、プログラミングの親は、血縁関係の親ではないので気にしないでください。
 さて、目ざとく読者は、例外処理を受け取るcatchの部分が同じだと思うかもしれません。ですが、catchステートメントでSystem.Exceptionを受け取るようにしたら駄目です。何故ならば、意図していない例外も飲み込まれるからです。つまり、テストの目的と合致したものと、偶然発生したものの区別がつかなくなるのです。テストをプログラミングする人は、なんとなくエラーがわかればいいという考えでは駄目です。どのような間違いをチェックするテストプログラムなのか、ちゃんと把握してなければ駄目なのです。
 お疲れ様でした。今回ちょっと長くなりましたが、これで終わりです。次回は違う内容を書きます。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

インドリ

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