我目前负责查找代码库中的所有不良做法,并说服我的同事修复有问题的代码。在我的探索过程中,我注意到这里很多人都使用以下模式:
class Foo
{
public:
Foo() { /* Do nothing here */ }
bool initialize() { /* Do all the initialization stuff and return true on success. */ }
~Foo() { /* Do all the cleanup */ }
};
现在我可能错了,但对我来说initialize()
方法的事情太糟糕了。我相信它取消了构造函数的全部目的。
当我问我的同事为什么做出这个设计决定时,他们总是回答说他们别无选择,因为你不能在不抛出的情况下退出构造函数(我猜他们认为抛出是always bad).
到目前为止我未能说服他们,我承认我可能缺乏有价值的论据......所以这是我的问题:我是否正确地认为这种结构很痛苦?如果是这样,您认为其中存在哪些问题?
谢谢。
单步(构造函数)初始化和两步(使用 init 方法)初始化都是有用的模式。就我个人而言,我认为排除其中任何一个都是错误的,尽管如果您的约定完全禁止使用异常,那么您就禁止了可能失败的构造函数的单步初始化。
一般来说,我更喜欢单步初始化,因为这意味着您的对象可以具有
更强的不变量。当我认为对象能够以“未初始化”状态存在有意义或有用时,我仅使用两步初始化。
通过两步初始化,对象处于未初始化状态是有效的 - 因此与对象一起使用的每个方法都需要了解并正确处理
事实上它可能处于未初始化状态。这类似于使用指针,假设指针不为 NULL 是很糟糕的形式。相反,如果您在构造函数中完成所有初始化并因异常而失败,那么您可以将“对象始终初始化”添加到不变量列表中,这样就变得更容易、更安全
对物体的状态做出假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)