從Mixin到物件組合
Facebook提出Mixin的三個問題:
1.缺乏封裝
2.隱式依賴
3.名稱衝突
下面是Javascript的實現Mixin的類:
const Coloured = { // __Public Methods__ setColourRGB ({r, g, b}) { return this.colourCode = {r, g, b}; }, getColourRGB () { return this.colourCode; }, getColourHex () { return this.rgbToHex(this.colourCode); }, // __Private Methods__ componentToHex(c) { const hex = c.toString(16); return hex.length == 1 ? "0" + hex : hex; }, rgbToHex({r, g, b}) { return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b); } }; class Todo { constructor (name) { this.name = name || 'Untitled'; this.done = false; } title () { return name; } do () { this.done = true; return this; } undo () { this.done = false; return this; } } Object.assign(Todo.prototype, Coloured); <p> |
注意到上述程式碼最後一行是將Todo和Coloured兩個類Mixin混合。
這種Mixin混合顯然破壞了Todo的封裝性,因為將Coloured的行為混合編織進入了Todo,我們通過開啟Todo程式碼是無法知道原來在執行時Todo還會依賴Coloured,產生了隱形依賴。
通過組合方式可以替代Mixn:
class Todo { constructor (name) { this.name = name || 'Untitled'; this.done = false; this[colouredObject] = Object.assign({}, Coloured); } do () { this.done = true; return this; } undo () { this.done = false; return this; } setColourRGB ({r, g, b}) { return this[colouredObject].setColourRGB({r, g, b}); } getColourRGB () { return this[colouredObject].getColourRGB(); } getColourHex () { return this[colouredObject].getColourHex(); } } <p> |
在上面程式碼中,我們實際將在外面的Object.assign類的混合動作從外面遷移到Todo這個類裡面。
其實搞這麼複雜,不如老老實實地直接在Todo中直接引用Coloured,反而將兩者依賴直觀表達出來。
當然,原文在這個複雜道路上進行了瘋狂探險:
From Mixins to Object Composition
相關文章
- 【React深入】從Mixin到HOC再到HookReactHook
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言
- 組合模式-統一的處理個別物件與組合物件模式物件
- 從組合語言到類庫框架的隨感組合語言框架
- 物件導向 -- 類的組合物件
- 物件的組合(第四章)物件
- 從程式導向到物件導向物件
- 天書夜讀:從組合語言到Windows核心程式設計筆記(2)組合語言Windows程式設計筆記
- python物件導向的繼承-組合-02Python物件繼承
- python物件導向程式設計之組合Python物件程式設計
- 從mixin機制理解Flutter App啟動FlutterAPP
- 從 Java 位元組碼到 ASM 實踐JavaASM
- 從原始資料型別到值物件資料型別物件
- 《JAVA併發程式設計實戰》物件的組合Java程式設計物件
- 從物件導向到模式再到真正的物件導向 (轉)物件模式
- 組合
- 從itpub看來的一道組合題
- 從組合語言理解C++傳參方式組合語言C++
- 從騰訊到阿里,最後選擇位元組阿里
- 從Mixin到hooks,談談對React16.7.0-alpha中即將引入的hooks的理解HookReact
- Java基礎01 從HelloWorld到物件導向Java物件
- 從 Java 到 Scala(一):物件導向談起Java物件
- 從入門到入獄------物件導向(二)物件
- IT組合和專案組合管理(轉)
- 【數學】組合數學 - 排列組合
- 智慧合約從入門到精通:智慧合約的前世今生
- SCSS @mixinCSS
- 組策略物件物件
- 機器學習之特徵組合:組合獨熱向量機器學習特徵
- 組合數學筆記-排列與組合筆記
- 專案組準則——從我”到“我們”(轉)
- 生成組合物件之二進位制反射格雷碼(c++)物件反射C++
- 組合模式模式
- 排列組合
- 智慧合約從入門到精通:Solidity AssemblySolid
- 智慧合約從入門到精通:完整範例
- 智慧合約從入門到精通:智慧合約的應用場景
- PHP物件導向深入研究之【組合模式與裝飾模式】PHP物件模式