首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于清洁代码的嵌套命名空间

用于清洁代码的嵌套命名空间
EN

Stack Overflow用户
提问于 2018-04-21 22:53:59
回答 1查看 110关注 0票数 0

我目前正在编写一个适配器,用于在两个框架A <-> B之间转换类型。我对这些名称有点麻烦,因为它们的长度越来越长,而且在我看来无法读懂。然后,我决定以一种非常嵌套的方式使用名称空间,我在其他地方很少见过。

旧:

代码语言:javascript
复制
TypeA mylib::cvtToAtype(TypeB) {}
TypeB mylib::cvtToBtype(TypeA) {}

新的:

代码语言:javascript
复制
TypeA mylib::cvt::to_a::type(TypeB) {}
TypeB mylib::cvt::to_b::type(TypeA) {}

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

你认为如何?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-22 00:48:00

所以,你一开始是:

代码语言:javascript
复制
TypeA mylib::cvtToAtype(TypeB) {}
TypeB mylib::cvtToBtype(TypeA) {}

您所指出的问题:函数名“变得相当长且不可读”。你建议:

代码语言:javascript
复制
mylib::cvt::to_a::type

首先,"cvt“不会被您的代码的读者/维护人员视为”转换“。在我看来,落后的::type似乎毫无意义。任何被称为"to_“的东西都可以被认为是一种转换,所以我看不出::cvt::级别有什么意义。

不管它有什么价值,有些选择.

建设者

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

代码语言:javascript
复制
TypeA a{b};
functionThatWantsB(TypeB{a});

铸造/转换模板

如果您希望将函数与TypeA/B类分开,那么具有专门化的“强制转换”样式模板是一个不错的选择:

代码语言:javascript
复制
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强大得多,因为如果目标类型是抽象的--模板中的参数,来自usingtypedef的别名--您仍然可以进行强制转换。

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

另一个选项是具有一个转换到类型的函数参数,因此调用方不必将其作为转换函数名称的一部分或模板参数键入出来:

代码语言:javascript
复制
TypeA& loadFrom(TypeA&, const TypeB&) { ... }
TypeB& loadFrom(TypeB&, const TypeA&) { ... }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49960883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档