命名空间设计和类分离

时间:2012-09-14 18:57:24

标签: c# .net namespaces

我有找到一个好的命名空间设计和类顺序的问题。 想象一下,我们有以下命名空间层次结构:

    MyCompany.Hardware
       - ClassA

    MyCompany.Hardware.DeviceType1
       - ClassB : ClassA

    MyCompany.Hardware.DeviceType2
       - ClassC : ClassA

    MyCompany.Hardware.Reader
       - ReaderClassC : Reader

问题:

  1. 我应该将基类始终放在父命名空间中吗?或者在子命名空间和父级中的concret实现中?

  2. ReaderClassC是否应位于单独或同一名称空间MyCompany.Hardware.DeviceType2中?或者我应该更喜欢“快速”访问的父命名空间?

  3. 忘记所有名称空间并将其全部放入一个(MyCompany.Hardware)?

  4. 你可以随便了解我想要的东西。如果你能告诉我你的命名空间设计,那就太棒了。

3 个答案:

答案 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是所有硬件类型的基础,那么它需要也在父命名空间中。