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

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

或者按照第一个例子中显示的名称并依靠命名空间中编码的信息来保持清晰度?在后一种方法下,我认为我会想要在使用该库的代码中使用别名以增加清晰度,对吗?

似乎有些冗余:

Vehicle.Car.CarWheel

或者

Vehicle.Truck.TruckEngine

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

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

2个回答

21

通常命名空间是复数形式,这样不会与类名冲突(例如,你可能想要命名类为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();

两种方法的作用很明显,但第二种方法明显更加简短。


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

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

如果你发现这一堆using指令在每个文件的开头都是相同的,那么就将这些类合并到一个命名空间中。通常情况下,你会将所有相关的功能放在单个命名空间中以便一起使用,只有在扩展基本命名空间但不常用时才使用嵌套命名空间。


“通常使用复数命名空间”的部分对我帮助很大 - 谢谢! - mskfisher

4

我建议尽量避免在不同的命名空间中重复使用名称,特别是当客户端想要在同一程序中同时使用它们时。

你真的需要为Car,Truck等创建一个命名空间吗?所有这些命名空间听起来更像是类而不是命名空间。也许在你的实际情况中更有意义,但这样做需要谨慎。


是的,我明白你的意思。我认为我实际上面临的情况有些不同,但我所从事的领域术语非常难以理解,需要很多背景知识。在我的情况下,命名空间作为命名空间而不是类是有意义的。 - TJ_Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接