如果我在不同的命名空间中具有相同的类名,我该怎么办?

时间:2009-05-03 01:54:57

标签: naming-conventions namespaces

我正在开展一个项目,我遇到了以下命名问题

我想实现工厂模式,但我不知道要使用的最佳类命令(我正在从一个变为另一个并且它非常耗时:S)。

我通常会使用命名空间来分隔类的,但我的问题是使用这段特定的代码:

class Mesh
{
    ...
};
namespace Factory
{
    class Mesh
    {
        ...
    };
}
...
Factory::Mesh meshFactory;
Mesh *mesh = meshFactory.create(...);

我的问题是,如果我使用这个结构,我可以混淆Mesh类(无论是工厂类还是实际的Mesh类)。实际上,这是一个简化,我的问题涉及更多的命名空间,并且在两个命名空间中都使用了具有相同名称的类。

我在考虑使用后缀来分隔类并将它们放在同一个名称空间中,例如:

class Mesh
{
     ...
};
class MeshFactory
{
     ...
};
MeshFactory meshFactory;
Mesh *mesh = meshFactory.create(...);

所以每个班级都没有混淆。

我不喜欢使用不同命名空间和发明不同名称的简单解决方案,因为我最终会使用命名空间名称来区分它们:

class Mesh
{
    ...
};
namespace Factory
{
    class MeshFactory // I can't figure a better different name
    {
        ...
    };
}

我更喜欢第二种选择。

有没有一个坚实的理由为什么第一个选择更好?或者还有另一种方式吗?最佳实践对此有何看法?

4 个答案:

答案 0 :(得分:1)

请记住OO设计中的“最佳实践”的黄金法则:命名您的类很容易就是设计解决方案的50%。如果您在命名实体时遇到问题,则表明您脑海中没有明确的概念模型。

答案 1 :(得分:0)

导致您将Mesh类命名为“Mesh”的原因是什么?

生成Mesh实例的工厂类是否共享所有相同的原因?

如果是,那么它们应该是同一个类,具有相同的名称。

如果没有,那么它们应该是不同的类,名称不同。

因为它们可能只是工厂类的目的是生成Mesh类的实例,所以我建议你将它命名为MeshFactory。

名称空间不相关。

答案 2 :(得分:0)

您必须完全符合使用资格。如果您的完全限定名称太长,请使用别名。

a.Mesh b.Mesh

答案 3 :(得分:0)

一般而言,在.NET版本(特别是C#)中,如果完全没有办法(即第三方),我会重新编写该类:

using MyMesh = My.Mesh;
using FooMesh = Foo.Mesh;

除此之外,你显然不是在说C#(问题应该用c ++标记)我会在引用时使用完整的命名空间。虽然不方便打字,但只需要一个错误就是麻烦。