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

时间:2012-05-21 21:23:32

标签: c# naming-conventions

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

VS

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...

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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容器和要求,可以在运行时加载所需的实现。

要搞乱命名空间并在类名中添加实现类型是过度的,并且会使你的命名空间对外部/其他开发人员来说毫无意义。