你以為你了解物件導向設計麼?你可能說:?是的,我了解!?那麼好,來看乙個例子。
下面這個設計,你認為是物件導向設計麼?
button類的**如下:
public
class button}}
你可能會說,這個設計用到了封裝、繼承和多型,這難道不是物件導向的三大機制麼?
那麼好,你的回答說明你已經很了解物件導向的基礎知識了。但是這就是物件導向設計了麼?
百度百科裡關於物件導向設計是這麼定義的:?物件導向設計模式是?好的物件導向設計?。?剛開始看到這句話,我懷疑這句話是不是有語病。其實,它的言外之意是:差的物件導向設計不是物件導向設計,所謂?好的物件導向設計?是那些可以滿足?應對變化,提高復用?的設計。
上面這個設計嚴格的說,有不好的、或不成熟的地方。主要是button依賴lamp類,這主要會有2個問題,一是lamp改變,button類會受影響,即所謂的僵化性。二是想要重用button類去控制其它的東西是不可能的,即所謂的頑固性。這個例子是《敏捷軟體開發??原則、模式與實踐(c#版)》一書?dip:依賴倒置原則?一章中的例子,筆者稍加修改。
運用依賴倒置原則把button和lamp的關係改進後的設計是這樣的(見下)。
至於依賴倒置原則,說的已經太多了,不是本文重點,略過。但bob大叔的一段話,還是很值得琢磨的。
?事實上,這種依賴關係的倒置正是好的物件導向設計的標誌所在。使用何種語言來編寫程式是無關緊要的。如果程式的依賴關係是倒置的,它就是物件導向的設計。如果程式的依賴關係不是倒置的,它就是過程化的設計。?
之所以寫這篇隨筆,是因為最近看另一篇關於物件導向的部落格?我們需要養成物件導向的程式設計習慣?及其評論時感到,有些朋友把物件導向設計和非物件導向設計的對比等同於物件導向程式設計語言(oopl)和非物件導向程式設計語言的對比。
引用百度百科?物件導向設計?詞條中的一些話來闡述一下:
通過物件導向程式設計語言(oopl)認識到的物件導向,並不是物件導向的全部,甚至只是淺陋的物件導向。
oopl的三大機制?封裝、繼承、多型?可以表達物件導向的所有概念,但這三大機制本身並沒有刻畫出物件導向的核心精神。換言之,既可以用這三大機制做出?好的物件導向設計?,也可以用這三大機制做出?差的物件導向設計?。不是使用了物件導向的語言(例如c#),就實現了物件導向的設計與開發!因此我們不能依賴程式語言的物件導向機制,來掌握物件導向。
本來可以結束本文了,但是考慮到有些朋友可能會置疑前文中的一點,所以再補補漏。
有些朋友可能會認為,如果button和lamp一旦設計好後就不會再變化,那麼最前面的設計可能就是乙個好的設計了,而後面的設計反倒有不必要的複雜性,或者說是《重構》中所說的?夸夸其談未來性speculative generality?。
還有朋友可能說,敏捷的設計是用增量的方式來完成的,敏捷的技術實踐tdd、重構都是主張先做足夠用的設計,然後小步持續改進。所以最前面的設計如果是夠用的,那麼就沒有必要一開始就把它弄複雜。
以上說法,本人也很贊同。本來世界上絕對的東西就很少,尤其技術領域。畢竟,我們智慧型的價值,就在於能尋找預見性和適應性的最佳平衡點,這不是機器能做到的
你真的了解sizeof 麼?
sizeof並不是c語言和c 語言中的乙個函式,而是乙個關鍵字,乙個操作符。它的作用是返回乙個物件或者型別名的長度,也就是說這個物件或者型別所佔的記憶體位元組數。它的返回值型別為size t usinged int 長度的單位是位元組。1 對基本資料型別運用sizeof操作,得到其占用記憶體的位元組...
你真的了解sizeof 麼?
sizeof並不是c語言和c 語言中的乙個函式,而是乙個關鍵字,乙個操作符。它的作用是返回乙個物件或者型別名的長度,也就是說這個物件或者型別所佔的記憶體位元組數。它的返回值型別為size t usinged int 長度的單位是位元組。1 對基本資料型別運用sizeof操作,得到其占用記憶體的位元組...
vSphere是什麼,你了解麼?
source 最近這兩周都在學習vmware vsphere相關知識,昨天在做了乙個專案後,vmware虛擬化之旅暫告一段落了。晚上乙個人閒下來時回想了之前所學,憶起vsphere時,大腦一片空白.我突然發現自己不知道它的概念是什麼,它的來歷,它的功能,它的作用,它的內容.學了這麼多天,最基礎的竟然...