代码之家  ›  专栏  ›  技术社区  ›  Alex Pander

cleaner代码的嵌套命名空间[已关闭]

  •  0
  • Alex Pander  · 技术社区  · 7 年前

    我目前正在编写一个适配器,用于在两个框架之间转换类型A<-&燃气轮机;B、 我觉得这些名字有点麻烦,因为在我看来,它们越来越长,越来越难读了。然后我决定以一种非常嵌套的方式使用名称空间,我在其他地方很少见到这种情况。

    旧版本:

    TypeA mylib::cvtToAtype(TypeB) {}
    TypeB mylib::cvtToBtype(TypeA) {}
    

    新建:

    TypeA mylib::cvt::to_a::type(TypeB) {}
    TypeB mylib::cvt::to_b::type(TypeA) {}
    

    你认为这是一种好的风格,还是你看到了严重的缺点?我认为它看起来很干净,但是如果有人决定“使用名称空间”,它可能会被误用。那么type实际上并不是一个唯一的名称来标识函数正在做什么。此外,名为“cvt”的命名空间也可能不是超级唯一的。

    你觉得怎么样?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tony Delroy    7 年前

    因此,您从以下内容开始:

    TypeA mylib::cvtToAtype(TypeB) {}
    TypeB mylib::cvtToBtype(TypeA) {}
    

    您声明的问题:函数名 “变得很长而且不可读” .您提议:

    mylib::cvt::to_a::type
    

    首先,“cvt”不会被代码的读者/维护者轻松地识别为“转换”。尾部 ::type 对我来说似乎毫无意义。任何被称为“to\”的东西都可能是一种转换,所以我看不出 ::cvt:: 数量

    不管它值多少钱,一些替代品。。。

    施工人员

    您可以考虑创建构造函数 [explicit] TypeA::TypeA(TypeB) [explicit] TypeB::TypeB(TypeA) 因此,客户端的用法很简单:

    TypeA a{b};
    functionThatWantsB(TypeB{a});
    

    演员/转换模板

    如果您想将函数与类型a/B类分开,那么一个具有专门功能的“cast”样式模板是一个不错的选择:

    template <typename TypeTo, typename TypeFrom>
    TypeTo convert(const TypeFrom&);
    
    template <>
    TypeB convert<TypeB, TypeA>(const TypeA& a) { return TypeB{...}; }
    
    template <>
    TypeA convert<TypeA, TypeB>(const TypeB& a) { return TypeA{...}; }
    

    客户机使用是大家熟悉的铸造符号:例如。 convert<TypeB>(a) .这比 cvtToAtype 因为如果目标类型是抽象类型(模板中的参数),则 using typedef -你仍然可以施放。

    知道目标类型,因为它是函数参数

    另一个选项是使用convert to类型的函数参数,这样调用者就不必将其作为转换函数名或模板参数的一部分键入:

    TypeA& loadFrom(TypeA&, const TypeB&) { ... }
    TypeB& loadFrom(TypeB&, const TypeA&) { ... }
    

    使用重载的编译时多态性意味着不需要每次所涉及的变量在支持的类型之间更改时都更新转换代码。