特性和混入不是面向对象的
讓我立刻說,我們將在這里討論的功能是那些迫切需要進行放線手術的人帶給面向對象編程的純粹的毒藥 ,就像David West在他的《 Objecting Thought》一書中所建議的那樣。 這些功能具有不同的名稱,但最常見的是traits和mixins 。 我很不明白,當具有這些功能時,如何仍然可以調用面向對象的編程。
Terry Gilliam的《拉斯維加斯的恐懼與厭惡》(1998年)
首先,簡而言之就是它們的工作方式。 讓我們使用Ruby模塊作為示例實現。 假設我們有一堂課Book :
class Bookdef initialize(title)@title = titleend end現在,我們希望Book類使用一個靜態方法(一個過程)來做一些有用的事情。 我們可以在實用程序類中定義它,然后讓Book調用它:
class TextUtilsdef self.caps(text)text.split.map(&:capitalize).join(' ')end end class Bookdef printputs "My title is #{TextUtils.caps(@title)}"end end或者,我們可以使其變得更加“方便”,并extend我們的模塊以便直接訪問其方法:
module TextModuledef caps(text)text.split.map(&:capitalize).join(' ')end end class Bookextend TextModuledef printputs "My title is #{caps(@title)}"end end如果您不了解面向對象的編程和靜態方法之間的區別 ,那似乎很好。 而且,如果我們暫時忘記了OOP的純度 ,即使我的字符較少,這種方法實際上對我來說也不太可讀。 很難理解caps()方法從何而來,就像#{caps(@title)}而不是#{TextUtils.caps(@title)} 。 你不覺得嗎
當我們include它們include進來時,Mixins開始發揮更好的作用。 我們可以將它們結合起來以構造我們要尋找的類的行為。 讓我們創建兩個mixin。 第一個稱為PlainMixin ,它將按PlainMixin打印書的標題,第二個稱為CapsMixin ,并大寫已打印的內容:
module CapsMixindef to_ssuper.to_s.split.map(&:capitalize).join(' ')end end module PlainMixindef to_s@titleend end class Bookdef initialize(title)@title = titleendinclude CapsMixin, PlainMixindef printputs "My title is #{self}"end end沒有附帶的mixin的Call Book將按原樣打印其標題。 添加include語句后, to_s的行為將被覆蓋,方法print產生不同的結果。 我們可以組合mixin來產生所需的功能。 例如,我們可以再添加一個,將標題縮寫為16個字符:
module AbbrMixindef to_ssuper.to_s.gsub(/^(.{16,}?).*$/m,'\1...')end end class Bookdef initialize(title)@title = titleendinclude AbbrMixin, CapsMixin, PlainMixindef printputs "My title is #{self}"end end我確定您已經了解它們都可以訪問Book類的私有屬性@title 。 他們實際上可以完全使用課堂上的所有內容 。 從字面上看,它們是“代碼片段”,我們將其注入到類中以使其更加強大和復雜。 這種方法有什么問題?
這與注解 , DTO , getter和實用程序類相同 —它們將對象拆開并將功能塊放置在對象看不到它們的地方。
對于mixin,該功能位于Ruby modules ,該modules對Book的內部結構進行了假設,并進一步假設程序員在內部結構更改后仍將了解Book的內容。 這樣的假設完全違反了封裝的思想。
mixins和對象私有結構之間的這種緊密耦合不會導致無法維護和難以理解的代碼。
mixin的非常明顯的替代品是可組合裝飾器 。 看一下文章中給出的示例:
Text text = new AllCapsText(new TrimmedText(new PrintableText(new TextInFile(new File("/tmp/a.txt")))) );它看起來與我們上面使用Ruby mixins所做的非常相似嗎?
但是,與mixin不同,裝飾器使對象較小且具有凝聚力,從而在它們之上分層附加功能。 Mixins的作用恰恰相反—它們使對象變得更復雜,并且因此使對象的可讀性和可維護性降低。
老實說,我相信他們只是毒藥。 發明它們的人距離理解面向對象設計的哲學還有很長的路要走。
您可能還會發現這些相關的帖子很有趣: 責任的縱向與橫向分解 ; 復合名稱是代碼氣味 ; 不變性的梯度 ; OOP中的反模式 ; 不可變對象如何具有狀態和行為? ;
翻譯自: https://www.javacodegeeks.com/2017/03/traits-mixins-not-oop.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的特性和混入不是面向对象的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos攻击过程四个组成部分(ddos攻
- 下一篇: 安卓软件蓝牙互传(安卓软件蓝牙)