中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

為什么面向?qū)ο笤阃噶耍?/h1>

2021-02-13    分類(lèi): 網(wǎng)站建設(shè)

編程語(yǔ)言“三巨頭”Java, Lisp 和C語(yǔ)言在Hello World咖啡館聚會(huì)。
服務(wù)員送來(lái)咖啡的同時(shí)還帶來(lái)了一張今天的報(bào)紙, 三人寒暄了幾句, C語(yǔ)言翻開(kāi)了報(bào)紙,突然眼前一亮:“這篇文章的標(biāo)題寫(xiě)得好啊, 《為什么面向?qū)ο笤阃噶?!》?
Java 大吃一驚,居然有人這么罵面向?qū)ο???
他趕緊搶過(guò)來(lái),看了一會(huì)兒,說(shuō)到:“雖然我對(duì)去世的Joe Armstrong老先生非常尊敬,但是我對(duì)他的觀點(diǎn)卻不敢茍同,你看他說(shuō)'數(shù)據(jù)結(jié)構(gòu)和函數(shù)不應(yīng)該綁到一起!'”
C語(yǔ)言說(shuō):“他說(shuō)得很有道理啊,函數(shù)是實(shí)現(xiàn)算法的,就像一個(gè)黑盒子,只要理解了它的輸入和輸出,就理解了它的功能,而數(shù)據(jù)結(jié)構(gòu)呢就是單純的‘聲明’,為什么要把他們綁在一起呢?”
“不不不,還是綁在一起好!我給你舉個(gè)例子,一個(gè)棧,如果你把它當(dāng)成一個(gè)完整的對(duì)象,那用起來(lái)就方便多了?!?
C語(yǔ)言不甘示弱:“把數(shù)據(jù)結(jié)構(gòu)和函數(shù)分開(kāi)也挺好?。”热缥铱梢詣?chuàng)建一個(gè)叫做Stack的數(shù)據(jù)結(jié)構(gòu),然后寫(xiě)幾個(gè)對(duì)這個(gè)數(shù)據(jù)結(jié)構(gòu)操作的函數(shù)。”
Java不屑一顧地說(shuō):“你看看你這種方式多丑陋啊?!?
C語(yǔ)言寸步不讓?zhuān)骸氨举|(zhì)都是一樣的,你是o.f() ,我是f(o), 有啥區(qū)別?”
Lisp也插了一嘴:“還有我的(f o) ”
Java無(wú)語(yǔ),心說(shuō)這兩個(gè)家伙就是胡攪蠻纏。突然,他心中一動(dòng):我怎么忘記多態(tài)了。
Java說(shuō):“本質(zhì)是不一樣的,你要知道,o.f()是可以產(chǎn)生多態(tài)行為的,這就帶來(lái)了巨大的好處,我給你舉個(gè)例子,你有一段業(yè)務(wù)邏輯,需要把計(jì)算的結(jié)果記錄到文件中,將來(lái)還可能會(huì)記錄別的地方,你的設(shè)計(jì)可能是這樣的。”
為什么面向?qū)ο笤阃噶耍?/div>
C語(yǔ)言:“難道不應(yīng)該如此嗎?一個(gè)函數(shù)調(diào)用另外一個(gè)函數(shù)?”
Java 說(shuō)到:“這里有個(gè)依賴(lài)的問(wèn)題,就是businesslogic()不但運(yùn)行期依賴(lài)writeToFile(), 在源碼級(jí)或者編譯期也會(huì)依賴(lài)?!?
C語(yǔ)言:“這不是很正常嘛!”
Java又說(shuō)道:“不一樣, 寫(xiě)入文件是底層的實(shí)現(xiàn)細(xì)節(jié),不是高層策略,假如用戶不想把計(jì)算的結(jié)果保存到文件中了,而是想通過(guò)郵件發(fā)送,那你的businesslogic也得修改了,對(duì)不對(duì)?”
為什么面向?qū)ο笤阃噶耍?/div>
C語(yǔ)言:“那肯定??!函數(shù)調(diào)用嘛,一個(gè)改了,另外一個(gè)也得改?!?
“這就是問(wèn)題了, 編譯期/源代碼的依賴(lài)導(dǎo)致我們沒(méi)法把系統(tǒng)劃分成獨(dú)立的組件,各自獨(dú)立開(kāi)發(fā),獨(dú)立部署,一個(gè)的變化就影響到了另外一個(gè)?!?
C語(yǔ)言覺(jué)得有一定的道理,他說(shuō):“那怎么辦?”
Java說(shuō):“你看看我使用多態(tài)以后的設(shè)計(jì),我的業(yè)務(wù)邏輯在編譯時(shí)只依賴(lài)那個(gè)接口Writer,而不依賴(lài)具體的實(shí)現(xiàn)FileWriter和MailWriter。”
為什么面向?qū)ο笤阃噶耍?/div>
“你的意思是只要接口Writer不變化,底層的具體實(shí)現(xiàn)如FileWriter ,MailWriter可以隨意變化,隨意替換,就像插件一樣,對(duì)吧?” C語(yǔ)言說(shuō)到。
“對(duì)啊,編譯期/源代碼不依賴(lài),運(yùn)行期依賴(lài),這就是延遲綁定帶來(lái)的好處,現(xiàn)在你明白o(hù).f()和 f(o)的本質(zhì)區(qū)別了吧。 ”
Lisp 不失時(shí)機(jī)又插了一嘴:“你那接口中只有一個(gè)函數(shù),就是write(),用什么接口啊,脫褲子放屁,多此一舉,在我這兒只要把不同的函數(shù)傳遞過(guò)去就可以了?!?
Java笑道:“別抬杠,這就是個(gè)簡(jiǎn)單的例子,不管是用接口,還是傳遞函數(shù),都是延遲綁定嘛, 關(guān)鍵點(diǎn)都是要找到那個(gè)穩(wěn)定的東西(Writer),就是抽象。你找不到這個(gè)穩(wěn)定的東西,做不出抽象,你的系統(tǒng)就沒(méi)法劃分成可以獨(dú)立開(kāi)發(fā),獨(dú)立變化的組件了。”
C語(yǔ)言還想反擊,但一直找不到突破口。
Lisp說(shuō)道:“別聽(tīng)Java在哪里忽悠,C老弟,你也能實(shí)現(xiàn)運(yùn)行期的延遲綁定,這不是Java的專(zhuān)利,你忘了虛函數(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)的?也是通過(guò)虛函數(shù)表做延遲綁定嘛!”
(碼農(nóng)翻身老劉注:C語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮脑斍榭梢砸撇健?
C語(yǔ)言高興了:“哈哈,Java 老弟,看來(lái)我們本質(zhì)上還是一樣的,多態(tài)只不過(guò)是函數(shù)指針的一種應(yīng)用!”
Java說(shuō):“所以編程的關(guān)鍵不在于是否使用了面向?qū)ο蟮恼Z(yǔ)言,這一點(diǎn)你同意吧?”
C語(yǔ)言點(diǎn)頭,編程的關(guān)鍵點(diǎn)就是找到、抽象出穩(wěn)定的接口,針對(duì)這個(gè)接口編程,這樣就可以讓各個(gè)模塊能夠獨(dú)立地變化。
“說(shuō)起來(lái)容易,做起來(lái)難,這兒有一個(gè)例子,你給我用面向?qū)ο笤O(shè)計(jì)一下?” Lisp 拋出了一道題。
動(dòng)物可以分為肉食動(dòng)物,草食動(dòng)物,水生動(dòng)物,陸生動(dòng)物,用類(lèi)如何表示?
Java 說(shuō):這還不簡(jiǎn)單,看看這名詞多明顯啊,都可以變成類(lèi)啊,讓他們都繼承動(dòng)物就可以了。
為什么面向?qū)ο笤阃噶耍?/div>
Lisp看到Java 掉入了陷阱,狡黠地一笑:“那有的動(dòng)物就既是陸生動(dòng)物,又是肉食動(dòng)物,怎么表達(dá)?”
“那我就加一個(gè)陸生肉食動(dòng)物類(lèi)?!?雖然覺(jué)得不妥,Java還是說(shuō)了出來(lái)。
為什么面向?qū)ο笤阃噶耍?/div>
“那要是再來(lái)一個(gè)水生肉食動(dòng)物怎么辦?或者來(lái)了一個(gè)新的概念‘哺乳動(dòng)物’, 該怎么處理?”
“哈哈哈,我懂了,隨著需求的增多,不但類(lèi)會(huì)出現(xiàn)爆炸, 還可能會(huì)出現(xiàn)那種怪異的類(lèi),這面向?qū)ο缶幊檀_實(shí)是有大問(wèn)題??!” C語(yǔ)言說(shuō)。
Java 低頭沉思不語(yǔ),突然,腦海中想起來(lái)了那句話:優(yōu)先使用組合而不是繼承。
怎么使用組合?必須得改變下看待問(wèn)題的方式,對(duì),應(yīng)該這樣:
為什么面向?qū)ο笤阃噶耍?/div>
Java得意地說(shuō):“看看這個(gè)圖, 動(dòng)物具備多個(gè)特性,如'進(jìn)食', '移動(dòng)',將來(lái)還可以加上'哺乳方式',每個(gè)特性都是一個(gè)接口,接口是穩(wěn)定的, 動(dòng)物這個(gè)概念是可以通過(guò)這些接口特性給組合起來(lái)的?!?
Lisp 贊賞地點(diǎn)頭, C語(yǔ)言向Java投去了欽佩的目光,這家伙經(jīng)常做面向?qū)ο蟮脑O(shè)計(jì),還是有兩把刷子的,他通過(guò)特性的方式把變化給隔離了, 各個(gè)特性可以通過(guò)組合的方式,像插件一樣隨意替換, 嗯,這才是面向?qū)ο蟮恼嬲璋 ?
夜已深, 最后Java做了個(gè)總結(jié),大伙散去。
“編程嘛就是發(fā)現(xiàn)變化,并且把它給隔離起來(lái),使用各種語(yǔ)言都可以,面向?qū)ο蟮恼Z(yǔ)言有著直接使用多態(tài)的便利,以后不要隨隨便便就diss它了?!?

網(wǎng)站欄目:為什么面向?qū)ο笤阃噶耍?/a>
本文URL:
http://m.rwnh.cn/news3/100803.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)公司、微信小程序、定制開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

维西| 镇原县| 浮山县| 永泰县| 灵山县| 祁门县| 罗甸县| 五华县| 沂源县| 南丹县| 峡江县| 灵石县| 潮安县| 滨州市| 涿州市| 新郑市| 巴东县| 蒙城县| 托里县| 新平| 遵化市| 鄂尔多斯市| 顺义区| 张家港市| 金溪县| 东乡族自治县| 鹰潭市| 株洲县| 德安县| 连州市| 灵台县| 隆子县| 广德县| 阳朔县| 饶河县| 高要市| 台东市| 任丘市| 兴和县| 湾仔区| 绵竹市|