2010-09-07 91 views
-2

看看这段代码:外部副作用

#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构造函数中被修改。你对构造函数中的这种副作用有什么看法?

这种行为如何隐藏?

谁猜测框架的奖金。

+0

它吮吸,写一个包装? – Anycorn 2010-09-07 20:20:13

+0

@aaa:我认为回答这个问题的最好方法就是这样做,是的。 – Potatoswatter 2010-09-07 23:51:55

+0

我应该标记这个'[root-framework]'吗?最后,这仍然是一个咆哮,并不是很有用。 – 2014-05-10 23:11:19

回答

3

非常混乱难以理解的帖子和问题到底是非常修辞。全局变量是邪恶的,还有什么要补充的?

2

什么,可这是不是已经足够明显的说:这是一个相当讨厌的副作用,这是因为:

  • 所产生的行为是不希望的,可预测的,在所有的,除非你知道框架好。

  • 全局程序状态在面向对象编程中通常不是一个好主意。 (事实上​​,全局状态可能永远不是一个好主意,所以如果可以的话,最好避免它。)

  • 这个框架也可能不是线程安全的。 (想想当两个并发线程都创建每次XFile对象发生了什么,以及这些线程之一然后写入一个XObject ......这哪里会最终被保存?)

虽然此线程标记C++而不是关于.NET,我之前看到过这种“反模式”,并不是那么严重,而是更加理智的形式,即数据库事务处理范围。

1

我宁愿看到XFile和XObject之间的关系是明确的,我同意这个“魔术”太隐藏了。我也质疑为什么给这个对象一个名字,除非这个名字是重要的那个API的其他部分。

由于很多原因,全局变量被鄙视,这只是一个例子。