2013-02-04 84 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

相關問題