Martin Fowler:繼承是被誤用了
很多權威人士,包括OO粉絲,都不喜歡“繼承”,但是它讓我將一個通用行為調整到特定行為時更有用和簡單,只是它被誤用了,像很多技術一樣,需要學會如何好好地用它。
眾說紛紜:
1. 我預設使用組合,並且如果在重複幾次之後有意義時才使用繼承。
2. 不幸的是,繼承通常用於非業務範圍,而不是使用在領域邏輯上。一個很好的例子是一些Web框架需要擴充套件控制器或模型類的方式。繼承具有良好的用例,但它不應該是預設選項。
3. 對不起,這就像是說廚師應該預設使用鈍刀,因為他們可能會用鋒利的刀削減自己。
4. 當我需要一切都符合相同的契約或者部分例項化類時,我喜歡使用繼承。繼承的核心問題是:它只是眾多類關係中的一個,但它被提升為核心語法
5. 我謙卑地建議你使用繼承,會比“普通開發者”好幾個數量級。預設值很重要。OOP允許預設繼承,這導致在實際幫助的少數情況下更多的病態耦合。
6. 當你看到一個實現12個介面的類,每個介面只有1個方法時,你可能會開始認為組合不是銀彈,繼承也不是。一個設計良好的解決方案使用兩者。
7. 關於繼承的最危險的事情,它使得調整通用行為變得簡單。易於實施,但維護成本不明確(特別是如果我們在層次結構中定期進行這些型別的更改),會分佈在多個檔案中。
8. 我對使用繼承,介面隔離結合應用DDD模式實現的模型有很好的經驗。例如,使用子域的繼承使關係變得清晰(非常明確)並且非常有用。
9.不幸的是,函式性程式設計現在很流行,人們不明白這些東西只是工具。繼承不僅僅是OO的東西。有些人認為。例如,在Clojure中有一些簡潔的機制。
10. 繼承意味著緊密耦合。在某些情況下這很糟糕,在其他情況下則很好。因此,我不願在*已釋出的* API中使用繼承,但它經常在* private * API中具有很大的價值。我們有一個Payment類,它針對每個用例進行了擴充套件,但這是一個封閉的私有API。即核心應用程式的一部分。這是繼承具有巨大利益的一個完美例子,但它處於受控制的環境中。
11. 在某些語言中,使用繼承似乎效能更高,因為它是在編譯器級別實現的,使用組合有時需要不同的例項,更多的記憶體,有時還會失去靜態排程的好處
相關文章
- [翻譯]-領域事件-Martin Fowler事件
- 貧血模型-Martin Fowler 翻譯模型
- Martin Fowler 談“編輯”“釋出”相分離
- Martin Fowler:英國口音的軟體工程 (轉)軟體工程
- Martin Fowler講述重構的工作流程
- 敏捷史話(八):敏捷的破局之道——Martin Fowler敏捷
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- Martin Fowler三萬字解讀原始碼分支管理模式原始碼模式
- Martin Fowler談Scrum認證、敏捷現狀與未來Scrum敏捷
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- Java 繼承是什麼?Java繼承
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- 高質量的軟體是否能賺回成本? - Martin Fowler
- Martin Fowler:仍無法衡量軟體開發的生產效率
- 多繼承 與 多重繼承繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- 瀑布和迭代可混合:敏捷定義者Martin Fowler定義瀑布法敏捷
- 幽默:請不要用“型別1 2 3 ..”來區分事物 - Martin Fowler型別
- Martin Fowler大神 - 微服務、貧血模型、重構、敏捷開發方法論微服務模型敏捷
- Martin Fowler談CMS系統中編輯-釋出模組的分離
- ES6繼承和ES5繼承是完全一樣的麼?繼承
- 繼承繼承
- C++繼承一之公有繼承C++繼承
- JS原型繼承和類式繼承JS原型繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- 類的繼承_子類繼承父類繼承
- JavaScript繼承JavaScript繼承
- JavaScript 繼承JavaScript繼承
- 多繼承繼承
- Java繼承Java繼承
- javascript:繼承JavaScript繼承
- swift繼承Swift繼承