不同名称空间中的相同类名

时间:2011-04-19 13:39:47

标签: c# .net naming-conventions

我有两个不同的命名空间,有很多具有相同名称的类。我相信一些代码会让人们更容易理解:

namespace Print.Pdl.PostScript.Operators
{
    public abstract class BaseOperator : IOperator
    {
         // ...
    }
}

namespace Print.Pdl.Pcl6.Operators
{
    public abstract class BaseOperator : IOperator
    {
         // ...
    }
}

基本实现是相同的,因为PostScript和PCL具有类似的结构。因此,两个名称空间最终都与几个类具有相同的名称。

我很想做以下事情......

namespace Print.Pdl.PostScript.Operators
{
    public abstract class BasePsOperator : IPsOperator
    {
         // ...
    }
}

namespace Print.Pdl.Pcl6.Operators
{
    public abstract class BasePclOperator : IPclOperator
    {
         // ...
    }
}

...但是,恕我直言,它有点失败的目的,因为识别中存在冗余。如果命名空间已经创建了逻辑障碍,为什么我应该加前/更改类名?

那么,你们的想法是什么?我应该保留相同的名称,因为它们位于不同的名称空间中,或者我应该使用前缀/更改类名称以便更容易识别源,并避免在有人想要同时使用这两个名称空间时发生冲突?

谢谢!

6 个答案:

答案 0 :(得分:16)

诺尔德,

我认为你不应该牺牲架构来支持可读性。我相信如果你保持相同的类名,它会更直观,如果你从PCL切换到PostScript,反之亦然。

如果必须在同一代码文件中使用这两个类,请为命名空间创建别名。读起来非常清楚:

using Pcl = Print.Pdl.Pcl6.Operators;
using PostScript = Print.Pdl.PostScript.Operators;
...
// use PCL
Pcl.BaseOperator.DoSomething();
// Use PostScript
PostScript.BaseOperator.DoSomething();

谢谢, 卢西亚诺巴格曼

答案 1 :(得分:10)

这是一个棘手的问题IMO。为了更好地回答这个问题,你需要知道人们一次可能同时使用这两个名称空间的频率,以及他们必须使用命名空间为所有内容添加前缀是多么恼火。

我个人倾向于倾向于“不同的名字”。我认为命名空间是一种限制代码中可见名称集的机制,并且防止名称在这个简化集中发生冲突的不太可能发生的事件。所以保持冲突“不太可能”很重要。因此,我个人不会故意设计冲突。

特别是因为在你的情况下差异很小:BaseOperator只比BasePsOperator短一点。

答案 2 :(得分:3)

如果两个提议的基类之间没有功能或接口差异,那么可能会创建另一个带有BaseOperator的通用命名空间 - 并且只需定义一次。

答案 3 :(得分:3)

我的意见是你应该使用反映专业化的命名方案。

我的意思是你不需要考虑它是前缀,后缀还是其他任何东西。只需写出可以清楚识别类别的名称。

老实说,我认为命名空间不会满足正确的类命名方案,因为命名空间是一个组织的东西,而类是你的程序的一部分。

所以,在一天结束时,我会选择第二个选项:命名空间和类的专门命名。

答案 4 :(得分:2)

不同的名称空间只是... 不同名称空格 所以你根本不用担心(通常)关于命名空间边界的重复名称

但是,你应该注意使用。例如您正在创建具有许多不同层(在不同名称空间中)的分层应用程序,您不希望复制可能跨层共享的类名。

如果您觉得在命名空间之间使用重复命名是明智的,那么您总是可以使用方便的using语句在消费类中重命名,例如

你有两个用户类:

Data.Entities.User;
App.Core.User;

想在同一个地方使用它们......

您可以使用简单的使用声明,例如

using HttpUser = App.Core.User; 

别名其中一个,因此避免完全限定,并避免任何混淆。

答案 5 :(得分:1)

如果您尝试避免重复使用类名,那么在您欣赏它之后,开发人员会对此进行维护。它只是让人很难一目了然地说出正在使用哪个类。