外部副作用
问题描述:
看看这段代码:外部副作用
#include <framework_i_hate.h>
int main() {
XFile file("./my_file.xxxx", "create");
XObject object("my_object");
// modify the object
object.Write();
}
试着猜测那里object
将被保存......是的,你猜对了。我觉得这太神奇了,我想写一些像object.Save(file)
,但没有必要。显然在framework_i_hate.h
内部有一个全局变量,它在file
构造函数中被修改。你对构造函数中的这种副作用有什么看法?
这种行为如何隐藏?
谁猜测框架的奖金。
答
非常混乱难以理解的帖子和问题到底是非常修辞。全局变量是邪恶的,还有什么要补充的?
答
什么,可这是不是已经足够明显的说:这是一个相当讨厌的副作用,这是因为:
所产生的行为是不希望的,可预测的,在所有的,除非你知道框架好。
全局程序状态在面向对象编程中通常不是一个好主意。 (事实上,全局状态可能永远不是一个好主意,所以如果可以的话,最好避免它。)
这个框架也可能不是线程安全的。 (想想当两个并发线程都创建每次
XFile
对象发生了什么,以及这些线程之一然后写入一个XObject
......这哪里会最终被保存?)
虽然此线程标记C++而不是关于.NET,我之前看到过这种“反模式”,并不是那么严重,而是更加理智的形式,即数据库事务处理范围。
答
我宁愿看到XFile和XObject之间的关系是明确的,我同意这个“魔术”太隐藏了。我也质疑为什么给这个对象一个名字,除非这个名字是重要的那个API的其他部分。
由于很多原因,全局变量被鄙视,这只是一个例子。
它吮吸,写一个包装? – Anycorn 2010-09-07 20:20:13
@aaa:我认为回答这个问题的最好方法就是这样做,是的。 – Potatoswatter 2010-09-07 23:51:55
我应该标记这个'[root-framework]'吗?最后,这仍然是一个咆哮,并不是很有用。 – 2014-05-10 23:11:19