Home Articles

命名空间设计和类分离

Asked
Viewed 1817 times
0

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

MyCompany.Hardware
       - ClassA

    MyCompany.Hardware.DeviceType1
       - ClassB : ClassA

    MyCompany.Hardware.DeviceType2
       - ClassC : ClassA

    MyCompany.Hardware.Reader
       - ReaderClassC : Reader

问题:

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

  • ReaderClassC 应该在单独的名称空间中还是在同一个名称空间中 MyCompany.Hardware.DeviceType2 ?或者我应该更喜欢'fast'访问的父命名空间?

  • 忘记所有命名空间并将所有命名空间放入一个( MyCompany.Hardware )?

你可以随便了解我试图摆脱的东西 . 如果你能告诉我你的命名空间设计会很棒 .

3 Answers

  • 3

    这取决于其他定义 - 当你说 ClassB 伴随着许多与 Hardware1 相关的东西时,命名空间是有用的,那么为此拥有内部命名空间是完全合理的 .

    理想情况下,您应该遵循逻辑分组 . 您询问 ReaderC ,如果它与 DeviceType2 有关而不与其他人有关,那么它不应该在父命名空间中,如果 ClassA 是所有硬件类型的基础,那么它也需要在父命名空间中 .

  • 1

    像往常一样,这是一个品味问题 .

    我更喜欢使用你的第四种方法,因为它有点清洁(对我而言) . 我的意思是,如果我使用的是Reader,那么我依赖于使用该命名空间 .

    当然你可以看看Namespace Naming Guidelines,特别是:

    嵌套命名空间应该依赖于包含命名空间中的类型 . 例如,System.Web.UI.Design中的类取决于System.Web.UI中的类 . 但是,System.Web.UI中的类不依赖于System.Web.UI.Design中的类 .

  • 0

    这只是我的临时建议,假设您的面向对象编程相对较新 . 我认为你的问题触及了一个受到辩论和编程风格选择的设计领域 .

    那说,

    命名空间的主要目标之一是对类型进行分组,以便其他“客户端”或引用其包含类库的程序可以轻松地重用它们 .

    考虑到这一点,为简单起见,您可以从一个命名空间开始,并在添加值时引入命名空间 .

    他们可能无法在您的示例中添加值的一个地方是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 使用 . 在任何一种情况下,附近都有上下文信息 .

    一般来说,我首先关注类(即它们的功能和实现)和名称空间,然后将它们视为组合类的有用方法 .

Related