Mixin在React.js中是有害的

banq發表於2016-07-15

Mixin是來自OO世界概念,而React.js是遵循函數語言程式設計概念,在React程式設計中使用Mixin被認為是有害的。

Facebook官方發表了文章Mixins Considered Harmful | React,文章大意如下:

“如何在幾個元件之間共享程式碼”是人們學習使用React常有的疑問,答案是使用元件組合實現重用,你能定義一個元件然後在其他幾個元件中重複使用它即可。

但是,在實踐中,Facebook發現事情沒有這麼簡單,在實踐中遭遇的問題普遍竟然是由Mixin引起的。雖然Mixin比組合模式更加智慧,類似一種執行時組合的魔術模式。

Mixin有以下問題:

首先,Mixin容易被破壞,但是這不意味著Mixin模式本身不好,很多人已經成功應用它在很多語言和正規化中,包括一些函數語言程式設計,在Facebook廣泛使用類似於Mixin的trait,但是Mixin在React程式碼中是沒有必要和有問題的。

Mixin會引入隱式的依賴,一些元件依賴Mixin中定義的某個方法,比如getClassName(); 有時它是另外一種方式,Mixin呼叫方法像renderHeader(),Javascript是一個動態語言,難以面對這些依賴。

一個元件的render()方法也許引用了一些沒有在類裡面定義的方法,這個元件能夠安全地遷移嗎?我們需要到處尋找Mixin所有成員,開啟每個檔案,尋找在Mixin中被定義的方法。

如果Mixin又依賴其他Mixin,移除它們中一個就會引起連鎖中斷,這時需要一個依賴相簿,但是不像元件,Mixin不會形成一個層次,它們被扁平化並在同一個名稱空間中執行。

其次,Mixin會引起名稱衝突,如果在FluxListenerMixin中定義了handleChange() , WindowSizeMixin定義了handleChange(),你就不能一起使用它們。

如果你完全控制你的程式碼這不是一個問題,可以更名方法名稱,但是如果Mixin來自第三方包,你就無法更名了。

再者,Mixin會引起滾雪球式的複雜性。Mixin開始很簡單,但是會日益複雜。

那麼如何從Mixin中遷移出來呢?Facebook針對不同情形程式碼提出了不同的解決方案。

這些方法總體來說比較複雜,對程式設計師要求水平極高,不是普通Javscript前端程式設計師就能完全掌握,看來React.js用起來也如Java/Scala一樣非常能有深度。

相關文章