2013-02-04 50 views
8

我通常在代码中使用与设计模式custom objects非常相似的内容。为什么在JavaScript构造函数中使用副作用不好的做法?

但是JSLint的皱眉在结构是这样的:

function MyClass() { this.init(); } 
new MyClass(data); 

因为对象被创建后立即丢弃 - 它没有被用于任何东西。 我们可以欺骗JSLint通过将它分配给一个变量来忽略这一点,但它并没有改变JSLint(我猜很多JavaScript爱好者)不鼓励这种模式。

那么,为什么在JavaScript构造函数中使用副作用被认为是不好的做法?

对于它的价值,我认为这是一个很好的实践因为:

  1. 你有一个设置功能,因此它应该是更容易维护,如果如您正在管理MyClass实例的列表以供稍后访问。 (把一个对象放到一个数组上是一个副作用,在构造函数返回时是“很好的做法”=难以维护)。
  2. 它有自己的原型,因此是“类所有权”: Firebug将此报告为MyClass的一个实例,而不仅仅是Object。 (这一点,在我看来,使其优于其他的设计模式。)
+0

JSLint不鼓励'新的MyClass',因为在实例化它之后你并没有使用它。因此,它只被用于其副作用。相反,这个例子可以被重写为使用依赖注入作为'initialize(new MyClass());'(尽管这个例子非常简单以至于很愚蠢)。 – zzzzBov

+0

你真的从来没有将任何新创建的MyClass实例赋值给任何东西(换句话说,这是一种使init()成为一种静态方法的复杂方法)吗?这种模式的“正常”使用不会触发JSLint警告。 –

+0

@FrédéricHamidi从来都不是,但有时会产生副作用,即完成这项工作本身,即没有什么需要去做。人员构造函数可能会实例化一个人员对象,但是您现在可能不一定需要对该人员进行操作。在你需要的情况下,副作用将自己注册到一个数组中以供以后访问。 – user1994380

回答

8

在他的书中清洁守则,罗伯特·马丁说

副作用是谎言。你的函数承诺做一件事,但它也会做其他隐藏的事情......他们歪曲和破坏错误,往往导致奇怪的时间耦合和顺序依赖。

你在关于数组的注释中描述的内容听起来像是一种“奇怪的时间耦合”。

+1

有用的答案,感谢您的搜索条件和参考资料。我发现这与任何有类似问题的人有关 - [Mark Seemann的.NET博客](http://blog.ploeh。dk/2011/05/24/DesignSmellTemporalCoupling.aspx)(不使用JavaScript)。没有更好的答案,我会接受这一个。 – user1994380

相关问题