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も、拡張にしたほうが便利だと思えばしちゃっていいじゃん。
とも思ってるのですが・・・何か気持ち悪さが
ガイドラインないのかな?
ダメダメ、インスタンスにアクセスしないなら拡張にしないでねー
インターフェースの拡張メソッドでかなり無茶なこともできちゃいますし、
仕事でもむちゃくちゃに使いまくったら、便利!すげえ!、、と思いつつ
あれ?え?設計間違ってるかも?となりました。
まぁ、浮かれて勝手に設計間違えただけなのですが、
設計ミスできる要因が増えたことに違いはないと思うので、
『拡張メソッドはそのインスタンスを利用する事(nullは利用できないと考える)を前提とする』
と言うガイドラインがあってもおかしくないかな?と思いました。
*1:Visual Studioで開発してる時は、拡張メソッドはインテリセンスのマークで区別できるので拡張メソッドかどうかの判断はできます。