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

2023-11-22

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

我有以下情况:

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

or

Vehicle.Truck.TruckEngine

但我也想要一个非常具有描述性和具体的类名。

从哲学上讲,我要问的是,在考虑类名是否具有足够的描述性时,是否将命名空间作为类名的一部分。


通常命名空间是复数的,以免与类名冲突(例如,您可能希望名为Vehicle and 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();

or

CarWheel wheel = new CarWheel();

很明显两者都在做什么,但第二个要短得多。


请注意,如果您确实在名称中包含专业化,那么您可能会发现不需要所有嵌套命名空间(.Cars, .Trucks等),如果它们通常一起使用,这会变得很痛苦,因此使用它们的每个文件都必须导入所有名称空间,例如

using Vehicles;
using Vehicles.Cars;
using Vehicles.Trucks;
using Vehicles.SomethingElse;
using Vehicles.YetAnotherThing;

如果你发现同样的堆栈using指令位于每个文件的顶部,然后将类折叠到单个命名空间中。通常,您将预期在单个命名空间中一起使用的所有相关功能包含在内,并且仅将嵌套功能用于扩展基本命名空间但使用频率较低的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当顶级命名空间包含基类且内部命名空间包含子类时,C# 命名空间和类/子类命名约定 的相关文章

随机推荐