.NET BCLの名前と競合する(そうでなければ最適な)クラス名を使用する必要がありますか?
-
26-09-2019 - |
質問
この状況はおそらくあなたの一部にとっては完全に珍しいことではありません。あなたはクラスに入れる機能を持っていますが、そのクラスの完璧な名前(*)は、 System
名前空間または他の名前空間/クラスはあなたではありませんがあなたは using
/import
ing。
(*) 完璧には、小さく、簡潔で明確な名前を意味します。
たとえば、私は持っています Utils
を持っているクラス Diagnostics
(主にデバッグユーティル)クラスとa Drawing
クラス。私はできた:
- 持っている
DrawingUtils
クラスとaDiagnosticsUtils
クラスですが、それは単に悪い構造のような匂いがします。 - シソーラスを選んで、さらに悪い、より長い、または厄介な名前でやられます。
- 英語ではなく、母国語でクラス名を書いてください。
- Stackoverflowの賢い人たちに聞いてください。
オプション1-3は約束していないと思います:(
編集:
私が選んだ答えは問題に明確に対処していないので(私はどちらもそうではありません)、 同じ状況に直面している人に私がお勧めします。自分自身に尋ねることです。矛盾するBCLクラス/名前空間を頻繁に使用しますか?いいえの場合は、あなたの名前が矛盾します(私が診断で行ったように)。はいの場合、それを単語を追加します 制限 クラス/名前空間の可能性。
実際には、これは次のことを意味します。
"Drawing"
: :描くもの。
"MyCustomControlDrawing"
: :描くもの それだけ の上 MyCustomControl
. 。例えば: "WidgetDrawing"
.
編集2:
解決
名前空間を使用して、他の名前空間のクラスからクラスを乱用します。完全に資格のある名前または必要なものをコンパイルに伝える声明を使用するかのいずれかを使用します。
using Type = MyReallyCoolCustomReflector.Type;
これで、システム名空間からタイプクラスを使用する場合は、
System.Type sysType = anObject.GetType();
一般的に、私は名前の複製を避けようとしますが、これは常にそのようにうまくいくとは限りません。また、シンプルで読みやすく、保守可能なコードが好きです。したがって、それはしばしばトレードオフの決定です。
他のヒント
名前を保持することに問題はありません Drawing
, Diagnostics
など。それは、命名の競合を解決するための名前空間の目的の1つです。
名前空間の美しさは、同一の名前のクラスを作成できることです。ファイルにエイリアスを名前空間に割り当てると、 using
声明。
using MyAlias = My.Custom.Namespace;
これにより、クラスはMicrosoftのクラスとは別に保持されます。
その後、クラスを参照できます
MyAlias.Diagnostics
または、別のエイリアスをMicrosoftの名前空間に割り当てることもできますが、他の開発者を混乱させるため、これはお勧めしません。
私にとって、それは本当に矛盾するクラス名を意図的に書くことの手間がかかる価値はありません。コードベースに精通していない他の開発者を混同します。なぜなら、彼らはBCLクラスを使用することを期待しているが、代わりに(またはその逆)。それから、あなたは彼らが具体的に書かなければならないときに彼らの時間を無駄にします using
エイリアス。
正直なところ、意味のある識別子名を出すことは有用なスキルですが、開発を遅らせる価値はありません。すぐに何か良いものを思い付くことができない場合は、平凡なものに落ち着き、先に進みます。名前をめぐる価値はほとんどありません。私はあなたができるより生産的なことがあると思います。
編集: :私はまた、「小」が「完全な」識別子のコンポーネントであるとは思わない。確かに簡潔で明確ですが、特定の構成要素の目的を伝えるのに長い名前が必要な場合は、そうです。結局のところ、私たちはIntellisenseを持っています。
さて、名前空間の衝突を避けたい場合は、できることがいくつかあります。
- 衝突しないで、代わりに一意の名前を選択してください。
例:
数学のクラスを作成している場合は、名前を付けることができます 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;
}
}
}
レコードのためだけに:.NETフレームワークにはどちらもありません Utils
または Diagnostics
クラス。 (しかし、持っています System.Diagnostics
名前空間。)
個人的には、私はのような汎用クラスが好きではありません Utils
それらの方法はあまり発見できない(そして通常は一般的すぎる、またはあまりにも具体的すぎる)ので、私はそれらの使用を内部クラスのように正当化するでしょう。
残りについては、名前空間が便利な他の人に同意します。 (すでにクラスがある場合は、クラスに名前を付けることを二度考えましたが System
名前の競合のためではなく、「元の」クラスを使用できない理由が、私が作成しようとしているクラスが意味的に異なることを意味するため、同じ名前で同じ名前があります。
多くの場合、より具体的な名前を選択することができます。取った Utils
例えば。絶対にすべてをutilityと呼ぶことができます。あなたのコードの読者にとって、このクラス名は価値がありません。
多くの場合、ユーティリティクラスは、他のどこにも実際には適合しない方法のコレクションです。それらを所有する場所に配置するか、いくつかの基準でグループ化してから、グループをクラス名として使用してください。このようなグループ化は私の経験では常に可能です。
一般に:
それが私たちがやっていることです(ねえ、後でそれをリファクタリングすることができます)
1回または2回使用しましたが、重要なクラスでのみ使用しました。 「完璧な」名前がまだわからない場合に特に便利です。
これについても考えないでください...
名前空間エイリアスを使用するのは楽しいことではありません。できるなら、私はそれを避けます。