8

特定のエンジニアリングアプリケーション用のクラスライブラリを設計しようとしています。また、クラスと名前空間の命名規則が適切であることを確認しようとしています。

私は次の状況にあります:

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を利用したいと思います。

持っているのは冗長なようです:

Vehicle.Car.CarWheel

また

Vehicle.Truck.TruckEngine

しかし、私はまた、非常にわかりやすく具体的なクラス名を付けたいと思っています。

哲学的に、私が求めているのは、クラス名が十分に説明的であるかどうかを検討するときに、クラス名の一部として名前空間を含めるかどうかです。

4

2 に答える 2

21

通常、名前空間は複数形になっているため、クラス名と衝突しないようになっています(たとえば、andという名前のクラスが必要になる可能性がありますVehicleCar。そのため、次のように名前空間を使用する傾向があります。

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ディレクティブのスタックが各ファイルの先頭にある場合は、クラスを1つの名前空間にまとめます。通常、単一の名前空間で一緒に使用されることが予想されるすべての関連機能を含め、基本名前空間を拡張するがあまり使用されない機能にはネストされた機能のみを使用します。

于 2009-08-19T17:07:11.133 に答える
4

特にクライアントが同じプログラムで両方を使用したい場合は、異なる名前空間で名前を再利用しないようにします

Carなどの名前空間が本当に必要Truckですか? これらの名前空間はすべて、名前空間というよりもクラスであるように聞こえます。おそらくあなたの実際の状況では、それはもっと理にかなっています...

于 2009-08-19T17:08:46.247 に答える