【问题标题】:Should I include namespace hints in class names?我应该在类名中包含命名空间提示吗?
【发布时间】:2012-05-22 05:32:22
【问题描述】:

如果我有一组可能有多个实现的接口(即内存中、NHibernate、基于 xml 等),那么在类名本身中提供命名空间提示是否明智?例如:

MyDomain.Infrastructure.ISomeProvider
MyDomain.Infrastructure.ISomeOtherProvider
MyDomain.Infrastructure.IYetAnotherProvider

我可能有:

MyDomain.Infrastructure.Impl.MemoryBased.SomeProvider
MyDomain.Infrastructure.Impl.MemoryBased.SomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBased.YetAnotherProvider
MyDomain.Infrastructure.Impl.XmlFileBased.SomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernate.SomeProvider // etc...

对比

MyDomain.Infrastructure.Impl.MemoryBased.MemoryBasedSomeProvider
MyDomain.Infrastructure.Impl.MemoryBased.MemoryBasedSomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBased.MemoryBasedYetAnotherProvider
MyDomain.Infrastructure.Impl.XmlFileBased.XmlSomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernate.NHibernateSomeProvider // etc...

在第二种情况下,通过类名本身很清楚我在代码中的任何地方使用了哪个实现,但是按命名空间对它们进行分组然后将其包含在类名中似乎有点多余,不是吗?

第三个选项可能是:

MyDomain.Infrastructure.ISomeProvider
MyDomain.Infrastructure.Impl.MemoryBasedSomeProvider
MyDomain.Infrastructure.Impl.MemoryBasedSomeOtherProvider
MyDomain.Infrastructure.Impl.MemoryBasedYetAnotherProvider
MyDomain.Infrastructure.Impl.XmlSomeProvider // etc...
MyDomain.Infrastructure.Impl.NHibernateSomeProvider // etc...

我已经消除了多余的命名空间,但现在对类进行分组/组织的唯一方法是通过类名前缀。我想我可以将它们分成文件夹并手动调整任何新创建的文件中的命名空间。其中一种风格比其他风格有什么明显的优势吗?

【问题讨论】:

  • 投反对票,并投票结束 - 认真吗?这是一个很好的问题。
  • 赋予您的用户监管内容的能力的问题在于,您将不可避免地让用户选择滥用该特权,除了增强他们的优越感之外,根本没有任何真正的理由。
  • 没错,看起来你有 3x +1,所以趋势正朝着正确的方向发展!

标签: c# naming-conventions


【解决方案1】:

好问题。我会用另一个来回答,有人需要同时使用ISomeProvider 的多个实现的可能性有多大?如果是这样,仅仅通过命名空间来消除歧义将导致需要一些讨厌的完全限定的命名空间。

如果不是,我会使用命名空间来指示实现的性质,但始终使用相同的名称。无论哪种方式,您的 API 是由接口而不是具体实现定义的这一事实,这意味着无论您选择哪种选项,人们都可以非常轻松地互换实现。

【讨论】:

    【解决方案2】:

    选项#1

    MyDomain.Infrastructure.Impl.MemoryBased.SomeProvider
    MyDomain.Infrastructure.Impl.MemoryBased.SomeOtherProvider
    MyDomain.Infrastructure.Impl.MemoryBased.YetAnotherProvider
    MyDomain.Infrastructure.Impl.XmlFileBased.SomeProvider // etc...
    MyDomain.Infrastructure.Impl.NHibernate.SomeProvider // etc...
    

    将是我的首选。您可能会争辩说,您应该将它们放在每个实现的不同项目中(在内存中、ORM、XML 中),然后可以在运行时根据您的 IoC 容器和当时的要求加载所需的实现。

    弄乱命名空间并在类的名称中添加实现类型是矫枉过正的,并且会使您的命名空间看起来对外部/其他开发人员毫无意义。

    【讨论】:

    • 但是如果有一个抽象基类,它的名字是什么? MyDomain.Infrastructure.Base.Infrastructure?
    • 就像开发中的所有好东西一样,这将取决于它。可能是MyDomain.Infrastructure.BaseProvider
    猜你喜欢
    • 2012-04-03
    • 2022-01-25
    • 1970-01-01
    • 2010-12-20
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2010-11-21
    相关资源
    最近更新 更多