昨日は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を利用する局面でチェックした方がいい場合もあれば、そうでない場合もあるので、一概にガード句がいいプログラムになるとは限らないの例でした。
http://blogs.wankuma.com/naka/archive/2009/11/11/182901.aspx
OSが7かVistaかで使用されるソートテーブルが変わるのでそれが原因かと思って確認してみましたが、愛々問題の修正だけで解決するようですね。
いろいろ調べて見ましたが、どのように修正されたかは見つかりませんでした。