假设同一个类A的以下两个版本:
版本1
class A
{
public:
enum class Retrievable { Integer, String };
A(): m_integer(123), m_string("string") {}
~A() {}
void* get(const Retrievable r)
{
switch (r)
{
case Retrievable::Integer:
return static_cast<void*>(&m_integer);
case Retrievable::String:
return static_cast<void*>(&m_string);
default:
throw;
}
}
private:
int m_integer;
std::string m_string;
};
第2版
class A
{
public:
A(): m_integer(123), m_string("string") {}
~A() {}
int getInteger() { return m_integer; }
std::string getString() { return m_string; }
private:
int m_integer;
std::string m_string;
};
在清晰度,效率和可扩展性方面,这两种范例中的哪一种 - 单个无类型get()函数或单独的显式get()函数 - 更好?
答案 0 :(得分:3)
选项1将内容转换为void*
并进行运行时调度,这样做更慢,更安全,更难使用。
除非与脚本引擎进行交互,否则我无法想象使用选项1的理由。即使这样,也有很多更好的方法来处理它。一个受访者提出选项1甚至是选项2的另一种选择,这将是一个强大的不聘用,这将使我重新考虑到目前为止受访者的漏斗。
简而言之,选项2更好。
答案 1 :(得分:1)
版本A无论如何都不会编译,因为无论C
如何,您都会尝试返回不是C
的类型(C
为string
的指针等)。< / p>
版本B可能更好,但也放弃了弯曲。除非你正在构建一些像JSON节点那样的多态类型,否则该函数应该描述行为,而不是返回类型。
再说一次,除非你正在编写一些JSON类,否则我没有太多意义来创建一个描述返回类型而不是行为的函数。 Person
没有getHand
或getLeg
个函数,他有wave
,walk
等函数。
服务表现?我怀疑一个吸气剂会破坏你的应用程序的性能。