QA@IT

.NETにおいて、拡張メソッドはどの名前空間に所属すべきでしょうか

3198 PV

拡張メソッドが所属する名前空間としては2つ候補があると思います。

  1. 拡張元のクラスが所属する名前空間(Ex: IDbConnection の場合は System.Data)
  2. 独自の名前空間(Ex: HogeNameSpace)

今までは後者を採用していたのですが、最近前者の方が分かりやすく便利なのでは、と考えています。
ただ、前者にはシグネチャの衝突という明確なデメリットがあるので、採用に躊躇しています。

それぞれのメリット・デメリットを教えてください。

回答

拡張メソッドが所属する名前空間としては2つ候補があると思います。

拡張メソッドを実装するクラスに限らず、クラスが所属する名前空間は「そのクラスがどういう性質や目的を持っているか」によって決定するべきだと思います。

たとえば string クラスに対する拡張メソッドであっても、それがアプリケーション固有の機能ならば、System 名前空間ではなくアプリケーションの名前空間配下に所属するのが自然だと思います。

編集 履歴 (1)
  • 回答ありがとうございます。
    通常のクラスであるなら、仰る通りだと思います。ただ、拡張メソッドは本来 string に持たせたい機能だが、string を継承できないので用意する、といったケースが多いと思います。
    この場合、別の名前空間にある方が不自然な気もするのですが、これはおかしな考えでしょうか?
    -

System.Dataを使用した方が同じ名前空間なので
自然な気がするかもしれませんが、System.Dataは元々用意されている
名前空間でありカスタマイズされる前提ではないと思います。
作られた拡張メソッドを誰かに使用してもらおうとしたときそれを作ったのが
誰なのか分かるよう自分で用意した名前空間に記述した方が良いと思います。

編集 履歴 (0)
  • 回答ありがとうございます。
    以前は自分も似たような考えだったのですが、アセンブリを参照設定した時点で誰のものかわかりますよね。
    また、System.Dataはカスタマイズ前提ではない、ということは拡張メソッドの否定につながるのでは?とも思います。
    アセンブリを参照し、 using System.Data; で拡張メソッドも使えたほうが利便性が高い気がするのですが、いかがでしょうか。

    -
  • > アセンブリを参照設定した時点で誰のものかわかりますよね
    その中身が分かっていれば分かりますが参照設定されたプロジェクトを時間がたってから見たとき同じ名前空間にあるメソッドとしかプログラマは分からないので混乱するかと思います。

    実際 `Where` メソッドは
    `System.Collections.Generic` ではなく`System.Linq` に属しています。

    -
  • >using System.Data; で拡張メソッドも使えたほうが利便性が高い気がするのですが、いかがでしょうか。
    そんなことを言ってしまったら名前空間を分けないほうがいいということになってしまうのではないでしょうか?
    -
  • 前レスは そんなことを ~がレスです。レスが長いと書けないので分けたら繋がってしまいました。 -
  • 名前空間なしはちょっと極論すぎるような・・・
    `Where` メソッドが `System.Collections.Generic` ではなく`System.Linq` に所属するメリットはあるのでしょうか?
    よければご教授ください。
    -
  • WhereメソッドがLinqの機能であることを強調したいのではないでしょうか?Linqを参照することによりLinqの機能を使っていることが分かる。作った人間ではないので憶測でしか言えないです。教授するほどえらそうなことはいえません。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。