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

标签 c# naming-conventions namespaces 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
        ...
    }
    ...
}

代码的使用方式需要从同一范围内引用所有这些类。可能会出现以下情况:

...
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

但我也希望有非常具有描述性和具体的类名。

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

最佳答案

通常 namespace 是复数的,以免与类名冲突(例如,您可能想要名为 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 指令导入 namespace ,然后不必在整个代码中完全限定类名,例如以下哪项更具可读性?

Vehicles.Cars.Wheel wheel = new Vehicles.Cars.Wheel();

CarWheel wheel = new CarWheel();

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


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

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

如果您发现每个文件的顶部都有相同的 using 指令堆栈,那么请将这些类折叠成一个命名空间。您通常包括所有预期在单个命名空间中一起使用的相关功能,并且仅将嵌套功能用于扩展基本命名空间但使用频率较低的功能。

关于c# - 当顶级命名空间包含基类且内部命名空间包含子类时的 C# 命名空间和类/子类命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1301283/

相关文章:

c# - ASP.NET Core - Swashbuckle 未创建 swagger.json 文件

python - 如何命名仅包含类定义的Python文件?

mysql - 为什么 MySQL 列不区分大小写?

php - 如何对php类进行分组?

javascript - 如何获取这个ajax请求的返回值?

c# - 异步/等待模型 View 演示者winforms

c# - 禁用的文本框丢失 View 状态

c# - XNA C# Controller 输入结构

java - 简单但反复出现的命名问题

php获取包含文件的命名空间