中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

ガード句がプログラムをわかりやすくするとは限らない

昨日はcodeseekの勉強会でした。

http://www.codeseek.net/

その中でプログラムをわかりやすくするとしていろいろな要素をあげていたのですが、ガード句はプログラムをわかりやすくするとは限らないと言ってみました。

class A
{
    public int i;
    public string s;
}

static void Main(string[] args)
{
    A data = new A();
    func(data);

}

private static void func(A data)
{
    if ( data == null ) throw new ArgumentNullException("data");
    //いっぱいの処理
    Console.WriteLine(data.s.IndexOf("A"));
}

たとえばこのようなプログラムがあったときにdata.s.IndexOf("A")の部分でNULL参照で落ちてしまいます。

dataという引数は正しくnullチェックされていますが、data.sまではnullチェックされていなかったということがわかった例です。

この関数の中ではdata.sまで利用するのだからdata.sのガード句である

    if ( data.s == null ) throw new ArgumentNullException("data.s");

まで入れておくべきだったのかもしれません。

ただほかの処理でも使うものがすべてメソッドの上で書かれているということは、メソッド中段ではわからなくなっているかもしれません。(コードを追っかけている際に覚えていられない)

data.sを利用する局面でチェックした方がいい場合もあれば、そうでない場合もあるので、一概にガード句がいいプログラムになるとは限らないの例でした。

投稿日時 : 2009年11月20日 18:27

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント