这是一个非常简单的问题。假设我有一个班级
class A
{
public:
A(int);
void setA(int);
private:
int a;
};
实施
A::A(int a_) : a(a_) { }
void A::setA(int a_) { a = a_; }
假设我想避免使用a = 0
但我不想抛出异常,我只想在a = 1
保留一个有效的对象而不是那种情况(这没关系为什么现在)。
然后我可以在构造函数和setA
中添加if语句来检查参数是否为0,并在这种情况下将其设置为1。从概念上讲,这告诉我在这种情况下我应该更改构造函数,而不是在那里初始化a
,我应该在构造函数中调用setA
。通过这种方式,检查的代码只写一次(请记住,这是一个简单的情况,但在其他情况下验证可能会更复杂)。
现在,该方法涉及在构造函数中进行额外的函数调用。编写验证码两次效率更高吗?如果setA
只是偶尔使用的话怎么办?
答案 0 :(得分:1)
在构造函数中使用验证调用setter肯定会更好,因为代码重复是邪恶的。你也可以让它内联以确保你不浪费CPU周期,但我认为这是一个不成熟的优化。
答案 1 :(得分:1)
我同意你的热情以防止代码重复。只要小心过火,单线可能会过火。
如果你要进行检查,你应该使用实现文件函数或private
,static
方法来执行此操作:
int preventZero(const int a_) { return a_ == 0 ? 1 : a_; }
然后您可以在实现中使用它,如下所示:
A::A(int a_) : a(preventZero(a_)) { }
void A::setA(int a_) { a = preventZero(a_); }