当顶级命名空间包含基类和内部命名空间时,C#命名空间和类/子类命名约定包含子类

TJ_*_*her 8 c# namespaces naming-conventions classname

我正在尝试为特定的工程应用程序设计一个类库,我正在努力确保我的类和命名空间命名约定有意义.

我有以下情况:

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
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

代码的使用方式是需要在同一范围内引用所有这些类.可能存在以下情况:

...
Vehicle.Wheel.DoSomething();
Vehicle.Truck.Wheel.DoSomething();
Vehicle.Car.Wheel.DoSomething();
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我最好给这些课程更具体的名字

namespace Car{
    class CarWheel: Vehicle.Wheel{...} //Car specific Wheel object
    ...
}
Run Code Online (Sandbox Code Playgroud)

或保留第一个示例中所示的命名,并依赖于命名空间中编码的信息以便清楚起见?在后一种方法下,我假设我想在使用这个库的代码中明确地使用alaising,对吗?

拥有以下内容似乎更令人不满:

Vehicle.Car.CarWheel
Run Code Online (Sandbox Code Playgroud)

要么

Vehicle.Truck.TruckEngine
Run Code Online (Sandbox Code Playgroud)

但我也希望有非常具有描述性和特定性的类名.

从哲学上讲,我在问的是,在考虑类名是否足够描述时,是否将名称空间作为类名的一部分.

Gre*_*ech 20

通常,名称空间是多元化的,以免与类名冲突(例如,您可能希望类名为VehicleCar),因此我倾向于使用名称空间,如下所示:

namespace Vehicles;
namespace Vehicles.Cars;
namespace Vehicles.Trucks;
Run Code Online (Sandbox Code Playgroud)

至于类的名称,通常在类名前加上特化,特别是如果它们可能一起使用,那么你最终会得到类似的东西:

class CarWheel : Wheel
class TruckWheel : Wheel
Run Code Online (Sandbox Code Playgroud)

您可以在.NET Framework中的任何位置看到这种类型的"冗余",例如在System.Xml命名空间中几乎所有类都以前缀为前缀Xml,或者在System.Data.SqlClient命名空间中大多数类都带有前缀Sql.这意味着您可以使用该using指令导入名称空间,然后不必在整个代码中完全限定类名,例如,以下哪个更具可读性?

Vehicles.Cars.Wheel wheel = new Vehicles.Cars.Wheel();
Run Code Online (Sandbox Code Playgroud)

要么

CarWheel wheel = new CarWheel();
Run Code Online (Sandbox Code Playgroud)

两者都做得很明显,但第二个要短得多.


请注意,如果你在名称中包含的专业化,那么你可能会发现你并不需要所有的嵌套的命名空间(.Cars,.Trucks,等),可以成为痛苦的,如果他们通常一起使用,所以每一个文件使用起来会必须导入所有名称空间,例如

using Vehicles;
using Vehicles.Cars;
using Vehicles.Trucks;
using Vehicles.SomethingElse;
using Vehicles.YetAnotherThing;
Run Code Online (Sandbox Code Playgroud)

如果您发现同一堆using指令位于每个文件的顶部,则将类折叠为单个命名空间.您通常包括预期在单个命名空间中一起使用的所有相关功能,并且仅将嵌套的功能用于扩展基本命名空间但不常使用的功能.