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

Ric*_*lde 10 .net c# naming-conventions

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

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

namespace Print.Pdl.Pcl6.Operators
{
    public abstract class BaseOperator : IOperator
    {
         // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

namespace Print.Pdl.Pcl6.Operators
{
    public abstract class BasePclOperator : IPclOperator
    {
         // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Luc*_*ann 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();
Run Code Online (Sandbox Code Playgroud)

谢谢Luciano Bargmann


Rom*_*kov 10

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

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

特别是因为在你的情况下,差异是如此之小:BaseOperator只比一点点短BasePsOperator.


Mem*_*per 6

不同的命名空间就是这样...不同的名称空格, 所以你根本不应该(通常)担心跨命名空间边界的重复名称

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

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

你有两个用户类:

Data.Entities.User;
App.Core.User;
Run Code Online (Sandbox Code Playgroud)

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

您可以使用简单的 using 语句,例如

using HttpUser = App.Core.User; 
Run Code Online (Sandbox Code Playgroud)

为其中之一取别名,从而避免完全限定,并避免任何混淆。


Tim*_*ass 3

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

  • 这是一个很好的建议,但这里的情况并非如此 - 这些类在语义上相似,因为 PostScript 和 PCL6 具有相似的结构,但它们的行为差异足以使单个类不实用。 (2认同)