OO真经——关于面向对象的哲学体系及科学体系的探讨(下)
真經(jīng)第六章——運(yùn)作 Moving
??????“運(yùn)動是絕對的——牛頓”
6.1、導(dǎo)言
????? 在前五章中,我們從世界觀的這話題開始,逐步引出了抽象、層次、繼承和耦合。這些內(nèi)容,形成了對象論中關(guān)于世界的結(jié)構(gòu)體系。
????? 然而,要想真正描述一個(gè)世界,僅有結(jié)構(gòu)式不行的。開始我們說過,世界觀主要關(guān)注兩個(gè)方面:一是世界是什么樣子的(結(jié)構(gòu)),另一個(gè)就是世界時(shí)如何演進(jìn)的(運(yùn)作)。現(xiàn)在,我們來討論對象論中關(guān)于世界運(yùn)作的理論。
????? 這里首先要指出一點(diǎn),“對象論”是關(guān)于程序世界(即將一個(gè)軟件系統(tǒng)看成一個(gè)世界)的世界觀,而非關(guān)于現(xiàn)實(shí)世界的,所以,將對象論應(yīng)用于現(xiàn)實(shí)世界時(shí),往往會有所偏頗。其實(shí)前面的某些地方已經(jīng)體現(xiàn)出這一點(diǎn),而在運(yùn)作理論這里,會體現(xiàn)的尤其明顯。但是為了直觀起見,我依然會將對象論應(yīng)用于現(xiàn)實(shí)世界去舉例子,當(dāng)然我會非常謹(jǐn)慎和小心,并且會明確指出對象論應(yīng)用于現(xiàn)實(shí)世界的偏頗在哪里。
6.2、世界本沒有類
??????對象論認(rèn)為:世界的演進(jìn),是而且只是各種對象通過互相調(diào)用其他對象的公開服務(wù)而完成交互。
????? 注意,是對象交互,而不是類交互!沒錯(cuò),類之間是永遠(yuǎn)不可能交互的。因?yàn)椴徽撌乾F(xiàn)實(shí)世界還是程序世界,從來不存在具體的類。類只是抽象思維作用于對象的產(chǎn)物,它幫助我們理解、記憶、分析和設(shè)計(jì)。類是抽象的概念,它“客觀”存在,但不是“具體”的存在。
????? 例如,現(xiàn)實(shí)世界中,我們可以找出很多個(gè)“具體的蘋果”對象,但是你能找出一個(gè)東西,說它是“蘋果”這個(gè)類嗎?你這一輩子吃的每一個(gè)蘋果,都是一個(gè)具體的蘋果對象,從來沒有具體的“蘋果類”和你交互過。再上升一點(diǎn),你一生交互過的所有東西,都是對象,而沒有一個(gè)具體的類。“類”不過是你的抽象思維作用于對象形成的幫助你理解認(rèn)識世界的抽象概念罷了。“類們”從不曾和你真正交互。
????? 程序世界中也是一樣,程序運(yùn)行起來,從來都是具體對象之間的交互,類只是幫助你分析設(shè)計(jì)的概念工具罷了。
????? 認(rèn)識到上面幾點(diǎn)對于理解對象論的世界運(yùn)行理論非常重要,時(shí)刻銘記,參與真正世界運(yùn)行的,只有對象,沒有類!對象在世界中,類在我們心中!
????? 這一小節(jié)的標(biāo)題是“世界本沒有類”,代表兩個(gè)意思:一是世界“本來”沒有類,二是世界“本質(zhì)”沒有類。
????? 你可能會問,在第五章“耦合”中,不是說依賴關(guān)系是“兩個(gè)類因?yàn)榭赡芙换ザa(chǎn)生的關(guān)系”嗎?其實(shí),確切點(diǎn)說,應(yīng)該是“兩個(gè)類所能映射到的對象因?yàn)榭赡芙换ザa(chǎn)生的關(guān)系”,本質(zhì)上,依賴本來是對象間的依賴,只不過在抽象時(shí)被同時(shí)抽象到類里面了。
6.3、程序世界——大同的和諧世界
????? 雖然在對象論里,現(xiàn)實(shí)世界和抽象世界的基本運(yùn)作機(jī)理是一樣的,但程序世界和現(xiàn)實(shí)世界在具體運(yùn)作上有很大差別。首先,我要告訴你,程序世界時(shí)多么的大同和和諧!
??????程序世界與現(xiàn)實(shí)世界第一點(diǎn)區(qū)別:現(xiàn)實(shí)世界的依賴以對象為單位,程序世界的依賴以類為單位。
????? 沒明白這意味著什么?
????? 舉個(gè)例子,在現(xiàn)實(shí)世界中,是不是關(guān)系很重要啊。為什么?因?yàn)槟阏J(rèn)識的人多,可依賴的人就多。例如你生病了,如果你有個(gè)醫(yī)生朋友,看病就方便很多;如果你要打官司,而你又恰巧認(rèn)識律師朋友,是不是很爽呢;如果你想上清華大學(xué),剛好清華大學(xué)校長是你親戚,那一切就好辦多了是吧。
????? 為什么會這樣?究其本質(zhì),是因?yàn)?strong>現(xiàn)實(shí)世界中對象間的依賴是以對象為單位的,這種依賴關(guān)系不會隨著泛化過程而被泛化到類里面去。例如,有一個(gè)人現(xiàn)在在北京航空航天大學(xué)上學(xué),從這“一個(gè)人可”以泛化出“人”這個(gè)類,而北航可以泛化出“大學(xué)”這個(gè)類,但這個(gè)具體的人和北航的這種關(guān)系可沒有被泛化到兩個(gè)類中,也就是說,并不是每一個(gè)“人對象”都可以去任何一個(gè)“大學(xué)對象”去上學(xué)的。
????? 不過,如果是程序世界里,上面的推理是可行的,因?yàn)?strong>程序世界中對象間的依賴是以類為單位的,這種依賴關(guān)系會隨著泛化過程而被泛化到類里面去。并且,只要兩個(gè)類建立了依賴,那么兩個(gè)類之間的所有對象都兩兩依賴了。換句話說,在程序世界里,只要有一個(gè)“人”和一個(gè)“大學(xué)”發(fā)生了聯(lián)系,那么這種聯(lián)系就被泛化到類中了,隨后,所有的“人”都可以上“任何”的大學(xué)。
圖6.1、兩個(gè)世界中依賴的區(qū)別
????? 看圖6.1,假設(shè)世界上只有三個(gè)人和三所大學(xué)。在現(xiàn)實(shí)世界中,小龍女考上了清華,不過這和其他人其他大學(xué)一點(diǎn)關(guān)系也沒有,這種關(guān)系并沒有體現(xiàn)在類上,看,兩個(gè)類沒有任何聯(lián)系。但在程序世界中,小龍女考上了清華,一下子人和大學(xué)兩個(gè)類就關(guān)聯(lián)起來了,接著,張無忌和郭靖這兩個(gè)不好好學(xué)習(xí)的學(xué)生也沾了光,和三所大學(xué)都聯(lián)系起來了。(提示:其實(shí)這里和第四章講到的OCP和LSP聯(lián)系非常緊密,讀者可以聯(lián)系OCP和LSP兩個(gè)原則自己思考一下為什么程序世界會這樣。)
????? 你知道了吧,在程序世界里,全世界的醫(yī)生隨你看,律師隨你用,大學(xué)隨你上,美食隨你吃!多么和諧大同的美好世界!
????? 看了上面對程序世界的描述,你是不是已經(jīng)垂涎三尺了?恨不得自己變成一段代碼,跑到程序世界里。不過別著急,事情也許沒有你想象的那么美好。下面我們來看另一個(gè)程序世界與現(xiàn)實(shí)世界的區(qū)別。
6.4、程序世界——封建的專制世界
????? 上文描述了程序世界是多么多么美好,不過如果有一天,你真的跑到里面去了,你可就慘了。不信看下面。話說你一進(jìn)程序世界,就迫不及待想在程序世界里找個(gè)漂亮的女朋友,可以嗎?對不起,不成!你想吃法國大餐,對不起,不成!你想上最好的大學(xué),對不起,不成!……搞什么!不是說程序世界什么都可以得到嗎。沒錯(cuò),除了選擇權(quán)!
??????程序世界里的對象沒有選擇權(quán)。
????? 為什么會這樣?因?yàn)槿绻麑ο笥羞x擇權(quán),就沒法貫徹OCP了!你要是活在程序世界里,不但給你包辦婚姻,連吃飯、上學(xué)……一切的一切,你都得服從包辦,對象一點(diǎn)點(diǎn)選擇權(quán)也沒有。至于誰給你包辦的,那是后話。
????? 看了這些,你還敢去程序世界嗎?不過這還不是最恐怖的,告訴你更恐怖的一點(diǎn):
??????程序世界里的對象不認(rèn)識對象。
????? 沒錯(cuò),良好的面向?qū)ο筇岢珜ο蟛徽J(rèn)識對象!很不可思議?其實(shí),這就是所謂的“低耦合”,我們喊了那么多年的“低耦合”,到底什么是低耦合?所謂低耦合,就是先剝奪對象的選擇權(quán),再剝奪對象的感覺。對象間誰也不認(rèn)識誰,只知道對象能提供什么服務(wù)。
????? 我們現(xiàn)在了解了程序世界是什么樣子了,下面,我們討論程序世界為什么要這樣。
6.5、有奶就是娘
????? 中國有句俗語,叫“有奶就是娘”,往往用來諷刺那種六親不認(rèn),兩面三刀,誰給好處就跟誰的無恥小人。不過,面向?qū)ο罂墒欠浅L岢坝心叹褪悄铩钡男袨椤H绻覀兊某绦蚨寄茏龅健坝心叹褪悄铩钡牡夭?#xff0c;那就真是實(shí)現(xiàn)了“低耦合”這一教義了,套用梁朝偉的話,在程序世界里,有奶就是娘的行為“是美德”。
????? 要理解上述道理,我們要先拋卻我們腦中的道德、廉恥等概念,從本質(zhì)上看看“有奶就是娘”體現(xiàn)了什么哲學(xué)道理。
?? ? ?“有奶就是娘”,純從字面解釋,是說任何一個(gè)人,只要能給奶喝,就當(dāng)做自己親娘。上升到哲學(xué)層面,是說這么一個(gè)意思:不以其他對象實(shí)體本身為交互準(zhǔn)則,而以其他對象的行為作為交互準(zhǔn)則,與一個(gè)對象是否進(jìn)行交互純粹是從其行為判斷,而不對對象本體有任何概念。
????? 這種處事哲學(xué),在現(xiàn)實(shí)生活中是最被人鄙夷的,但在程序世界里確是最提倡的。如果一個(gè)程序世界里,所有對象都能以“有奶就是娘”的哲學(xué)去處事,那么,這就是一個(gè)最美好運(yùn)作方式。
6.6、接口橫空出世
????? 上文說到,程序世界中提倡的運(yùn)作方式是“有奶就是娘”的方式,但要真正實(shí)現(xiàn)這種方式,似乎還少點(diǎn)東西。我們回顧一下,世界本來只有對象,我們從對象中抽象出了類,這就是目前我們眼中的世界。這樣,我們的交互,要么以對象為準(zhǔn)則,要么以類為準(zhǔn)則。
????? 以對象為準(zhǔn)則,顯然是不行的,因?yàn)槲覀冋f了,對象間根本互不認(rèn)識。以類為準(zhǔn)則,理論上可行,但這樣有問題,就是類本身是對象“實(shí)體的抽象”,是為了更好記憶、描述和認(rèn)識世界而創(chuàng)建的對象,歸根到底,還是“實(shí)體”范疇的概念,所以在哲學(xué)上還是和“以行為作為交互準(zhǔn)則”向左。
????? 認(rèn)識到以上困難,就能認(rèn)識到,目前我們的世界還無法實(shí)現(xiàn)以行為為交互準(zhǔn)則,于是,我們需要為世界再衍生一些內(nèi)容。第二章說過,世界本身只有對象,而衍生其他概念的基本方法是抽象。所以,這里我們當(dāng)然要用抽象衍生一些概念出來。進(jìn)一步,類是對象“實(shí)體”的抽象,而我們需要的是以行為為交互準(zhǔn)則,很自然的,我們完全可以創(chuàng)建一種新概念,這種概念是行為的抽象,這種新概念,就是接口(Interface)。
??????接口(Interface):對象行為的抽象。
????? 這里要說明,接口和類雖然都是從對象上通過抽象衍生出的概念,但兩者本質(zhì)不同,是從對象的兩個(gè)不同的哲學(xué)角度和動機(jī),抽象出的不同概念,并形成世界兩個(gè)完全不同的方面(Aspect)。至于兩者具體有什么區(qū)別,下一小節(jié)詳細(xì)討論。
6.7、接口 vs 抽象類
????? 經(jīng)常有朋友迷惑一件事情,抽象類和接口有什么區(qū)別?何時(shí)使用抽象類,何時(shí)使用接口?但從功能來講,抽象類完全可以代替接口,那為什么還要有接口呢?這一小節(jié)來分析這些問題。
????? 這里附帶說一個(gè)問題,產(chǎn)生這種疑惑的原因,大多是因?yàn)榕笥褌円呀?jīng)習(xí)慣了學(xué)習(xí)一個(gè)東西時(shí),只看其什么樣子?怎么用?而不習(xí)慣于弄清楚一個(gè)東西起源于哪?出現(xiàn)的動機(jī)是什么?其實(shí),要想學(xué)好、用好任何一個(gè)東西,后兩個(gè)問題更關(guān)鍵一些。
????? 舉個(gè)例子,有人發(fā)明了吹風(fēng)機(jī),我們?nèi)绻桓闱宄涫鞘裁礃幼印坝袀€(gè)把手,有個(gè)吹風(fēng)筒”,以及怎么用——“打開按鈕能吹出熱風(fēng),關(guān)閉按鈕就停止了”。如果我們只搞清楚這些,那么我們八成用不對這個(gè)東西,為什么?因?yàn)槲覀兏静恢肋@東西是怎么來的,它為什么要被發(fā)明出來。也許我們天天拿他吹臉取暖或吹衣服,還一派洋洋得意以為用的很好的樣子。殊不知這東西其實(shí)是用來吹頭發(fā)幫助頭發(fā)快點(diǎn)干起來的。
????? 不要笑,這種事經(jīng)常發(fā)生在我們身上。因?yàn)樵谲浖_發(fā)中,有太多的東西,我們只顧著學(xué)習(xí)其是什么樣子,怎么個(gè)用法,也許就像吹風(fēng)機(jī)一樣,這些并不復(fù)雜,然后我們就把它用到不該用的地方,還以為自己用得很好。
????? 用不用得好吹風(fēng)機(jī),不在于是否熟練掌握開開關(guān)關(guān),而在于是不是用它吹頭發(fā)。同理,任何東西用得好不好,不在于是不是熟練掌握用法,而在于是不是用對了地方。而要想用對地方,就要弄清楚這個(gè)東西的“怎么出來的”和“出來是做什么用的”。
????? 說了挺多,我們回到接口和抽象類的話題上來。
????? 首先要說明一點(diǎn),“抽象類(Abstract Class)”和“類(Class)”在哲學(xué)意義上沒什么區(qū)別,其區(qū)別僅僅是實(shí)現(xiàn)層面上的,即抽象類只不過是一種特殊的類,編程環(huán)境強(qiáng)制不準(zhǔn)這種類生成實(shí)例,哲學(xué)意義上兩者沒有任何區(qū)別。所以,從哲學(xué)層面討論“抽象類與接口對比”和討論“類與接口對比”是等價(jià)的。
????? 類與接口的不同點(diǎn)有以下幾點(diǎn):
????? I. 抽象范疇不同。類是對象“體征”的抽象,接口是對象行為的抽象。
????? II. 抽象動機(jī)不同。抽象出類是為了幫助記憶、認(rèn)識世界,抽象出接口是為了實(shí)現(xiàn)低耦合交互。
????? III. 關(guān)注不同。類關(guān)注共同的體征,接口關(guān)注用來交互的行為。
????? IV. 存在范疇不同。類存在于抽象層次樹上,接口存在于接口網(wǎng)。
????? V. 應(yīng)用范疇不同。類應(yīng)用于結(jié)構(gòu)范疇,是靜態(tài)概念,接口應(yīng)用于運(yùn)作范疇,是動態(tài)概念。
????? 上面的條目有點(diǎn)學(xué)術(shù)了,通俗說來,類是從對象實(shí)體的的體征范疇上抽象出來的,用來幫助我們記憶、分析世界不同的對象,主要表明對象“什么樣子”;而接口是從對象交互時(shí)需要的行為中抽象出來的,關(guān)注對象交互時(shí)需要的行為。
????? 還是舉個(gè)例子吧。
????? 例如,有一群具體的司機(jī)和好多輛具體的汽車,我們可以從司機(jī)中抽象出“司機(jī)”這個(gè)類,從汽車抽象出“汽車”這個(gè)類,這種抽象是“體征范疇”的,抽象的目的僅僅是幫助記憶、認(rèn)識,完全和交互沒有關(guān)系。而當(dāng)考慮到交互——司機(jī)需要駕駛汽車,于是抽象出一個(gè)“可駕駛”這個(gè)接口。注意,一但“可駕駛”這個(gè)接口被抽象出來,就完全和司機(jī)以及汽車沒有關(guān)系了,除了汽車,拖拉機(jī)、輪船、飛機(jī)都可以實(shí)現(xiàn)這個(gè)接口,而不一定是司機(jī),會開車的任何人都可以通過“可駕駛”這個(gè)接口去駕駛?cè)魏螌?shí)現(xiàn)“可駕駛”接口的東西。這樣一來,“駕駛”這種交互就完全取決于這個(gè)接口了,這就是“以行為為交互準(zhǔn)則的意思”。
????? 如果明白了這一小節(jié)的內(nèi)容,相信大家再也不會被“接口和類有什么區(qū)別?”、“何時(shí)使用抽象類,何時(shí)使用接口?”這樣的問題迷惑了,而可以揮灑自如的在系統(tǒng)中正確使用接口和類。一個(gè)方法:拿不準(zhǔn)的時(shí)候問問自己,這個(gè)抽象是體征抽象還是行為抽象?是為了記憶、分析、設(shè)計(jì)還是為了交互需要?想明白,再下手。
6.8、依賴是如何被倒置的
????? 弄清楚了接口,下面可以談一個(gè)有名的OO原則了:依賴倒置原則(DIP)。
????? 如上,我們先不說DIP是什么,而是搞清楚DIP的來龍去脈。到時(shí),朋友們自然對DIP就有深刻理解了。我們開始!
????? 首先,我們要說明,依賴是有方向的,客戶類依賴于服務(wù)類。什么是客戶類?如果A類需要B類提供的服務(wù),那么A類就依賴B類,反之不成立。在沒有引入接口前,客戶類“知道”服務(wù)類,而服務(wù)類“不知道”客戶類,就像下面這個(gè)樣子。
圖6.2、沒有接口的依賴
????? 我們看到,司機(jī)作為客戶類,汽車作為服務(wù)類。依賴的方向是從司機(jī)到汽車,以為這里司機(jī)要使用汽車提供的“駕駛”方法操作汽車。這是我們不推薦的方式,因?yàn)椴粔颉八神詈稀薄S谑?#xff0c;我們將駕駛抽象成接口,依賴變成如下形式。
圖6.3、引入接口后的依賴
????? 如圖6.3所示,我們從這種交互關(guān)系中,抽象出了“可駕駛”這個(gè)接口。注意,此時(shí)兩者誰也不依賴誰,或說誰也不知道誰了。那么為什么司機(jī)可以放心呢?因?yàn)樗揽神{駛接口的存在,他要駕駛的東西一定實(shí)現(xiàn)了這個(gè)接口,甭管是什么,只要實(shí)現(xiàn)了這個(gè)接口,我就能駕駛。其實(shí)這里才體現(xiàn)出接口的哲學(xué)意義。
??????接口的哲學(xué)意義:對客戶類的保證,對服務(wù)類的約束。
????? 正是接口約束了服務(wù)類必須實(shí)現(xiàn)什么功能,客戶類才可以在不知道具體服務(wù)類的情況下“放心”進(jìn)行交互,因?yàn)榻涌趯蛻纛愄峁┝艘环N保證。希望各位能好好體會接口的這種哲學(xué)意義,這對于對象論的良好運(yùn)行體質(zhì)的理解非常重要。
????? 可是,這樣還不夠,我們還有一個(gè)非常重要的問題沒有討論:誰有權(quán)利定義接口?或者說服務(wù)類和客戶類誰擁有接口?當(dāng)然,理論上時(shí)誰擁有都可以,但卻會對世界的運(yùn)作產(chǎn)生巨大影響。我們先看服務(wù)類擁有接口的情形。
圖6.4、服務(wù)類擁有接口
????? 如圖6.4,由于服務(wù)類擁有制定接口的權(quán)利,所以各個(gè)服務(wù)類都定義了自己的接口,一般情況下他們的接口是不相容的。如圖,司機(jī)可以駕駛汽車,但由于輪船、飛機(jī)各自有自己的可駕駛接口,所以會開汽車未必會開飛機(jī)和輪船,如果要開飛機(jī)或輪船還要一個(gè)個(gè)學(xué),現(xiàn)實(shí)世界中就是這樣一種情況。所以,這種世界的運(yùn)行其實(shí)接口幾乎沒有起到作用,由于服務(wù)類是“大爺”,所以它們可以指定諸多霸王條款,而客戶必須忍氣吞聲去遷就,所以,實(shí)際的依賴方向還是從客戶類到服務(wù)類。
????? 下面在看看客戶類擁有接口會是什么樣子。
圖6.5、客戶類擁有接口
????? 看上圖,客戶終于翻身做主人了,現(xiàn)在客戶擁有定義接口的權(quán)利,服務(wù)類必須無條件實(shí)現(xiàn),這下好了,只要會開汽車,就會開輪船和飛機(jī),因?yàn)榭蛻粲袡?quán)利定義一個(gè)統(tǒng)一的接口,服務(wù)類必須無條件實(shí)現(xiàn)!這樣,三種交通工具的駕駛方法必須完全一致(雖然現(xiàn)實(shí)世界還沒有這樣),這回客戶終于可以揚(yáng)眉吐氣,體會一把“顧客是上帝”的感覺了。
????? 在圖6.5的情況下,司機(jī)可以有權(quán)定義接口,他不必“知道”服務(wù)類,而服務(wù)類必須“知道”客戶定義了什么接口,你有沒有發(fā)現(xiàn),依賴的方向已經(jīng)悄悄倒置過來了!變成服務(wù)類依賴客戶類了(誰知道誰,誰就依賴誰)!這就是“依賴倒置”的由來。不必說,所謂依賴倒置原則就是讓我們必須按圖6.5的方式運(yùn)行世界,而不能按圖6.2,6.3,6.4的方式。下面正式定義依賴倒置原則。
??????依賴倒置原則(DIP):客戶類和服務(wù)類都應(yīng)該依賴于抽象(接口),并且客戶類擁有接口。
????? 我想,看過上述來龍去脈,已經(jīng)不用我再去解釋這個(gè)原則了吧。
6.9、神秘的統(tǒng)治者
????? 到目前為止,我們基本已經(jīng)搞清楚了對象世界的運(yùn)行機(jī)制。但仍有一個(gè)疑問:我們曾經(jīng)說過,程序世界里對象時(shí)沒有選擇權(quán)的,甚至不知道誰是誰,只知道接口,那么,誰來指定服務(wù)類呢?
????? 例如,上述司機(jī)可以制定接口,所以汽車、飛機(jī)、輪船等可駕駛的東西都要實(shí)現(xiàn),于是司機(jī)可以按照自己制定的方式駕駛東西。但是,司機(jī)不能選擇駕駛什么啊,他根本不知道自己駕駛的是什么,那么,誰制定他是駕駛飛機(jī)、汽車還是輪船呢?
????? 似乎冥冥中,這個(gè)世界存在一個(gè)統(tǒng)治者,它掌管所有對象之間誰和誰交互(只要不違反接口),否則,世界根本沒法正常運(yùn)行。沒錯(cuò),程序世界是有這么一個(gè)統(tǒng)治者,他就是大名鼎鼎的“依賴注入容器(DI)”,也有人叫做“控制反轉(zhuǎn)容器(IoC)”。
????? 什么叫依賴注入?什么叫控制反轉(zhuǎn)?如果你看了上面的文章,那太好理解了,依賴注入就是容器挑選符合接口的服務(wù)類為客戶類提供服務(wù)。例如,上面司機(jī)要一個(gè)可駕駛的東西,容器就會根據(jù)既定規(guī)則選擇一個(gè),可能是飛機(jī)、可能是汽車、也可能是輪船,交給司機(jī)。司機(jī)駕駛就行了,不用管是什么,反正知道這東西肯定實(shí)現(xiàn)了“可駕駛”接口。
????? 讓我們向這個(gè)偉大的統(tǒng)治者致敬吧,沒有他,程序世界可真玩不轉(zhuǎn)了(當(dāng)然,如果某個(gè)程序世界不符合DIP甚至沒接口,都是類之間依賴,那么就不需要依賴注入容器了,不過這么一來,可就是“高耦合”了,是OO所反對的)。
6.10、運(yùn)作起來吧
????? 到了這里,根本不用我廢話說程序世界時(shí)怎么運(yùn)作的了,因?yàn)樯厦娑家呀?jīng)說明白了。不過,我還是用短短幾句話總結(jié)一下吧。
??????一個(gè)符合OO原則的、低耦合的程序世界的運(yùn)作形式是這樣的:首先參與運(yùn)作的本質(zhì)只有對象,對象不直接依賴,沒有選擇權(quán),互相不知道,而只知道各個(gè)接口。客戶類制定接口,對象間通過接口交互,形成運(yùn)作。世界的統(tǒng)治者依賴注入容器決定選擇哪個(gè)服務(wù)類給客戶類使用。
????? 好了,關(guān)于程序世界的運(yùn)作哲理就講到這里了,大家可以在腦子里描繪一下上述運(yùn)作情景,加深印象。
本文基于署名-非商業(yè)性使用 3.0許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載,演繹,但是必須保留本文的署名張洋(包含鏈接),且不得用于商業(yè)目的。如您有任何疑問或者授權(quán)方面的協(xié)商,請與我聯(lián)系。
總結(jié)
以上是生活随笔為你收集整理的OO真经——关于面向对象的哲学体系及科学体系的探讨(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试之客户体验
- 下一篇: 调度器Quartz的简述与使用总结