0

我很难找到一个好的命名空间设计和类顺序。假设我们有以下命名空间层次结构:

    MyCompany.Hardware
       - ClassA

    MyCompany.Hardware.DeviceType1
       - ClassB : ClassA

    MyCompany.Hardware.DeviceType2
       - ClassC : ClassA

    MyCompany.Hardware.Reader
       - ReaderClassC : Reader

问题:

  1. 我应该将基类始终放在父命名空间中吗?还是在子命名空间和父命名空间的具体实现中?

  2. 应该ReaderClassC在单独的命名空间中还是在同一个命名空间中MyCompany.Hardware.DeviceType2?还是我应该更喜欢父命名空间来“快速”访问?

  3. 忘记所有的命名空间并把所有的都放在一个(MyCompany.Hardware)?

希望你明白我试图摆脱什么。如果您能告诉我您的命名空间设计,那就太好了。

4

3 回答 3

3

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

我更喜欢使用你的第四种方法,因为它更干净(对我来说)。我的意思是,如果我使用的是 Reader,那么我依赖于使用该命名空间。

当然,您可以查看命名空间命名指南,尤其是:

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

于 2012-09-14T18:59:37.870 回答
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. 无论哪种情况,附近都有上下文信息。

一般来说,我会首先关注类(即它们的功能和实现),其次才是命名空间,认为它们只是对类进行分组的一种有用方式。

于 2012-09-14T19:11:36.673 回答
0

这取决于其他定义——当你有很多类型时,命名空间很有用,所以如果你的,比方说,ClassB伴随着很多与之相关的东西,Hardware1那么为此使用内部命名空间是非常有意义的。

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

于 2012-09-14T19:02:05.613 回答