使用带参数的构造函数来初始化类的成员或者间接使用setter函数更好吗?到目前为止,我还没有得到关于这个问题的明确答案。任何见解将不胜感激。
3 回答
这几乎可以肯定是设计选择或有时风格的问题。我会考虑很多事情:
在不设置成员变量的情况下构造对象会使类处于无效状态吗?如果是这样,您将需要您的构造函数为这些成员获取有效值。否则,您应该能够提供有用的默认值。
设置变量的单个成员会违反类不变量吗?如果是这样,他们不应该有自己的二传手。
这个类的用户是否可能想要修改个别成员?如果是这样,那么二传手可能是合适的。
能够更改对象的各个成员是否具有概念意义?我认为能够更改 a
Person
的出生日期是没有意义的。但是,您可能会争辩说更改 aPerson
的名称确实有意义。这取决于。您是否认为在您的系统中Person
名称已更改的名称有所不同Person
?您可以将 setter 组合在一起以更有用吗?而不是
Rectangle::setX(int)
andRectangle::setY(int)
,是否Rectangle::setPosition(int,int)
更有意义?也许甚至Rectangle::setPosition(Point)
更好。
在任何情况下,一个类的全部成员都通过单独的 setter 和 getter 暴露出来,这通常是一种代码异味。
这取决于。当然,在没有有效类成员的情况下对象没有意义的情况下使用构造函数参数 - 例如,作用域智能指针或 ofstream 的文件名。
explicit ofstream ( const char * filename, ios_base::openmode mode = ios_base::out );
谨慎使用附加参数,并尽可能提供默认值。
但是,不要添加太多的构造函数参数,以免顺序变得无法记住,或者如果有可能造成危险的混淆,例如这样。
Person(std::string firstname, std::string lastname, std::string title, std::string occupation,
std::string address, std::string telephone, int age, std::string creditcard, time_t birthday)
您要避免的一件事是拥有一个不完整的对象。如果您可以为每个参数提供合理的默认值,那么可以跳过在构造函数中设置它们,否则您真的应该将它们放在那里。
当然,你没有理由不能两者兼得。