代码之家  ›  专栏  ›  技术社区  ›  Gaston

如果在不同的名称空间上具有相同的类名,我应该怎么做?

  •  0
  • Gaston  · 技术社区  · 15 年前

    我正在做一个项目,我来了 命名问题 .

    我想实现工厂模式,但我不知道要使用的最佳类动态(我正在从一个类切换到另一个类,这相当耗时:s)。

    我通常使用名称空间来分隔 是的,但是我的 问题 与此特定代码块一起使用:

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

    我的 问题 如果我使用这个结构,我可以混合网格类(无论是工厂类还是实际的网格类)。实际上,这是一个简化,我的问题涉及到更多的名称空间,两个名称空间中都使用了同名的类。

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

    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 回复  |  直到 15 年前
        1
  •  0
  •   John Saunders    15 年前

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

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

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

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

    因为工厂类的唯一目的很可能是生成网格类的实例,所以我建议您将其命名为MeshFactory。

    命名空间不相关。

        2
  •  1
  •   alphazero    15 年前

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

        3
  •  0
  •   tsilb    15 年前

    使用时必须完全符合条件。如果完全限定名太长,请使用别名。

    A.Mesh 网眼

        4
  •  0
  •   Colin Burnett    15 年前

    一般来说,在.NET Land(特别是C)中,如果完全没有办法(即第三方),我将重新映射类:

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

    除非这样,而且你显然不是在谈论C(问题应该用C++来标记),所以我也会在引用时使用完整的命名空间。虽然打字不方便,但只要犯一个错误就麻烦了。