4

如果我有一组可能有多个实现的接口(即内存中、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...

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

4

2 回答 2

4

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

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

于 2012-05-21T21:26:39.633 回答
1

选项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 容器和当时的要求加载所需的实现。

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

于 2012-05-21T21:26:37.380 回答