varより拡張メソッドのほうが問題児な気がするのだけど

varの件

R・田中一郎さんのところで議論になってたvar
暗黙的型付け(その4)

C#を使うようになってから、こういうのあまり気にしなくなってたので、
改めてみんないろいろ考えるんだなー、と勉強になりました。

僕はルールなんてねぇ!バンバン使っちゃえ!派なのですが…

と言うより、開発の規模でも基準なんて変わると思う。

問題だと思ったたびに、メンバーで話し合えばいいじゃん。

と思ってます(varに関しては)

で、本題ですが。拡張メソッドは大問題だと思うのですが!?

もしこんな拡張メソッドを作ったとしたら

static public string NullToEmpty(this string value)
{
return value ?? string.Empty;
}

もちろん普通に呼び出せます。

static void Main(string[] args)
{
string a = null;
string b = a.NullToEmpty();
}


これどうなの?

拡張メソッド自体は最高だと思ってます。

ただ、使い方次第で、ソースレビューする人を大混乱させるようなことが可能だと思うので、

拡張メソッドについては、バンバン使っちゃえ!の姿勢に変わりはないのですが、

varと違って、Visual Studio使っても、ソースの中みないと判断できないことは問題な気がします。*1

で、それより、もっと気になることがあるのですが

そもそも、その設計ってどうなの?

インスタンスのメソッドのように見せる能力なのに、その変数がnullの場合の処理を作るための
メソッドを拡張メソッドで用意していいの?

個人的には、String.IsNullOrEmptyも、拡張にしたほうが便利だと思えばしちゃっていいじゃん。

とも思ってるのですが・・・何か気持ち悪さが

ガイドラインないのかな?

ダメダメ、インスタンスにアクセスしないなら拡張にしないでねー

的なガイドラインはないのかな???*2

インターフェースの拡張メソッドでかなり無茶なこともできちゃいますし、

仕事でもむちゃくちゃに使いまくったら、便利!すげえ!、、と思いつつ

あれ?え?設計間違ってるかも?となりました。

まぁ、浮かれて勝手に設計間違えただけなのですが、

設計ミスできる要因が増えたことに違いはないと思うので、

『拡張メソッドはそのインスタンスを利用する事(nullは利用できないと考える)を前提とする』

と言うガイドラインがあってもおかしくないかな?と思いました。

*1:Visual Studioで開発してる時は、拡張メソッドはインテリセンスのマークで区別できるので拡張メソッドかどうかの判断はできます。

*2:僕は公式ガイドラインは絶対派です