我应该在类名中包含命名空间提示吗?



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

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

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

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

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

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

最新更新