天天看點

一文一點 | 你真的以為自己在面向對象程式設計嗎

1、

什麼是面向對象程式設計。

那我們先說什麼是對象,一個對象包含屬性和行為,有時候屬性又叫做狀态。

說到對象,還想到了封裝、內建、多态。

按照這樣了解,應該知道怎麼是面向對象程式設計了。

2、

但是,自從何時你使用了spring之後,你不覺得你在使用spring的時候,屬性和行為被 “天然” 的分離了嗎。

你的工程被分成了manger/service/dao層,還有vo層,vo裡面都是get/set。

你在service裡面寫的都是crud,是函數吧,嗯也可以叫做方法,而不是類,也不是接口。

不對呀,我寫了接口了呀,那些service 和 impl 我不是寫了麼。

有工具可以幫你生成這些,好,就算是你自己寫的,然後呢,你就寫了一個“幹癟”的service,你的資料、屬性呢。

都放入了vo裡面了。

是以,你真不是在做面向對象程式設計,而是在做面向過程程式設計。

3、

有一個聽起來讓人不舒服的詞語:貧血模型,上面說的情況就是符合這種模型的了。

說到spring,還要再往前說起ejb2,打從ejb2就開始了這樣的風格了,spring把這樣的程式設計方式又再一次發揮到了極緻。

當年有一本書叫做《Expert One-on-One J2EE Development without EJB》很受歡迎。

4、

應該還有充血模型吧,是的。

對象是行為和狀态的集合體,比如一個訂單相關的功能,貧血的做法是

類:Order+OrderService

儲存訂單:orderService.save(Order order);

充血的做法是

類:Order

儲存訂單:order.save();行為就是儲存它自己。

5、

如果是一個有“追求”的程式員呢,應該向充血傾斜。

封裝、繼承、多态,最有魅力的莫過于多态,無論是代碼還是架構都在解決一個問題:分離邏輯和控制。

就是依靠多态。

面向對象程式設計就是以多态為手段來對源代碼中的依賴關系進行控制的能力。

這種能力讓我們可以建構出插件式架構,讓高層政策性元件與底層實作元件相分離,底層元件可以被編譯成插件,實作獨立于高層元件的開放和部署。

最後,在程式運作中就可以動态的改變對象的行為。