【问题标题】:What is an elegant solution to the namespace vs classname clash problem? [duplicate]命名空间与类名冲突问题的优雅解决方案是什么? [复制]
【发布时间】:2011-07-29 00:52:52
【问题描述】:

.NET 让我非常恼火的一件事是命名空间应该是 Pascal 大小写的,这会导致命名空间/类名冲突的可能性。

考虑以下几点:

namespace MyCompany.MyProduct.SalesOrder {
    public class SalesOrder {
    }
}

这是完全有效的代码,但是 SalesOrder 作为一个类的使用者现在必须使用 MyCompany.MyProduct.SalesOrder.SalesOrder 的完全限定名称,否则编译会导致烦人的 'MyCompany.MyProduct.SalesOrder' is a 'namespace' but is used like a 'type' 错误。

其他人正在做什么来解决这个问题?有些地方我看到其他人只是违反规则并使用小写包,这确实吸引了我,但我确实喜欢符合标准并使用适当的大小写。到目前为止,在我的使用中,我尽可能地接受了基于复数的命名空间名称的概念,但是这有时看起来很丑。

我个人认为 .NET 搞错了,应该像 Java 的包一样使用小写的命名空间。

【问题讨论】:

  • 不要将类命名为与命名空间相同。这很少是必需品。
  • Talljoe,我并不是在争论我的类名与命名空间名称相同,问题是有时会发生冲突。例如,如果我有一个具有命名空间MyProduct.Drawing 的绘图产品,因为我希望它对System.Drawing 命名空间进行建模,但是我想要在MyProduct.Drawing 中创建一个名为Drawing 的类。另一个问题是说我有一个使用System.Drawing 的产品,并且我有一个名为Design 的类,它与System.Drawing.Design 名称空间发生冲突。再次强调我认为命名空间应该全部小写。
  • 您可以使用命名空间别名 [msdn.microsoft.com/en-us/library/sf0df423.aspx] 通过明确说明您想要的内容来解决此问题:使用 Design = MyProduct.Drawing.Design;
  • 好点 Talljoe,我实际上忘记了命名空间别名,仅供参考:msdn.microsoft.com/en-us/library/c3ay4x3d.aspx
  • 好吧,对于Drawing 的例子,你不应该有一个名为Drawing 的类。 Drawing 名称表明它包含围绕绘图活动的多项职责。这清楚地表明Drawing 类将违反单一职责原则。考虑到这一点,Drawing 是命名空间的完美示例,而不是类。

标签: c# .net standards standards-compliance


【解决方案1】:

SalesOrder 作为命名空间的目的是什么?命名空间应该是一个“空间”,因此它应该涵盖多个类。遵循这条规则,你不应该在类和命名空间之间发生冲突。

【讨论】:

  • 名称空间应该分隔您的逻辑项目,SalesOrder 是一个模块,适合此名称空间的此类类将是 ISalesOrderServiceSalesOrderSalesOrderLineHibernateSalesOrderService。注意SalesOrder 的类,我正在尝试为发生冲突的名称空间名称建立一个通用规则。
【解决方案2】:

完全同意你的看法,这种行为绝对令人讨厌。我通常只是倾向于给命名空间一个更通用的名称。在你的情况下,我会选择类似MyCompany.MyProduct.SalesOrderManagement 或只是MyCompany.MyProduct.SalesOrders

【讨论】:

  • 感谢 Florian,我认为复数形式更简洁,我讨厌具有如此长名称的类/命名空间,整个 .NET 类库都充满了不必要的长类名称。感谢您的帖子。
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多