【问题标题】:Nested namespace for cleaner code [closed]用于更简洁代码的嵌套命名空间 [关闭]
【发布时间】:2018-04-21 22:53:59
【问题描述】:

我目前正在编写一个适配器来在两个框架 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”的命名空间也可能不是超级唯一的。

你怎么看?

【问题讨论】:

  • 这取决于你的需要,在 C++ 中使逻辑复杂性没有缺点。
  • 如果我真的不喜欢一件事,那就是深度嵌套的命名空间被用作架构设备。
  • “因为我认为它们变得很长且难以阅读。”cvtToAtypecvt::to_a::type 短。 Camel case vs "namespace" case -> 相同的可读性(如果使用命名空间,它可能会简化阅读,但当前名称似乎很差)...
  • @Jarod42: 好吧,我有点滥用了下划线可读性的好处,用于我的 camelCase。但现在不能把所有的东西都转移到下划线。尤其是当我在代码的所有其他部分中对它很满意时。只有这些转换器会产生如此烦人的名字:D
  • @Neil:嗯,你对:TypeA cvt_to_A::type(TypeB) {} 说什么? :D

标签: c++ namespaces coding-style naming


【解决方案1】:

所以,你从以下开始:

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

您陈述的问题:函数名称​​“变得很长且不可读”。你提议:

mylib::cvt::to_a::type

首先,“cvt”不会被代码的读者/维护者轻松识别为“convert”。尾随的::type 对我来说似乎毫无意义。任何称为“to_”的东西都可以预期是一种转换,所以我看不到::cvt:: 级别的意义。

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

构造函数

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

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

投射/转换模板

如果您想将函数与 TypeA/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&lt;TypeB&gt;(a)。这比cvtToAtype 强大得多,因为如果目标类型是抽象的——模板中的参数、usingtypedef 的别名——你仍然可以转换。

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

另一种选择是使用转换为类型的函数参数,因此调用者不必将其作为转换函数名称或模板参数的一部分输入:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2020-08-07
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多