面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
關(guān)于面向?qū)ο蟮奈恼?#xff0c;100篇里面有99篇要么離譜太遠(yuǎn),要么不知所云,但剩下有1篇是好的。我歷經(jīng)多年找不到那一篇,最終還是決定自己研究(因?yàn)楣ぷ鳝h(huán)境的原因,我的研究大多集中在性能與正確性這些東西上面,對(duì)進(jìn)化的思考一直都很少,也一直都沒有找到這方面的資料---它們真的很難找)。
面向?qū)ο蠛苤匾T诮裉斓能浖I(yè)界,它基本上是一切的基礎(chǔ)。比如設(shè)計(jì)模式,領(lǐng)域建模,甚至對(duì)框架的學(xué)習(xí)與研究和數(shù)據(jù)庫,一切都宣稱是面向?qū)ο蟮摹R闱宄鼈兪欠裾媸敲嫦驅(qū)ο蟮?#xff0c;就必須先搞清楚什么是面向?qū)ο蟆?/p>
因?yàn)檫@個(gè)詞被濫用得太厲害了。我讀過的有很多一看就知道是大家所著的諶稱專業(yè)級(jí)的文章一樣在上面犯下非常嚴(yán)重的錯(cuò)誤(這個(gè)其實(shí)沒有看上去那么奇怪。因?yàn)?#xff0c;一旦來到哲學(xué)的層面,犯錯(cuò)誤是很正常的,不犯錯(cuò)誤的才是不正常)。
實(shí)現(xiàn)一個(gè)系統(tǒng)很容易,難的是實(shí)現(xiàn)一個(gè)好系統(tǒng)。任何程序員都懂得怎么實(shí)現(xiàn)一個(gè)系統(tǒng),但系統(tǒng)到底怎么樣就要看各人的功底了。
要討論面向?qū)ο?#xff0c;我想先從哲學(xué)入手會(huì)好一點(diǎn)。哲學(xué)史上有一種思想叫解構(gòu)主義。而面向?qū)ο笃鋵?shí)就是對(duì)面向過程思想的解構(gòu)。解構(gòu)很困難,因?yàn)樗枰獜母旧细淖兯季S的方法。比如,要一個(gè)人從唯物論轉(zhuǎn)向唯心論很困難,反之同樣。原因就在于哲學(xué)所涉及的都是非常深層的概念,而這些東西都是在潛移默化中長(zhǎng)年累月積累形成的東西,要改變它們當(dāng)然不容易。從解構(gòu)主義的角度理解,就是要在人腦中重新構(gòu)建整個(gè)軟件概念系統(tǒng),以一種完全不同的思維方式進(jìn)行思維。在這種思維方式中,系統(tǒng)不再為功能存在,系充單元也不再只具有功能性,而是具有獨(dú)立個(gè)體特征與生存權(quán)的單元。系統(tǒng)在整體上再也不只是個(gè)功能復(fù)合體,而是由一個(gè)個(gè)具有生動(dòng)個(gè)體特征的對(duì)象組成。系統(tǒng)能力的提供不再是人為規(guī)劃的結(jié)果,而是由系統(tǒng)中的對(duì)象間接提供的。也就是說,面向?qū)ο蟮拈_發(fā)方法用對(duì)象的開發(fā)取代了直接的功能開發(fā)。功能不再是設(shè)計(jì)時(shí)的首要考量,只是系統(tǒng)恰好具有的一種能力。系統(tǒng)在本質(zhì)上或至少在設(shè)計(jì)思路上,跟功能是沒有關(guān)系的。這有點(diǎn)象中央集權(quán)的政體與民主政體的區(qū)別:中央集權(quán)的政體是具有高度目標(biāo)一致性的政體,民主政體則完全顛覆了這種邏輯:個(gè)體不再為整體存在;國(guó)家也不再有由功能或職能單位組成,而是由鮮活的個(gè)體組成。國(guó)家存在是因?yàn)閭€(gè)體存在。個(gè)體優(yōu)先于國(guó)家,這是民主政體的邏輯。這種邏輯比起高度目標(biāo)化的中央集權(quán)政體更符合實(shí)際的現(xiàn)實(shí)情況,因?yàn)樗姓J(rèn)個(gè)體(which is existing)的存在。承認(rèn)存在物的存在還有一個(gè)好處就是它更穩(wěn)定。因?yàn)椴还車?guó)這怎么變,個(gè)體作為一個(gè)概念是不變的。變化的只不過是游戲規(guī)則而已。但是這樣的規(guī)則在目標(biāo)化的系統(tǒng)中只能通過硬編碼的方式實(shí)現(xiàn),因?yàn)槟繕?biāo)化系統(tǒng)不存在主語,這樣的形式系統(tǒng)表達(dá)能力其實(shí)非常有限。它只能通過對(duì)謂語的約束實(shí)現(xiàn)一種扭曲的,難以理解的邏輯。這一方面造成艱難的可理解性,另一方面因?yàn)榈涂衫斫庑宰兂慑e(cuò)誤的源泉。因?yàn)樗且环N要么以設(shè)計(jì)者要么以少數(shù)幾個(gè)隨意假想的無形式主語(只存在于設(shè)計(jì)者的大腦中)為主語的系統(tǒng),不是一種更直接更容易理解與接受的領(lǐng)域模型。也就是說,因?yàn)橹髡Z的缺乏,這樣的系統(tǒng)實(shí)際上最好都變成了一種雙邏輯系統(tǒng):用戶邏輯與開發(fā)者邏輯。兩種邏輯同時(shí)存在的結(jié)果是,需要有人不斷地在實(shí)現(xiàn)翻譯或者說概念映射操作。這也是面向過程的系統(tǒng)可維護(hù)性更差的原因:翻譯官一走,就沒有人看得懂系統(tǒng)了。
理解這一點(diǎn)也不是很容易,因?yàn)樗婕暗叫问较到y(tǒng)理論甚至程序語義學(xué):計(jì)算機(jī)程序只是一種形式系統(tǒng),對(duì)它的理解過程實(shí)際上是一個(gè)語義賦值的過程。當(dāng)一個(gè)形式系統(tǒng)在結(jié)構(gòu)即語法上更加通俗化時(shí),它的可理解性更好。相反,如果它使用了一些很難理解的結(jié)構(gòu),那么顯然理解群體就要小得多,甚至可能一個(gè)也沒有。但是過程化系統(tǒng)極大地鼓勵(lì)在開發(fā)過程中使用一些個(gè)性化的形式,因?yàn)樗悄繕?biāo)導(dǎo)向的系統(tǒng),實(shí)現(xiàn)方式就無所謂了。一個(gè)過程系統(tǒng)設(shè)計(jì)者可以使用任何他喜歡的邏輯劃分方式,只要他能夠完成即定的任務(wù):可理解性就是在從這里開始丟失的。在形式系統(tǒng)中鼓勵(lì)個(gè)性化顯然是個(gè)極大的錯(cuò)誤。但是面向?qū)ο笙到y(tǒng)因?yàn)閺?qiáng)調(diào)面向領(lǐng)域建模一下子將程序員的飛馬行空式的想象縮窄到非常小的一個(gè)范圍:目標(biāo)領(lǐng)域,而提供了極大的可理解性。因?yàn)轭I(lǐng)域模型本來就是領(lǐng)域內(nèi)人士用來溝通的“行語”,它本來就是一種溝通界面。它的形式系統(tǒng)的理解人群數(shù)量顯然比個(gè)性化形式系統(tǒng)的理解人群大得多。
面向?qū)ο笈c面向過程系統(tǒng)最大的不同是:面向過程的系統(tǒng)由過程組成,而面向?qū)ο蟮南到y(tǒng)由對(duì)象組成。過程的邏輯是輸入輸出,是嚴(yán)格定義的系統(tǒng)模塊。模塊間則通過輸入輸出接口進(jìn)行合作。在這種合作模式下,無論采用多么抽象的設(shè)計(jì)與編程技術(shù),耦合都不可能得到徹底的去除。原因是在這種模式中,耦合存在于編程或設(shè)計(jì)的范式本身。要想去掉耦合,就必須連范式一起去掉。而這顯然是不可能的。也就是說,在軟件開發(fā)中,只要采用了面向過程的技術(shù)系統(tǒng)就必然是一個(gè)緊耦合的系統(tǒng)。這樣的結(jié)果,其本身是由面向過程系統(tǒng)的功利性決定的。而面向?qū)ο蟮南到y(tǒng)正是通過從根本上推翻了軟件的功利性從而建立了一種低耦合的模型。正如民主國(guó)家從根本上將個(gè)人利益擺在國(guó)家利益的前面一樣,它是一種根本上的思維轉(zhuǎn)變:與集權(quán)制相比,民主制通過放棄短期的國(guó)家利益而使得國(guó)家的真正組成部分---民眾可以從中長(zhǎng)期受益。而民眾就是國(guó)家,民眾受益了自然也就是國(guó)家受益了。然后通過這種方式實(shí)現(xiàn)了“國(guó)家”利益。與此類似,面向?qū)ο髣t是通過從根本上修改了對(duì)“軟件”的定義來達(dá)到重新定義軟件的目的的:軟件不是為了完成某個(gè)目標(biāo)而構(gòu)建的實(shí)體,它跟目標(biāo)沒有任何關(guān)系。它只是用來指代一大堆對(duì)象也即主體的名詞而已。存在的不是軟件本身,而是對(duì)象。正如民主思想中的“國(guó)家即人民”的構(gòu)建思想一樣,在面向?qū)ο蟮能浖_發(fā)范式中,軟件即對(duì)象。軟件存在是因?yàn)閷?duì)象存在。而“對(duì)象存在”則是這個(gè)邏輯的終點(diǎn):對(duì)象存在是因?yàn)閷?duì)象存在。面向?qū)ο蟛]有任何最終的構(gòu)建理論,因?yàn)樗鼪]有目標(biāo)。一個(gè)最終構(gòu)建出來的系統(tǒng)它要么不能工作,要么能工作。如果不能工作則持續(xù)改進(jìn),直到其可以工作。這樣的工作模式,聽起來怎么很象我們平常的工作模式。的確,我們平常的工作正是這樣的。對(duì)于研發(fā)工作,我有個(gè)理論那就是我們所對(duì)付的就是未知。因?yàn)槿绻湟呀?jīng)是已知的,為什么還會(huì)需要這么多的程序員呢。程序員的大部分時(shí)間都是用在對(duì)付未知上面了。而對(duì)付未知,唯一的辦法其實(shí)就是時(shí)間。事實(shí)上,人+時(shí)間,本身也是軟件業(yè)用來衡量開發(fā)成本的一種度量。所以說這樣的工作模式雖然聽起來好象很平常,但實(shí)際上它卻是人類工作模式在計(jì)算機(jī)中的一種映射。這說明,使用這種模式,在某個(gè)程度上,電腦其實(shí)已經(jīng)開始以人的模式進(jìn)行工作。,,
的確,聽上去很平常的東西往往并不平常。
而相對(duì)于面向?qū)ο?#xff0c;一個(gè)面向過程的系統(tǒng)也許能從一開始就能對(duì)系統(tǒng)進(jìn)行精確的定義與分解,但越準(zhǔn)確的系統(tǒng)其應(yīng)變能力越差。也就是說,其可進(jìn)化性越差。。。這樣的結(jié)果在西方哲學(xué)可能很難解釋,但是在東方哲學(xué)中卻早就解決了(老子:福兮,禍之所伏;禍兮,福之所倚)。所以對(duì)我們沒有任何理解上的困難。
面向?qū)ο笠驗(yàn)椴粚?duì)系統(tǒng)作功能劃分,所以自然就沒有了在面向過程范式中引起了高耦合性的接口的概念。或者說,至少,接口在這里不再是一級(jí)成員。這樣的分析結(jié)果是又一個(gè)讓我吃驚的地方,因?yàn)楹芏嗝嫦驅(qū)ο蟮奈恼露颊J(rèn)為OO是面向接口的。這難免引起新的沖突:必須解決掉面向?qū)ο笈c面向接口的統(tǒng)一性問題。因?yàn)橄到y(tǒng)中顯然將同時(shí)存在對(duì)象與接口,如果不能在理論上將兩者統(tǒng)一,那么系統(tǒng)當(dāng)然是存在問題的。。。這里暫時(shí)堅(jiān)持接口是二級(jí)成員的觀點(diǎn)。
接上。既然沒有了接口,也就沒有了輸入輸出(出現(xiàn)在一級(jí)成員中)。而在一個(gè)沒有輸入輸出的系統(tǒng)中,自然也就沒有了解耦的問題(與此恰好相反,面向?qū)ο笞畲蟮膯栴}非但不是解耦,而是正好相反的。即如何把那些原本就是分開設(shè)計(jì)的對(duì)象給“耦合”起來?)。因?yàn)閷?duì)象們?cè)谠O(shè)計(jì)時(shí)就不是在假想它們將一起工作的基礎(chǔ)上設(shè)計(jì)的。
這就是面向?qū)ο笞睢皞ゴ蟆钡牡胤健?/span>
它在解決一個(gè)問題(即解耦)的同時(shí)創(chuàng)造了恰好相反的另外一個(gè)問題。或者說,它通過創(chuàng)造一個(gè)與原來問題正好相反的問題解決了一個(gè)問題。。。。。。通過創(chuàng)造問題的方式來解決問題,這難道不是人類智慧的最佳體現(xiàn)嗎?
(NOTE:輸入輸出VS林立的對(duì)象)
只有一個(gè)對(duì)象的系統(tǒng)一定不是面向?qū)ο蟮南到y(tǒng)。比如,一支軍隊(duì),一個(gè)公司,這些都是面向過程的系統(tǒng):系統(tǒng)中的任何或每一個(gè)部分,都只為了一個(gè)目的而生。因?yàn)檫@些系統(tǒng)它們本來就只有一個(gè)目標(biāo)。面向過程的系統(tǒng)是面向目標(biāo)的系統(tǒng)。實(shí)際上,面向?qū)ο笤诔跗谝灿猩偕俚拿嫦蚰繕?biāo)的特征。這就是為什么很多介紹面向?qū)ο蟮奈恼伦x完沒有任何感覺的原因:它們并沒有把面向?qū)ο螽?dāng)成一種軟件開發(fā)模式的根本改變來論述。它們只是把面向?qū)ο笞鳛榱硪环N實(shí)現(xiàn)軟件目標(biāo)的系統(tǒng)。
我認(rèn)為事實(shí)并不是那樣。因?yàn)槲野衙嫦驅(qū)ο螽?dāng)成一種多主體系統(tǒng)。既然是面向?qū)ο?#xff0c;那么肯定是以對(duì)象的思維進(jìn)行建模。這么做的一個(gè)肯定結(jié)果是,系統(tǒng)將存在多個(gè)對(duì)象。而對(duì)象即主體。所以面向?qū)ο笃鋵?shí)就是多主體系統(tǒng)。
什么是多主體系統(tǒng)?主體的意思是,它獨(dú)立于任何其它事物。它并不附屬于任何事物。其實(shí)從哲學(xué)的角度考慮,主體,個(gè)體,都只是人類概念,它們并不是客觀存在的事物。但是思維或語言的意義本來就只在于它是我們的一種工具。思維力與行動(dòng)力一樣,只是人類的工具。
既然它是工具,那么我就應(yīng)該使用它。我并不同意工具或?qū)嵱弥髁x哲學(xué),但在現(xiàn)在的語境下,我只能把它當(dāng)成工具來使用一次。
多主體意味著思維上的根本改變。這個(gè)改變就是,當(dāng)在考慮如何構(gòu)建一個(gè)系統(tǒng)時(shí)并不以構(gòu)建一個(gè)系統(tǒng)為目標(biāo)。或者說,有些任務(wù)本身就是沒有目標(biāo)的系統(tǒng)(比如,我只是想看看這么做以后到底會(huì)發(fā)生什么。我的目標(biāo)就是這個(gè)程序本身份---在這種情況下,系統(tǒng)以自身為目標(biāo),所以可以被視為沒有目標(biāo)),取而代之的是,我的目標(biāo)是建立一個(gè)存在諸多主體的系統(tǒng)。這里的主體,有兩層含義:
1,面向過程的系統(tǒng)實(shí)際上是沒有主體的。也就是說,當(dāng)在構(gòu)建一個(gè)面向過程的系統(tǒng)時(shí),構(gòu)建者即是主語。系統(tǒng)所做的任何事情是謂語。系統(tǒng)本身并不完整。因?yàn)槠淙狈χ髡Z。系統(tǒng)所完成的任何工作,只能被視為由構(gòu)建者完成的。因?yàn)樵谶@樣的系統(tǒng)中,系統(tǒng)的全部工作其目標(biāo)就是為了完成設(shè)計(jì)者的目標(biāo)。根據(jù)系統(tǒng)所處的位置,規(guī)劃者從構(gòu)建過程的最開始就已經(jīng)決定了系統(tǒng)的目標(biāo)。也就是說,在這樣的系統(tǒng)中,系統(tǒng)為構(gòu)建者工作。因?yàn)橄到y(tǒng)中不存在任何主語。這樣的系統(tǒng)在完工以后,一旦存在任何改變,都會(huì)要求對(duì)系統(tǒng)的更改。因?yàn)橄到y(tǒng)沒有主語,自適應(yīng)等等所有的工作都無法,至少在正常的語義上,無法完成。相反,在面向?qū)ο蟮南到y(tǒng)中,因?yàn)橐呀?jīng)將主語從系統(tǒng)設(shè)計(jì)者的腦中移到系統(tǒng)中,系統(tǒng)顯然一方面在邏輯上更完備(因?yàn)樗邢到y(tǒng)設(shè)計(jì)者腦中存在的概念已經(jīng)被原封不動(dòng)地轉(zhuǎn)移或被實(shí)現(xiàn)到系統(tǒng)中),另一方面則因?yàn)橹髡Z的存在將具有更強(qiáng)的環(huán)境或變化適應(yīng)力(因?yàn)樵瓉淼臒o主語系統(tǒng)其工作模式是:如果改變發(fā)生,那么我將改變某個(gè)模塊。所以這個(gè)設(shè)計(jì)是良好的!?但是有主語系統(tǒng)的工作模式是:主謂系統(tǒng)本身將解決大部分的應(yīng)變與魯棒性問題(因?yàn)橹髦^系統(tǒng)是一種更完備的邏輯形式------證據(jù)就是人類本身的應(yīng)變能力));
2,稱其為主體,是因?yàn)槠洳⒉粸槠渌鼘?duì)象存在。它甚至并不為系統(tǒng)而存在。它存在于系統(tǒng)中,是因?yàn)樗嬖谟诳陀^世界中(由此也可見,面向?qū)ο笤O(shè)計(jì)的根據(jù)是模擬客觀世界的解決方案,而不是提出自己的解決方案------也即在設(shè)計(jì)以前,我并不知道問題是怎么解決的。我也沒有問題到底應(yīng)該怎么解決的任何想法或前提。我使用它,是因?yàn)樵诂F(xiàn)實(shí)世界中,類似的東西解決了問題------這個(gè)跟神經(jīng)網(wǎng)絡(luò)的工作邏輯其實(shí)差不多:神經(jīng)網(wǎng)絡(luò)并不知道問題到底是怎么解決的,也就是說,它對(duì)于解決問題并沒有任何理論------從這一點(diǎn)上,也可以很容易看出面向?qū)ο笈c面向過程的區(qū)別:面向過程的步驟化,其實(shí)就是一種邏輯化方案:它將問題劃分成多個(gè)子問題,然后逐個(gè)解決。當(dāng)所有子問題都解決以后,(總)問題自然就解決了。這是一種典型的邏輯化思路------但現(xiàn)實(shí)世界并不總是邏輯的。日常生活中就存在很多邏輯束手無策的領(lǐng)域,如音樂、美術(shù)。在構(gòu)建這樣的系統(tǒng)時(shí),只有一種辦法,就是主體建模。不過這樣的結(jié)論并不影響將面向?qū)ο髴?yīng)用到可以或已經(jīng)邏輯化的領(lǐng)域,因?yàn)榍懊嬷v過,面向?qū)ο笾皇且环N方案。所以在遇到可以同時(shí)使用邏輯化與非邏輯化處理兩種方案時(shí)但非邏輯化方案顯然優(yōu)于邏輯化方案時(shí),顯然它應(yīng)該被優(yōu)先采用)。它具有獨(dú)立的存在權(quán)。也就是說,在真正的面向?qū)ο笤O(shè)計(jì)階段,考慮的并不是如何完成任務(wù),而是主體"是"什么。因?yàn)槊嫦驅(qū)ο蟮南到y(tǒng)并不是目標(biāo)導(dǎo)向的系統(tǒng)。它是面向主體建模的系統(tǒng)。它的目標(biāo)永遠(yuǎn)都只有一個(gè):形式化真實(shí)的物理世界。并且這里還要注意的是,被形式化的對(duì)象只能是物理對(duì)象。因?yàn)榍拔挠懻撨^,人類思維中的概念有很多種,對(duì)象只能概括其中的一小部分。很多其它概念如幸福,科學(xué),或痛苦等等,這些跟對(duì)象都沒有任何關(guān)系。但是對(duì)象對(duì)于描述真實(shí)的物理對(duì)象本身即唯物主義中的真正的思維對(duì)象卻是足夠的。因?yàn)樗械奈锢韺?duì)象都是對(duì)象。事實(shí)上,object這個(gè)詞本身就帶有很重的唯物主義味道。它的語義在很大程度上其實(shí)依賴于對(duì)外部世界其客觀性的承認(rèn)或者說唯物主義的意識(shí)形態(tài)。
面向?qū)ο髲拿嫦蛑黧w建模中得到的最大好處是:真實(shí)世界的主體,它擁有應(yīng)變能力。這種應(yīng)變能力,幾乎等同于設(shè)計(jì)師或程序員本身的應(yīng)變能力。比如,如果需求的確發(fā)生變更,那么設(shè)計(jì)師將會(huì)對(duì)程序進(jìn)行修改。
?
不面向目標(biāo)的另一個(gè)好處是, 系統(tǒng)變成一個(gè)更穩(wěn)定的松耦合系統(tǒng). 這一點(diǎn)也可以從軍隊(duì)或公司系統(tǒng)的結(jié)構(gòu)看出來. 所有軍隊(duì)或公司都是緊耦合系統(tǒng).? 因?yàn)樵诠净蜍婈?duì)的內(nèi)部, 所有職能單位的存在都具有非常明確的目標(biāo)性. 而面向?qū)ο髣t因?yàn)檫壿嫴煌援a(chǎn)生了一種完全不同的效果: 對(duì)象之所以存在是因?yàn)閷?duì)象它存在. 對(duì)象不因?yàn)槿魏蝿e的事物而存在. 至于目標(biāo)是怎么完成的, 它并不知道. 這個(gè)答案必須從真實(shí)世界中去尋找. 系統(tǒng)本身不回答這樣的問題, 也不研究這樣的問題. 系統(tǒng)本身只做一件事情, 那就是照搬現(xiàn)實(shí)世界的案例. 照搬現(xiàn)實(shí)當(dāng)然不可能總是最好的方案, 但它卻是一個(gè)最靈活的方案. 也更(完整地. 因?yàn)槊嫦蜻^程顯然也不是什么其它生物的思維模式. 它也是人類的一種思維模式. 只不過這種方式相對(duì)面向?qū)ο? 所能承載的東西更少而已0000-0--比如, 它沒有主語?)符合人類的思維模式.? 使用面向過程的思路可能構(gòu)建出非常好的方案, 但是這樣的方案不管是對(duì)當(dāng)前目標(biāo)的耦合性還是自身內(nèi)部的耦合性也非常高. 這是造成軟件進(jìn)化困難的根本原因. 因?yàn)檐浖M(jìn)化與自然進(jìn)化在本質(zhì)上其實(shí)是一樣的, 都是一種環(huán)境適應(yīng)能力. 環(huán)境適應(yīng)性需要經(jīng)歷長(zhǎng)期的優(yōu)勝劣汰得到, 如果軟件開發(fā)者一直陷在解耦的泥潭中不得解放, 如何能把心思放到對(duì)軟件進(jìn)化的研究中來呢?
在面向過程的系統(tǒng)中, 每一個(gè)過程都只不過是系統(tǒng)的一個(gè)螺絲釘. 也就是說, 面向過程系統(tǒng)中的組成單元除了職能性, 不具有任何其它屬性. 但在面向?qū)ο蟮南到y(tǒng)中, 其組成單元對(duì)象因?yàn)槭且粋€(gè)獨(dú)立存在的個(gè)體, 所以可以擁有任何屬性. 也正是這些屬性構(gòu)成了對(duì)象的獨(dú)立性.
說面向?qū)ο蟮南到y(tǒng)是自頂向下的或自底向上的都不對(duì),因?yàn)槊嫦驅(qū)ο蟮南到y(tǒng)不是一個(gè)面向目標(biāo)的功能分解系統(tǒng)。它是一個(gè)主體系統(tǒng)。它不是通過直接考慮職能來實(shí)現(xiàn)系統(tǒng)的。它的思路是,在更高的層次即主語層次而不是主語的職能屬性上來考慮問題。它所考慮的唯一對(duì)象就是“對(duì)象”。而在一個(gè)對(duì)象系統(tǒng)中,所有的對(duì)象都是客觀存在物,其本身并不存在相互的附屬性。所謂的相互附屬或依賴性,都不在對(duì)象的討論范圍內(nèi)。因?yàn)镺bject意味著客觀物理存在,而相互附屬或依賴性這些東西都不是objective的,它們?nèi)莝ubjective即主觀的概念。面向?qū)ο笃鋵?shí)本身意味最大的就是從主觀向客觀的轉(zhuǎn)移。也就是說在使用面向?qū)ο蟮乃季S構(gòu)建系統(tǒng)時(shí),并不考慮對(duì)這個(gè)系統(tǒng)的評(píng)價(jià)或任何其它主觀因素如職能,因?yàn)樗鼈兌际侵饔^的。取而代之的是一種客觀思維,即一種描述性思維,其思維重點(diǎn)是對(duì)象本身到底是怎么樣的,而不是對(duì)象好不好。這是面向?qū)ο笈c面向過程的最大區(qū)別:面向過程是在一種主觀思維環(huán)境下進(jìn)行的,而面向?qū)ο髣t是在一種完全客觀的思維環(huán)境下進(jìn)行的。在這種思維環(huán)境下,我并不評(píng)價(jià)我所構(gòu)建單元的優(yōu)劣,我所做的一切即描述系統(tǒng)的描述對(duì)象。一旦我完成了描述整個(gè)系統(tǒng),我也就完成了系統(tǒng)的構(gòu)建。
所以可以說,在使用面向?qū)ο蟮乃季S進(jìn)行系統(tǒng)分析或設(shè)計(jì)時(shí),相比于面向過程的功利性構(gòu)建它更象一個(gè)藝術(shù)思維與創(chuàng)作過程。藝術(shù)當(dāng)然也可以功利(就如其實(shí)面向?qū)ο蟮淖罱K目的當(dāng)然也是功利的),但其過程卻是不功利的。而且也只有通過一個(gè)不功利的過程才可能創(chuàng)作出真正好的藝術(shù)。這就是為什么藝術(shù)總是強(qiáng)調(diào)原創(chuàng)的原因,因?yàn)橹挥性瓌?chuàng)者,才能進(jìn)行真正的非功利創(chuàng)作。原因是,只有原創(chuàng)者才能或最完整地描述自己的描述對(duì)象,或者說,甚至是“知道”自己的描述對(duì)象。這也是為什么面向?qū)ο蟮姆治龉ぷ饕髮?duì)領(lǐng)域的深入分析的原因(相反地,面向過程則不需要這么做------面向過程的思路是,別跟我說你們是怎么工作的,請(qǐng)告訴我你想讓系統(tǒng)完成什么------這也是傳統(tǒng)的需求分析為什么喜歡追根問底的原因,,這種分析模式往往在需求分析階段把客戶逼向絕境,然后在產(chǎn)品驗(yàn)收階段又被客戶逼向絕境。這樣當(dāng)然不好)而面向過程的分析可以在完全不了解領(lǐng)域?qū)ο蟮那闆r下完成的原因:面向過程的關(guān)注點(diǎn)只有一個(gè),那就是“功能”。功能是一個(gè)外部概念,所以面向過程設(shè)計(jì)出來的東西全部都是內(nèi)外高度耦合的系統(tǒng)。這樣的系統(tǒng),怎么可能擁有應(yīng)變的能力?它也許可以在構(gòu)建期縮減不少的企業(yè)成本(這可能就是它流行的原因------快速實(shí)現(xiàn)或?qū)嵤╋@然意味著更低的開發(fā)期成本),但卻幾乎不具有任何應(yīng)變或進(jìn)化能力。這有點(diǎn)象請(qǐng)求-線程的多任務(wù)處理模型,它們都因?yàn)樘┯菜允チ藦椥浴T谙到y(tǒng)設(shè)計(jì)中進(jìn)行內(nèi)外分離很重要---首先,它帶來了設(shè)計(jì)上的自由性這給了系統(tǒng)很大的可“能”性。其實(shí)面向接口的思想只是這種思想在編碼設(shè)計(jì)工作中的一種應(yīng)用。因?yàn)檫@種思想其實(shí)在很多地方都有應(yīng)用,即使人們并沒有意識(shí)到它的存在;其次它更安全,并且在系統(tǒng)發(fā)生變更時(shí)帶給系統(tǒng)原有元素更好的可復(fù)用性---內(nèi)部元素不直接對(duì)應(yīng)外部元素的一個(gè)好處是,它不需要隨外部元素的改變而改變。因?yàn)樗鼜脑O(shè)計(jì)一開始就并不依賴于外部元素而存在。
注: 本文所指對(duì)象, 非數(shù)據(jù)對(duì)象, 也非職能對(duì)象, 指的是作為系統(tǒng)組成單元的對(duì)象. 它在概念上其實(shí)有點(diǎn)象"人". 比如, 不管是好人還是壞人他都必須首先是自由的, 然后才可能是人. 一個(gè)對(duì)象也必須首先是自由且獨(dú)立的, ?然后才可能是一個(gè)對(duì)象.??不自由的不是對(duì)象, 附庸品不是對(duì)象(它是屬性或者, 過程(在面向過程的開發(fā)模式中)), 只有在真正具有了獨(dú)立存在的能力以后, 它才算得上是一個(gè)真正的對(duì)象. 實(shí)際上生活中的對(duì)象正是如此, 比如一塊石頭, 它就是獨(dú)立的,一滴水也是獨(dú)立的。
我討論面向?qū)ο蟮膭?dòng)機(jī)有兩個(gè):一是當(dāng)前的設(shè)計(jì)任務(wù),一是長(zhǎng)期的軟件進(jìn)化。可以看出這是一種將論域按時(shí)間進(jìn)行劃分的邏輯方法:即按現(xiàn)在的系統(tǒng)特性和以后的系統(tǒng)特性來進(jìn)行劃分。我以客觀的眼光或方法來構(gòu)建系統(tǒng)的結(jié)果并不影響我以主觀的眼光對(duì)它進(jìn)行評(píng)判。那么,我現(xiàn)在就要進(jìn)行我的評(píng)判。
通常,系統(tǒng)的當(dāng)前特性包括可理解性,性能,正確性,環(huán)境友好性,用戶友好性(這兩者好象已經(jīng)屬于政治問題了,,但是,難道政治真的不重要嗎),健壯性等等。系統(tǒng)的未來特性則包括可擴(kuò)展性,靈活性,可伸縮性,可進(jìn)化性。
面向?qū)ο髮?duì)正確性,環(huán)境友好性,健壯性好象沒什么太大的幫助(這可能就是它為什么事實(shí)上從來沒有真正流行過的原因---至少在國(guó)內(nèi),我觀察的結(jié)果是這樣的---因?yàn)閲?guó)內(nèi)的軟件構(gòu)建水平就只在當(dāng)前特性,甚至很多連當(dāng)前特性也不考慮),它的主要幫助集中在未來特性。因?yàn)槊嫦蜻^程同樣可以得到很好的短時(shí)正確性或健壯性。事實(shí)上,一個(gè)經(jīng)過良好設(shè)計(jì)與測(cè)試的過程系統(tǒng)一樣可以得到非常好的健壯性。但是可理解性在過程系統(tǒng)中永遠(yuǎn)是個(gè)問題。因?yàn)樗鼪]有主語。理解這樣的系統(tǒng)需要大量的大腦周期,因?yàn)樗鼪]有主語所以理解者必須在大腦中建立“假設(shè)”的主語,然后才能對(duì)它進(jìn)行邏輯思考。也就是說,這樣的系統(tǒng)在邏輯上是不完整的,在邏輯上是一個(gè)沒有完成的系統(tǒng)。這種不完全的形式化表達(dá),不適合于應(yīng)用開發(fā)。當(dāng)它處于系統(tǒng)底層時(shí),也許反而工作得更好,但一旦進(jìn)入真正的邏輯環(huán)境,它的缺點(diǎn)便暴露無遺。這可能正是面向?qū)ο蟮呐d起時(shí)間跟軟件商用的大量興起時(shí)間很相近的原因。因?yàn)檫壿嬐暾允菓?yīng)用層的問題而不是系統(tǒng)層的問題。系統(tǒng)層因?yàn)楦叨鹊膹?fù)用它考慮更多的當(dāng)然不是其可理解性,而是應(yīng)用支撐的能力。
自治-->進(jìn)化
轉(zhuǎn)載于:https://my.oschina.net/digerl/blog/33810
總結(jié)
以上是生活随笔為你收集整理的面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息队列的使用
- 下一篇: MusicXML 3.0 (15) -