C++ 构造函数中的外部副作用
请看以下代码:C++ 构造函数中的外部副作用,c++,constructor,side-effects,C++,Constructor,Side Effects,请看以下代码: #include <framework_i_hate.h> int main() { XFile file("./my_file.xxxx", "create"); XObject object("my_object"); // modify the object object.Write(); } #包括 int main(){ XFile文件(“/my_file.xxxx”,“创建”); XObject对象(“我的对象”); //修改对象 obj
#include <framework_i_hate.h>
int main() {
XFile file("./my_file.xxxx", "create");
XObject object("my_object");
// modify the object
object.Write();
}
#包括
int main(){
XFile文件(“/my_file.xxxx”,“创建”);
XObject对象(“我的对象”);
//修改对象
object.Write();
}
尝试猜测对象
将保存在何处。。。是的,你猜对了。我觉得这太神奇了,我想写一些类似于object.Save(file)
的东西,但这不是必需的。显然,framework\u i\u hate.h
中有一个全局变量,它在文件
构造函数中被修改。你怎么看待构造器内部的这种副作用
如何隐藏这种行为
猜框架的人也有好处。非常混乱,很难理解帖子,最后的问题非常修辞。
全局变量是邪恶的,还有什么可以补充的呢?关于这一点,我们可以说什么还不够明显:这是一个相当严重的副作用,因为:
- 除非您非常了解该框架,否则产生的行为是意外的,根本不可预测的
- 在面向对象编程中,全局程序状态通常不是一个好主意。(事实上,全球状态可能永远都不是一个好主意,所以最好尽量避免。)
- 很可能这个框架也不是线程安全的。(想想当两个并发线程都创建一个
对象,然后其中一个线程写入一个XFile
…它将保存在哪里时会发生什么情况?)XObject
虽然这个线程被标记为C++,而不是.Net,但是我以前看到的这种“反模式”是在一个不太严重、更理智的形式,即DB事务范围。 < P>我更愿意看到XFile和XObjor之间的关系是明确的,我同意这个“魔术”太好隐藏。我还质疑为什么要给对象命名,除非API的其他部分的名称很重要
全局变量被轻视的原因有很多,这只是一个例子。@aaa:我认为回答这个问题的最好方法是这样做,是的。我应该给这个
[root framework]
加上标签吗?最后,这仍然是一个太多的咆哮,并没有真正的有用。