トップネームスペースが含まれているC#の名前空間とクラス/サブクラスの命名規則は、基底クラスと内側の名前空間は、サブクラスが含まれています
-
18-09-2019 - |
質問
私は、特定のエンジニアリングアプリケーションのためのクラスライブラリを設計しようとしていると私は私のクラス&名前空間の命名規則が意味をなすことを確保しようとしています。
私は、次のような状況があります:
namespace Vehicle{
class Wheel{...} //base class for Wheel objects
class Engine{...} //base class for Engine objects
...
namespace Truck{
class Wheel: Vehicle.Wheel{...} //Truck specific Wheel object
class Engine: Vehicle.Engine{...} //Truck specific Engine object
...
}
namespace Car{
class Wheel: Vehicle.Wheel{...} //Car specific Wheel object
class Engine: Vehicle.Engine{...} //Car specific Engine object
...
}
...
}
のコードは、これらのクラスのすべてが同じスコープ内から参照する必要があります方法で使用されます。以下の状況がそうなります:
...
Vehicle.Wheel.DoSomething();
Vehicle.Truck.Wheel.DoSomething();
Vehicle.Car.Wheel.DoSomething();
...
このような状況下で、私は裕福
クラスに、より具体的な名前を与えていますnamespace Car{
class CarWheel: Vehicle.Wheel{...} //Car specific Wheel object
...
}
または最初の例に示されており、明確にするために、名前空間で符号化された情報に依存しているように命名を残しますか?後者のアプローチでは、私は、このライブラリを使用するコードで明確にするためalaising利用corretしたいと仮定?
持っているようだredundentます:
Vehicle.Car.CarWheel
または
Vehicle.Truck.TruckEngine
が、私も非常にわかりやすいと特定のクラス名を持っていると思います。
哲学的には、私が求めていることは、クラス名が十分説明的であれば検討する際に、クラス名の一部として名前空間を含めるかどうかではありません。
解決
一般的に名前空間は、複数形されている(例えば、あなたがVehicle
とCar
という名前のクラスを望む可能性がある)ので、以下のように、私は名前空間を使用するように傾斜させることだろう。
namespace Vehicles;
namespace Vehicles.Cars;
namespace Vehicles.Trucks;
クラスの名前については、彼らが一緒に使用される可能性がある場合は特に、専門とクラス名の前に付けるのが一般的だろうので、あなたのようなもので終わると思います:
class CarWheel : Wheel
class TruckWheel : Wheel
あなたはどこにでも.NET Frameworkの「冗長性」のこのタイプを見ることができ、System.Xml
名前空間に、たとえば、事実上すべてのクラスがXml
が付いている、またはSystem.Data.SqlClient
名前空間のほとんどのクラスはSql
が付いています。それは、例えば、あなたがusing
ディレクティブで名前空間をインポートして、あなたのコード全体のクラス名を完全修飾する必要がないことを意味し次のどれがより読みやすいのですか?
Vehicles.Cars.Wheel wheel = new Vehicles.Cars.Wheel();
または
CarWheel wheel = new CarWheel();
これは、両方がやっていることは明らかだが、2番目はかなり短いです。
<時間>あなたが名前に特殊化を含めなければ、あなたは、彼らは通常一緒に使用されている場合には苦痛になることができ、すべてのネストされた名前空間(.Cars
、.Trucks
など)を必要としないことがわかり、そしてそのことに注意してくださいそれらを使用して、すべてのファイルがすべての名前空間をインポートする必要があります、例えば、
using Vehicles;
using Vehicles.Cars;
using Vehicles.Trucks;
using Vehicles.SomethingElse;
using Vehicles.YetAnotherThing;
各ファイルの先頭にあるあなたがusing
ディレクティブのこの同じスタックを見つけた場合は、、その後、単一の名前空間にクラスを下に折りたたみます。通常は、単一の名前空間で一緒に使用することが期待されているすべての関連の機能を含む、唯一のベースの名前空間を拡張しますが、あまり頻繁に使用される機能のために、ネストされたものを使用します。
他のヒント
私はのクライアントが同じプログラムの両方で使用することをお勧めします場合は特に、異なる名前空間全体に名前を再利用を避けるために、をしようとするだろう。
あなたが本当にCar
など、Truck
の名前空間が必要ですか?すべてのこれらの名前空間は、より多くの彼らはnamespaceseよりのクラスのあるべきように聞こえます。おそらく、あなたの実際の状況でそれはしかし、より理にかなって...