成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 開發(fā)工具
又是周末,編程語言“三巨頭”Java, Lisp 和C語言在Hello World咖啡館聚會。

 又是周末,編程語言“三巨頭”Java, Lisp 和C語言在Hello World咖啡館聚會。

[[277696]]

服務(wù)員送來咖啡的同時還帶來了一張今天的報紙, 三人寒暄了幾句, C語言翻開了報紙,突然眼前一亮:“這篇文章的標(biāo)題寫得好啊, 《為什么面向?qū)ο笤阃噶?》”

(這是一篇很早之前的文章,作者是大名鼎鼎的Joe Armstrong , 也就是Erlang之父。)

Java 大吃一驚,居然有人這么罵面向?qū)ο?!

他趕緊搶過來,看了一會兒,說到:“雖然我對去世的Joe Armstrong老先生非常尊敬,但是我對他的觀點(diǎn)卻不敢茍同,你看他說'數(shù)據(jù)結(jié)構(gòu)和函數(shù)不應(yīng)該綁到一起!'”

C語言說:“他說得很有道理啊,函數(shù)是實(shí)現(xiàn)算法的,就像一個黑盒子,只要理解了它的輸入和輸出,就理解了它的功能,而數(shù)據(jù)結(jié)構(gòu)呢就是單純的‘聲明’,為什么要把他們綁在一起呢?”

“不不不,還是綁在一起好!我給你舉個例子,一個棧,如果你把它當(dāng)成一個完整的對象,那用起來就方便多了。”

  1. Stack s = new Stack(); 
  2. s.push(100); 
  3. s.push(200); 
  4. s.pop(); 

C語言不甘示弱:“把數(shù)據(jù)結(jié)構(gòu)和函數(shù)分開也挺好啊!比如我可以創(chuàng)建一個叫做Stack的數(shù)據(jù)結(jié)構(gòu),然后寫幾個對這個數(shù)據(jù)結(jié)構(gòu)操作的函數(shù)。”

  1. push(stack, 100); 
  2. push(stack, 200); 
  3. pop(stack); 

Java不屑一顧地說:“你看看你這種方式多丑陋啊。”

C語言寸步不讓:“本質(zhì)都是一樣的,你是o.f() ,我是f(o), 有啥區(qū)別?”

Lisp也插了一嘴:“還有我的(f o) ”

2

Java無語,心說這兩個家伙就是胡攪蠻纏。突然,他心中一動:我怎么忘記多態(tài)了。

Java說:“本質(zhì)是不一樣的,你要知道,o.f()是可以產(chǎn)生多態(tài)行為的,這就帶來了巨大的好處,我給你舉個例子,你有一段業(yè)務(wù)邏輯,需要把計(jì)算的結(jié)果記錄到文件中,將來還可能會記錄別的地方,你的設(shè)計(jì)可能是這樣的。”

[[277698]]

 

C語言:“難道不應(yīng)該如此嗎?一個函數(shù)調(diào)用另外一個函數(shù)?”

Java 說到:“這里有個依賴的問題,就是businessLogic()不但運(yùn)行期依賴writeToFile(), 在源碼級或者編譯期也會依賴。”

C語言:“這不是很正常嘛!”

Java又說道:“不一樣, 寫入文件是底層的實(shí)現(xiàn)細(xì)節(jié),不是高層策略,假如用戶不想把計(jì)算的結(jié)果保存到文件中了,而是想通過郵件發(fā)送,那你的businessLogic也得修改了,對不對?”

[[277698]]

 

C語言:“那肯定啊!函數(shù)調(diào)用嘛,一個改了,另外一個也得改。”

“這就是問題了, 編譯期/源代碼的依賴導(dǎo)致我們沒法把系統(tǒng)劃分成獨(dú)立的組件,各自獨(dú)立開發(fā),獨(dú)立部署,一個的變化就影響到了另外一個。”

C語言覺得有一定的道理,他說:“那怎么辦?”

Java說:“你看看我使用多態(tài)以后的設(shè)計(jì),我的業(yè)務(wù)邏輯在編譯時只依賴那個接口Writer,而不依賴具體的實(shí)現(xiàn)FileWriter和MailWriter。”

 

“你的意思是只要接口Writer不變化,底層的具體實(shí)現(xiàn)如FileWriter ,MailWriter可以隨意變化,隨意替換,就像插件一樣,對吧?” C語言說到。

“對啊,編譯期/源代碼不依賴,運(yùn)行期依賴,這就是延遲綁定帶來的好處,現(xiàn)在你明白o(hù).f()和 f(o)的本質(zhì)區(qū)別了吧。 ”

Lisp 不失時機(jī)又插了一嘴:“你那接口中只有一個函數(shù),就是write(),用什么接口啊,脫褲子放屁,多此一舉,在我這兒只要把不同的函數(shù)傳遞過去就可以了。”

Java笑道:“別抬杠,這就是個簡單的例子,不管是用接口,還是傳遞函數(shù),都是延遲綁定嘛, 關(guān)鍵點(diǎn)都是要找到那個穩(wěn)定的東西(Writer),就是抽象。你找不到這個穩(wěn)定的東西,做不出抽象,你的系統(tǒng)就沒法劃分成可以獨(dú)立開發(fā),獨(dú)立變化的組件了。”

C語言還想反擊,但一直找不到突破口。

Lisp說道:“別聽Java在哪里忽悠,C老弟,你也能實(shí)現(xiàn)運(yùn)行期的延遲綁定,這不是Java的專利,你忘了虛函數(shù)表了?”

C語言一拍大腿:“是啊,我忘了那一年春節(jié)回家,Linus 大神曾經(jīng)告訴我,虛函數(shù)表和函數(shù)指針才是實(shí)現(xiàn)多態(tài)的關(guān)鍵,比如Unix/Linux把設(shè)備都當(dāng)成了文件,有標(biāo)準(zhǔn)的open , read 等方法,對于不同的設(shè)備,都能調(diào)用對應(yīng)的方法, 那是怎么實(shí)現(xiàn)的?也是通過虛函數(shù)表做延遲綁定嘛!”

C語言高興了:“哈哈,Java 老弟,看來我們本質(zhì)上還是一樣的,多態(tài)只不過是函數(shù)指針的一種應(yīng)用!”

Java說:“所以編程的關(guān)鍵不在于是否使用了面向?qū)ο蟮恼Z言,這一點(diǎn)你同意吧?”

C語言點(diǎn)頭,編程的關(guān)鍵點(diǎn)就是找到、抽象出穩(wěn)定的接口,針對這個接口編程,這樣就可以讓各個模塊能夠獨(dú)立地變化。

3

“說起來容易,做起來難,這兒有一個例子,你給我用面向?qū)ο笤O(shè)計(jì)一下?” Lisp 拋出了一道題。

動物可以分為肉食動物,草食動物,水生動物,陸生動物,用類如何表示?

Java 說:這還不簡單,看看這名詞多明顯啊,都可以變成類啊,讓他們都繼承動物就可以了。

 

Lisp看到Java 掉入了陷阱,狡黠地一笑:“那有的動物就既是陸生動物,又是肉食動物,怎么表達(dá)?”

“那我就加一個陸生肉食動物類。” 雖然覺得不妥,Java還是說了出來。

 

“那要是再來一個水生肉食動物怎么辦?或者來了一個新的概念‘哺乳動物’, 該怎么處理?”

“哈哈哈,我懂了,隨著需求的增多,不但類會出現(xiàn)爆炸, 還可能會出現(xiàn)那種怪異的類,這面向?qū)ο缶幊檀_實(shí)是有大問題啊!” C語言說。

Java 低頭沉思不語,突然,腦海中想起來了那句話:優(yōu)先使用組合而不是繼承。

怎么使用組合?必須得改變下看待問題的方式,對,應(yīng)該這樣:

 

 

[[277698]]

 

 

Java得意地說:“看看這個圖, 動物具備多個特性,如'進(jìn)食', '移動',將來還可以加上'哺乳方式',每個特性都是一個接口,接口是穩(wěn)定的, 動物這個概念是可以通過這些接口特性給組合起來的。”

Lisp 贊賞地點(diǎn)頭, C語言向Java投去了欽佩的目光,這家伙經(jīng)常做面向?qū)ο蟮脑O(shè)計(jì),還是有兩把刷子的,他通過特性的方式把變化給隔離了, 各個特性可以通過組合的方式,像插件一樣隨意替換, 嗯,這才是面向?qū)ο蟮恼嬲璋 ?/p>

夜已深, 最后Java做了個總結(jié),大伙散去。

“編程嘛就是發(fā)現(xiàn)變化,并且把它給隔離起來,使用各種語言都可以,面向?qū)ο蟮恼Z言有著直接使用多態(tài)的便利,以后不要隨隨便便就diss它了。”

參考資料:

http://www.cs.otago.ac.nz/staffpriv/ok/Joe-Hates-OO.htm

《敏捷軟件開發(fā):原則,模式與實(shí)踐》

《架構(gòu)整潔之道》

《面向?qū)ο箝_發(fā)參考手冊》

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】

 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2023-01-10 09:38:09

面向對象系統(tǒng)

2013-11-26 10:14:15

面向?qū)ο?/a>函數(shù)式

2011-07-05 16:15:49

面向?qū)ο?/a>

2020-08-03 07:50:56

存儲對象存儲

2019-11-11 10:48:44

面向對象語言

2014-12-17 09:57:39

2013-03-11 09:23:22

Go語言面向?qū)ο?/a>

2022-07-30 23:41:53

面向過程面向?qū)ο?/a>面向協(xié)議編程

2015-02-11 10:22:25

對象存儲云共享S3存儲

2013-04-17 10:46:54

面向?qū)ο?/a>

2013-08-21 17:20:49

.NET面向?qū)ο?/a>

2012-01-17 09:34:52

JavaScript

2017-04-21 09:07:39

JavaScript對象編程

2025-02-24 16:00:00

JavaScripMap開發(fā)

2010-07-15 13:56:24

面向?qū)ο?/a>面向過程

2020-08-02 22:54:04

Python編程語言開發(fā)

2020-05-29 10:17:00

代碼擴(kuò)展設(shè)計(jì)

2009-06-26 13:29:11

面向?qū)ο?/a>

2021-10-21 18:47:37

JavaScript面向對象

2010-07-06 09:43:34

UML面向?qū)ο?/a>
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三 | 国产真实乱对白精彩久久小说 | 国产美女免费视频 | 99爱视频 | 免费在线看黄 | 日韩成人精品在线观看 | 国产欧美精品 | 欧美日韩亚洲一区 | 美女二区| 99re在线视频 | 久久一本| 97色在线视频 | 99视频网 | 精品在线观看一区二区 | 久久国产精品一区二区三区 | 国产高清在线观看 | 久久草在线视频 | 欧美日韩高清一区二区三区 | 国产一级视频在线播放 | 国产精品久久久久久中文字 | 精品国产一区二区三区久久狼黑人 | 观看av | 日韩一区三区 | 国产1区 | 亚洲精品电影网在线观看 | 日韩在线免费播放 | 欧美激情精品久久久久久 | 午夜视频在线观看视频 | 午夜黄色影院 | 中文字幕一区二区三区精彩视频 | 中文字幕亚洲视频 | 久久99精品久久久久久 | 国产亚洲精品成人av久久ww | 亚洲一本 | 欧美性猛交一区二区三区精品 | 免费观看黄a一级视频 | 国产欧美精品一区二区三区 | 一级片视频免费观看 | 热99视频| 亚洲女人的天堂 | a级黄色片视频 |