对用户界面函数使用枚举类型是个好主意吗?
Is using enum types for user interface functions a good idea?
假设我正在构建一个简单的类,该类可以在屏幕上打印一些文本,并且它有可能更改文本的颜色。
myclass a("this is the text");
a.setColor("green");
我还在学习C++,最近我被介绍给enum
,我想我会试一试。我想知道在界面函数中使用enum
类型是否是一种好习惯,如上述setColor
?
在接口函数中使用enum
类的优点或缺点是什么?是否存在它们更适用的情况,是否存在它们不好使用的情况?
如果我想合并属性怎么办?
例如a.setAttribute("bold reverse");
我不知道接口是否是我想描述的正确术语:我的类用户最终将使用的功能。
在您的情况下,(至少)有两个优点:
- 无需在运行时解析字符串,从而提高效率。 可以直接在
switch
语句中使用枚举变量。 - 枚举(在某种程度上)是自我记录的,代码的用户必须努力提供无效值。
一个潜在的"缺点"是颜色字符串来自例如运行时用户输入(他们输入文本框或其他内容)。 您需要解析此字符串并将其转换为枚举。 但这并不是一个真正的缺点,因为无论如何你都需要这样做。 最佳做法是让用户界面逻辑验证字符串并尽早转换为枚举。
如果我想合并属性怎么办?
我至少可以想到三个选项:
- 使用多个调用来
setAttribute
。 - 传递属性数组。
- 将每个枚举值定义为 2 的幂,然后您可以将枚举与
|
组合在一起。
是的,在这种情况下使用 enum
似乎比实际字符串更好。
一个明显的优势 - 强打字。
如果setColor
接受char*
,就像你的情况一样,你可以做:
a.setColor("horse");
您只能在运行时将其检测为错误。
如果setColor
将eColors
作为参数:
a.setColor(eGreen);
a.setColor(eRed);
会编译,但是
a.setColor(eHorse);
不会。
在这种情况下
,枚举肯定比字符串更明确。至于值的串联,你可以使用一些小摆弄来做到这一点。将枚举的值设置为增加 2 的幂,然后您可以将它们放在一起或。
enum TextAttributes {
Bold = 1,
Italic = 2,
Reverse = 4,
StrikeThrough = 8,
Underline = 16
};
TextAttributes attr = Bold | Reverse;
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 使用嵌套函数数组是个好主意吗?
- 将std::regex设置为静态的好主意吗
- 使用共享库进行变体处理是个好主意吗?
- 使用列表<Byte>不是好主意吗?
- 用C++编写多级内联函数是个好主意吗?
- 重载参数 C++ 是个好主意吗?
- 扩展 std::vector 是个好主意吗?
- 将 int32_t 键入为 int 是个好主意吗?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 用 constexpr 中的工会取代reinterpret_cast - 好主意?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- 在哪里使用"std::valarray"是个好主意?
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 在构造函数中循环C++是一个好主意吗?
- 重载指向集合的指针的开始/结束是否是个好主意
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 在构造函数中为另一个相同类型的对象构造对象是个好主意吗
- 对用户界面函数使用枚举类型是个好主意吗?