我有找到一个好的命名空间设计和类顺序的问题。 想象一下,我们有以下命名空间层次结构:
MyCompany.Hardware
- ClassA
MyCompany.Hardware.DeviceType1
- ClassB : ClassA
MyCompany.Hardware.DeviceType2
- ClassC : ClassA
MyCompany.Hardware.Reader
- ReaderClassC : Reader
问题:
我应该将基类始终放在父命名空间中吗?或者在子命名空间和父级中的concret实现中?
ReaderClassC
是否应位于单独或同一名称空间MyCompany.Hardware.DeviceType2
中?或者我应该更喜欢“快速”访问的父命名空间?
忘记所有名称空间并将其全部放入一个(MyCompany.Hardware
)?
你可以随便了解我想要的东西。如果你能告诉我你的命名空间设计,那就太棒了。
答案 0 :(得分:3)
像往常一样,这是一个品味问题。
我更喜欢使用你的第四种方法,因为它有点清洁(对我来说)。我的意思是,如果我使用的是Reader,那么我依赖于使用该命名空间。
当然,您可以查看Namespace Naming Guidelines,特别是:
嵌套命名空间应该依赖于包含中的类型 命名空间。例如,System.Web.UI.Design中的类依赖于 在System.Web.UI中的类。但是,System.Web.UI中的类 不依赖于System.Web.UI.Design中的类。
答案 1 :(得分:1)
这只是我的临时建议,假设你是面向对象编程的新手。我认为你的问题触及了一个受到辩论和编程风格选择的设计领域。
那就是说,
命名空间的主要目标之一是对类型进行分组,以便其他“客户”或引用其包含类库的程序可以轻松地重用它们。
考虑到这一点,为了简单起见,您可以从一个名称空间开始,并在添加值时引入名称空间。
他们可能不在您的示例中添加值的一个地方是DeviceType1和DeviceType2。根据我的经验,这些属于同一名称空间。
namespace Acme.Hardware {
class Product
{
public int Price { get; set; }
public bool InStock { get; set; }
}
class Hammer : Product
{
}
class ScrewDriver : Product
{
}
}
作为编码样式和名称空间如何相交的示例,请注意我使用非常通用名称Product
而不是HardwareProduct
的方式。我在这里使用了通用名称,因为我知道包含using Acme.Hardware
或完全限定Acme.Hardware.Product
的名称将被使用。在任何一种情况下,附近都有上下文信息。
一般来说,我首先关注类(即它们的功能和实现)和名称空间,然后将它们视为分组类的有用方法。
答案 2 :(得分:0)
这取决于其他定义 - 当你有很多类型时,命名空间很有用,所以如果你的话,ClassB
伴随着许多与Hardware1
相关的东西,那么完美意义上有内部命名空间。
理想情况下,您应该遵循逻辑分组。您询问ReaderC
,如果它与DeviceType2
有关而不与其他人有关,那么它不应该在父命名空间中,如果ClassA
是所有硬件类型的基础,那么它需要也在父命名空间中。