post がすでに存在し、ほぼ同じことを説明していることは知っていますが、私のものは少し違うと思います。
私が知りたいのは、名前空間の割り当てに関して拡張メソッドをどのように編成するかです。現在、フレームワークの拡張メソッドには、次の名前空間パターンを使用しています
中には拡張メソッドクラスがあります。これは私にとっては問題ありませんが、エクステンダーがソフトウェア開発者にすぐに表示されないという欠点があります。 String
オブジェクトを拡張する非常に便利な 拡張メソッド "In" を提供するStringExtenderクラスがある場合を考えてみます。上記の名前空間を持つ拡張メソッドがあるため、プログラマーは、名前空間を明示的に含めない限り、拡張メソッドを見ることができません。代わりに、拡張メソッドをSystem
名前空間に配置すると、誰もがすぐにそれを見ることができますが、私は これは悪い習慣だと読んでください 。
だから私の質問は、拡張メソッドs.tをどのように宣伝するかです。それらは開発者によって使用されます。
それらすべてを独自の名前空間に配置しますCompany.Common.Extensions
。そうすれば、拡張メソッドのいずれかがあれば、それらすべてがあります。さらに、少なくとも私の店では、開発者が拡張メソッドについて知らないことを心配する必要はありません。私は反対の心配を持っています、拡張メソッドの過負荷! :)
ここでの問題は、名前空間の命名ではなく、開発者のドキュメントと教育の欠如です。
それらを意味のある名前空間に配置し、すべての拡張メソッドを文書化したwiki記事を作成してから、wiki記事へのリンクを記載した電子メールを開発者に送信します。
これは名前空間の問題ではなく、通信の問題です。
これらの方法が役立つ場合は、これを開発者に伝え、逆に、開発者からのフィードバックに基づいて行動する必要があります(適切なレベルの判断で)。
システム名前空間に何かを配置することは、後で災害と混乱のレシピになります。これを実行したいのは、機能を古いフレームワークに「バックポート」することだけです。そうすれば、おそらく自分で実行するのではなく、LinqBridgeのようなものを使用して実行する必要があります。
一緒に広く役立つ場合を除いて、すべての拡張機能を1つの名前空間にスローしたいという要望には注意してください。一部の開発者は、インテリセンスを介してすべてのものに砲撃され、キッチンが沈むと、木のために木が失われることに気付く場合があります。
名前空間を会社名のままにしておくことは、混乱を避けるために一般的に賢明です。
Visual Studioを使用していると仮定すると、1つの方法は、カスタムクラステンプレートを作成する(またはデフォルトのテンプレートを変更する)ことです。これにより、開発者が新しいクラスファイルを作成するたびに、名前空間でusingステートメントが自動的に作成されます。 C コーディングの生産性のためにVisual Studio 2005テンプレートを使用する を参照してください。
@ Juri-考えてみれば、これは、クラスXが.NETFrameworkに存在することを知っている開発者と同じ問題です。コミュニケーションは、拡張メソッドやその他のヘルパーを問わず、すべてのチームメンバーが適切なクラスを使用するための鍵です。
JPが述べているように、Extensionsと呼ばれるある種のサブフォルダーにextensionメソッドがよく見られます。うまくいけば、my.company.web.utilsを使用すると述べたときに、名前空間は実際にはPascalケースになっていますか?
それらを良い場所に置いたとしても、他の開発者がそれらを使用するという100%の保証はありません。
私は愚かで怠惰でミニマルなので、拡張するタイプと同じ名前空間に配置します。このように、ステートメント、ドキュメント、またはそれらに関する電子メールを追加で使用する必要はありません(Winston)。
グローバル名前空間に拡張メソッドを配置することで、目的を達成できます。それが私がしていることであり、using
ステートメントを必要とせずに利用できます。
はい、Extensionメソッドを自社の名前空間に配置することがベストプラクティスだと思います。システム名前空間に入れるのは怠惰な操作です
ReSharperがこの問題を解決する方法が好きです。
ReSharperは、対応するusingsがなくても、使用可能な拡張メソッドを検出します。 usingが存在しない場合、Intellisenseは拡張機能が存在する名前空間も表示し、拡張機能がどこから来ているかを明確にしますandは、それを選択するとusingが追加されることを示します。 (以下の例。)
当然、現在のプロジェクトが到達可能な、つまり直接または間接的に参照される名前空間のみが含まれます。
これは、2つの拡張メソッドがある場合にIntellisenseが表示する可能性のある例です。最初のものは、すでに含めた名前空間からのものです。 2つ目は、(まだ)含まれていない名前空間からのものです。
AddMvc
AddEntityFrameworkSqlServer (Microsoft.Extensions.DependencyInjection)
すべてを同じ名前空間とクラスに配置しますが、部分的なクラスを使用してそれらを整理します。
例えば:
ExtensionMethods-String.cs
ExtensionMethods-DataObject.cs
ExtensionMethods-Debug.cs
...などすべてに部分的なクラスがあります...