Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 名称空间设计和类分离_C#_.net_Namespaces - Fatal编程技术网

C# 名称空间设计和类分离

C# 名称空间设计和类分离,c#,.net,namespaces,C#,.net,Namespaces,我很难找到一个好的名称空间设计和类顺序。 假设我们有以下命名空间层次结构: MyCompany.Hardware - ClassA MyCompany.Hardware.DeviceType1 - ClassB : ClassA MyCompany.Hardware.DeviceType2 - ClassC : ClassA MyCompany.Hardware.Reader - ReaderClass

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

    MyCompany.Hardware
       - ClassA

    MyCompany.Hardware.DeviceType1
       - ClassB : ClassA

    MyCompany.Hardware.DeviceType2
       - ClassC : ClassA

    MyCompany.Hardware.Reader
       - ReaderClassC : Reader
问题:

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

  • ReaderClassC
    应该位于单独的命名空间中还是位于同一命名空间中
    MyCompany.Hardware.DeviceType2
    ?或者我应该选择父命名空间进行“快速”访问

  • 忘记所有名称空间,将所有名称空间放在一个(
    MyCompany.Hardware


  • 希望你明白我想说什么。如果您能告诉我您的名称空间设计,那就太好了。

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

    我更喜欢使用你的第四种方法,因为它(对我来说)更干净一些。我的意思是,如果我使用的是阅读器,那么我就依赖于使用这个名称空间

    当然,您可以查看以下内容,尤其是:

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


    和往常一样,这是品味的问题

    我更喜欢使用你的第四种方法,因为它(对我来说)更干净一些。我的意思是,如果我使用的是阅读器,那么我就依赖于使用这个名称空间

    当然,您可以查看以下内容,尤其是:

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


    这取决于其他的定义——当你有很多类型时,名称空间是很有用的,所以如果你的
    ClassB
    附带了很多与
    Hardware1
    相关的东西,那么为它设置内部名称空间是非常有意义的


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

    这取决于其他定义-当您有很多类型时,名称空间是有用的,因此如果您的
    ClassB
    附带了很多与
    Hardware1
    相关的内容,那么为其设置内部名称空间是非常有意义的


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

    假设您对面向对象编程相对较新,那么这只是我的特别建议。我认为你的问题涉及到设计的一个领域,这个领域需要讨论和编程风格的选择

    也就是说

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

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

    在您的示例中,它们可能无法增加价值的一个地方是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
    。我在这里使用了一个通用名称,因为我知道该名称将由使用Acme.Hardware的
    或完全限定的
    Acme.Hardware.Product
    包含使用。在这两种情况下,附近都有上下文信息


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

    假设您对面向对象编程比较陌生,这只是我的特别建议。我认为你的问题涉及到设计的一个领域,这个领域需要讨论和编程风格的选择

    也就是说

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

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

    在您的示例中,它们可能无法增加价值的一个地方是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
    。我在这里使用了一个通用名称,因为我知道该名称将由使用Acme.Hardware
    或完全限定的
    Acme.Hardware.Product
    包含使用。在这两种情况下,附近都有上下文信息

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