10

このような状況は、一部の人にとっては珍しいことではありません。クラスに追加する機能がありますが、そのクラスの完全な名前 (*) が、System名前空間内のクラスの 1 つ、または自分のものではない他の名前空間/クラスによって取得されていますが、あなたはusing/ importing です。

(*)完璧とは、小さくて簡潔で明確な名前を意味します。

たとえばUtilsDiagnostics(主にデバッグ ユーティリティ) クラスとクラスを持つDrawingクラスがあります。私はできた:

  1. DrawingUtilsクラスとクラスがありますDiagnosticsUtilsが、それは悪い構造のようなにおいがします。
  2. シソーラスを選んで、もっと悪い、長い、またはぎこちない名前で終わります。
  3. 英語ではなく母国語でクラス名を書いてください。
  4. StackOverflow の賢い人に聞いてください。

オプション1〜3は有望ではないと思います:(

編集:

私の選択した答えは問題に明確に対処していないため (私もそうしていません)、同じ状況に直面している人々に推奨することは、次のことを自問することです:競合する BCL クラス/名前空間を頻繁に使用しますか? いいえの場合は、名前が競合するようにします (Diagnostics で行ったように)。はいの場合は、クラス/名前空間の可能性を制限する単語を追加してください。

実際には、これは次のことを意味します:
"Drawing": 描画するもの。:のみ
"MyCustomControlDrawing"描画されるもの。例: .MyCustomControl"WidgetDrawing"

EDIT2:

次回は、Extension Methods ( Lawmmower提供) を検討する別のソリューションを紹介します。

4

7 に答える 7

8

Drawing名前などを保持することに問題はありませんDiagnostics。名前の競合を解決することは、名前空間の目的の 1 つです。

于 2010-08-06T14:03:22.463 に答える
6

名前空間の利点は、同じ名前のクラスを作成できることです。usingステートメントを使用してエイリアスをファイルにインポートするときに、ネームスペースにエイリアスを割り当てることができます。

using MyAlias = My.Custom.Namespace;

これにより、クラスが Microsoft のクラスから分離されます。

その後、クラスを次のように参照できます

MyAlias.Diagnostics

または、Microsoft の名前空間にエイリアスを割り当てることもできますが、他の開発者を混乱させるため、これはお勧めしません。

于 2010-08-06T14:04:15.963 に答える
5

私にとって、競合するクラス名を故意に書くという手間は本当に価値がありません。あなたのコードベースに慣れていない他の開発者は、BCL クラスを使用することを期待しているのに、代わりにあなたのクラスになってしまう (またはその逆) ため、混乱することになります。using次に、特定のエイリアスを作成する必要があるときに時間を無駄にします。

正直なところ、意味のある識別子名を考え出すことは有用なスキルですが、開発を遅らせる価値はありません。すぐに何か良いことを思いつくことができない場合は、平凡なものに落ち着いて先に進みます. 名前に苦労してもほとんど意味がありません。もっと生産的なことができると思います。

編集:「小さい」が「完全な」識別子の構成要素であるとは思いません。確かに簡潔で明確ですが、特定の構造の目的を伝えるのに長い名前が必要な場合は、それで構いません。結局のところ、私たちはインテリセンスを持っています。

于 2010-08-06T14:02:49.797 に答える
4

名前空間を使用して、クラスを他の名前空間のクラスから明確にします。完全修飾名を使用するか、必要なものをコンパイルに伝える using ステートメントを使用します。

using Type = MyReallyCoolCustomReflector.Type;

System 名前空間の Type クラスを引き続き使用する場合は、次のようにします。

System.Type sysType = anObject.GetType();

通常、私は名前の重複を避けようとしますが、これが常にうまくいくとは限りません。また、シンプルで読みやすく、保守しやすいコードも好きです。したがって、多くの場合、それはトレードオフの決定です。

于 2010-08-06T14:04:51.303 に答える
1

名前空間の競合を回避したい場合は、いくつかの方法があります。


  • 衝突しないで、代わりに一意の名前を選択してください。

例:

Math クラスを作成している場合は、自分の名前を付けることができますCamiloMartin.MathHelper


  • 長い名前空間を使用して衝突を区別します。

例:

public class MyClass
{
    public int SomeCalculation(int a, int b)
    {
        return MyNamespace.Math.SomeFunc(a, b);
    }
}

  • エイリアスを使用して区別します。

例:

using System.Math;
using SuperMath = MyNamespace.Math;

namespace MyNamespace
{
    public class MyClass
    {
        public int SomeCalc(int a, int b)
        {
             int result = Math.abs(a);
             result = SuperMath::SomeFunc(a, b);

             return result;
        }
    }
}
于 2010-08-06T14:11:17.503 に答える
1

多くの場合、より具体的な名前を選択できます。例を挙げてみましょうUtils。絶対にすべてがユーティリティと呼ぶことができます。コードの読者にとって、このクラス名は価値がありません。

多くの場合、ユーティリティ クラスは、他のどこにも当てはまらないメソッドのコレクションです。それらを所属する場所に配置するか、いくつかの基準でグループ化してから、グループをクラス名として使用してください。このようなグループ化は、私の経験では常に可能です。

一般に:

  1. それが私たちがやっていることです(ねえ、後でリファクタリングできます)

  2. 1、2回使用しましたが、重要なクラスでのみ使用しました。「完璧な」名前をまだ知らない場合に特に便利です。

  3. これについても考えないでください...

名前空間エイリアスを使用するのは面白くありません。なので、できれば避けています。

于 2010-08-06T14:20:56.317 に答える
1

記録のために: .NET フレームワークにはクラスUtilsDiagnosticsクラスもありません。(ただし、System.Diagnostics名前空間はあります。)

個人的には、汎用クラスは好きではありUtilsません。なぜなら、それらのメソッドはあまり見つけられない (そして、通常はあまりにも一般的または特殊すぎる) ためです。したがって、内部クラスとしてのみ使用することを正当化します。

残りについては、名前空間が便利であるという点で他の人に同意します。(同じ名前のクラスが既にある場合は、クラスに名前を付けることを2度考えましたがSystem、名前の競合のためではなく、「元の」クラスを使用できない理由が、クラスがm about to create は意味的に異なります。)

于 2010-08-06T14:16:18.760 に答える