“這就是問題了, 編譯期/源代碼的依賴導(dǎo)致我們沒法把系統(tǒng)劃分成獨(dú)立的組件,各自獨(dú)立開發(fā),獨(dú)立部署,一個(gè)的變化就影響到了另外一個(gè)。”
Java說:“你看看我使用多態(tài)以后的設(shè)計(jì),我的業(yè)務(wù)邏輯在編譯時(shí)只依賴那個(gè)接口Writer,而不依賴具體的實(shí)現(xiàn)FileWriter和MailWriter?!?
為什么面向?qū)ο笤阃噶耍?/div>
“你的意思是只要接口Writer不變化,底層的具體實(shí)現(xiàn)如FileWriter ,MailWriter可以隨意變化,隨意替換,就像插件一樣,對(duì)吧?” C語(yǔ)言說到。
“對(duì)啊,編譯期/源代碼不依賴,運(yùn)行期依賴,這就是延遲綁定帶來的好處,現(xiàn)在你明白o(hù).f()和 f(o)的本質(zhì)區(qū)別了吧。 ”
Lisp 不失時(shí)機(jī)又插了一嘴:“你那接口中只有一個(gè)函數(shù),就是write(),用什么接口啊,脫褲子放屁,多此一舉,在我這兒只要把不同的函數(shù)傳遞過去就可以了?!?
Java笑道:“別抬杠,這就是個(gè)簡(jiǎn)單的例子,不管是用接口,還是傳遞函數(shù),都是延遲綁定嘛, 關(guān)鍵點(diǎn)都是要找到那個(gè)穩(wěn)定的東西(Writer),就是抽象。你找不到這個(gè)穩(wěn)定的東西,做不出抽象,你的系統(tǒng)就沒法劃分成可以獨(dú)立開發(fā),獨(dú)立變化的組件了?!?
C語(yǔ)言還想反擊,但一直找不到突破口。
Lisp說道:“別聽Java在哪里忽悠,C老弟,你也能實(shí)現(xiàn)運(yùn)行期的延遲綁定,這不是Java的專利,你忘了虛函數(shù)表了?”
C語(yǔ)言一拍大腿:“是啊,我忘了那一年春節(jié)回家,Linus 大神曾經(jīng)告訴我,虛函數(shù)表和函數(shù)指針才是實(shí)現(xiàn)多態(tài)的關(guān)鍵,比如Unix/Linux把設(shè)備都當(dāng)成了文件,有標(biāo)準(zhǔn)的open , read 等方法,對(duì)于不同的設(shè)備,都能調(diào)用對(duì)應(yīng)的方法, 那是怎么實(shí)現(xiàn)的?也是通過虛函數(shù)表做延遲綁定嘛!”
(碼農(nóng)翻身老劉注:C語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮脑斍榭梢砸撇健?
C語(yǔ)言高興了:“哈哈,Java 老弟,看來我們本質(zhì)上還是一樣的,多態(tài)只不過是函數(shù)指針的一種應(yīng)用!”
Java說:“所以編程的關(guān)鍵不在于是否使用了面向?qū)ο蟮恼Z(yǔ)言,這一點(diǎn)你同意吧?”
C語(yǔ)言點(diǎn)頭,編程的關(guān)鍵點(diǎn)就是找到、抽象出穩(wěn)定的接口,針對(duì)這個(gè)接口編程,這樣就可以讓各個(gè)模塊能夠獨(dú)立地變化。
“說起來容易,做起來難,這兒有一個(gè)例子,你給我用面向?qū)ο笤O(shè)計(jì)一下?” Lisp 拋出了一道題。
動(dòng)物可以分為肉食動(dòng)物,草食動(dòng)物,水生動(dòng)物,陸生動(dòng)物,用類如何表示?
Java 說:這還不簡(jiǎn)單,看看這名詞多明顯啊,都可以變成類啊,讓他們都繼承動(dòng)物就可以了。
為什么面向?qū)ο笤阃噶耍?/div>
Lisp看到Java 掉入了陷阱,狡黠地一笑:“那有的動(dòng)物就既是陸生動(dòng)物,又是肉食動(dòng)物,怎么表達(dá)?”
“那我就加一個(gè)陸生肉食動(dòng)物類?!?雖然覺得不妥,Java還是說了出來。
為什么面向?qū)ο笤阃噶耍?/div>
“那要是再來一個(gè)水生肉食動(dòng)物怎么辦?或者來了一個(gè)新的概念‘哺乳動(dòng)物’, 該怎么處理?”
“哈哈哈,我懂了,隨著需求的增多,不但類會(huì)出現(xiàn)爆炸, 還可能會(huì)出現(xiàn)那種怪異的類,這面向?qū)ο缶幊檀_實(shí)是有大問題??!” C語(yǔ)言說。
Java 低頭沉思不語(yǔ),突然,腦海中想起來了那句話:優(yōu)先使用組合而不是繼承。
怎么使用組合?必須得改變下看待問題的方式,對(duì),應(yīng)該這樣:
昭通市|
蒲江县|
清涧县|
松桃|
巴林左旗|
台前县|
和静县|
泾阳县|
含山县|
甘南县|
会昌县|
揭西县|
云和县|
石城县|
社会|
焉耆|
河间市|
贡觉县|
即墨市|
繁峙县|
揭东县|
永仁县|
临漳县|
武邑县|
会东县|
栾川县|
成都市|
武鸣县|
宜春市|
康定县|
安溪县|
平遥县|
南城县|
精河县|
保定市|
天镇县|
集贤县|
乾安县|
光泽县|
历史|
永寿县|