日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...

發布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

關于面向對象的文章,100篇里面有99篇要么離譜太遠,要么不知所云,但剩下有1篇是好的。我歷經多年找不到那一篇,最終還是決定自己研究(因為工作環境的原因,我的研究大多集中在性能與正確性這些東西上面,對進化的思考一直都很少,也一直都沒有找到這方面的資料---它們真的很難找)。

面向對象很重要。在今天的軟件業界,它基本上是一切的基礎。比如設計模式,領域建模,甚至對框架的學習與研究和數據庫,一切都宣稱是面向對象的。要搞清楚它們是否真是面向對象的,就必須先搞清楚什么是面向對象。

因為這個詞被濫用得太厲害了。我讀過的有很多一看就知道是大家所著的諶稱專業級的文章一樣在上面犯下非常嚴重的錯誤(這個其實沒有看上去那么奇怪。因為,一旦來到哲學的層面,犯錯誤是很正常的,不犯錯誤的才是不正常)。

實現一個系統很容易,難的是實現一個好系統。任何程序員都懂得怎么實現一個系統,但系統到底怎么樣就要看各人的功底了。

要討論面向對象,我想先從哲學入手會好一點。哲學史上有一種思想叫解構主義。而面向對象其實就是對面向過程思想的解構。解構很困難,因為它需要從根本上改變思維的方法。比如,要一個人從唯物論轉向唯心論很困難,反之同樣。原因就在于哲學所涉及的都是非常深層的概念,而這些東西都是在潛移默化中長年累月積累形成的東西,要改變它們當然不容易。從解構主義的角度理解,就是要在人腦中重新構建整個軟件概念系統,以一種完全不同的思維方式進行思維。在這種思維方式中,系統不再為功能存在,系充單元也不再只具有功能性,而是具有獨立個體特征與生存權的單元。系統在整體上再也不只是個功能復合體,而是由一個個具有生動個體特征的對象組成。系統能力的提供不再是人為規劃的結果,而是由系統中的對象間接提供的。也就是說,面向對象的開發方法用對象的開發取代了直接的功能開發。功能不再是設計時的首要考量,只是系統恰好具有的一種能力。系統在本質上或至少在設計思路上,跟功能是沒有關系的。這有點象中央集權的政體與民主政體的區別:中央集權的政體是具有高度目標一致性的政體,民主政體則完全顛覆了這種邏輯:個體不再為整體存在;國家也不再有由功能或職能單位組成,而是由鮮活的個體組成。國家存在是因為個體存在。個體優先于國家,這是民主政體的邏輯。這種邏輯比起高度目標化的中央集權政體更符合實際的現實情況,因為它承認個體(which is existing)的存在。承認存在物的存在還有一個好處就是它更穩定。因為不管國這怎么變,個體作為一個概念是不變的。變化的只不過是游戲規則而已。但是這樣的規則在目標化的系統中只能通過硬編碼的方式實現,因為目標化系統不存在主語,這樣的形式系統表達能力其實非常有限。它只能通過對謂語的約束實現一種扭曲的,難以理解的邏輯。這一方面造成艱難的可理解性,另一方面因為低可理解性變成錯誤的源泉。因為它是一種要么以設計者要么以少數幾個隨意假想的無形式主語(只存在于設計者的大腦中)為主語的系統,不是一種更直接更容易理解與接受的領域模型。也就是說,因為主語的缺乏,這樣的系統實際上最好都變成了一種雙邏輯系統:用戶邏輯與開發者邏輯。兩種邏輯同時存在的結果是,需要有人不斷地在實現翻譯或者說概念映射操作。這也是面向過程的系統可維護性更差的原因:翻譯官一走,就沒有人看得懂系統了。

理解這一點也不是很容易,因為它涉及到形式系統理論甚至程序語義學:計算機程序只是一種形式系統,對它的理解過程實際上是一個語義賦值的過程。當一個形式系統在結構即語法上更加通俗化時,它的可理解性更好。相反,如果它使用了一些很難理解的結構,那么顯然理解群體就要小得多,甚至可能一個也沒有。但是過程化系統極大地鼓勵在開發過程中使用一些個性化的形式,因為它是目標導向的系統,實現方式就無所謂了。一個過程系統設計者可以使用任何他喜歡的邏輯劃分方式,只要他能夠完成即定的任務:可理解性就是在從這里開始丟失的。在形式系統中鼓勵個性化顯然是個極大的錯誤。但是面向對象系統因為強調面向領域建模一下子將程序員的飛馬行空式的想象縮窄到非常小的一個范圍:目標領域,而提供了極大的可理解性。因為領域模型本來就是領域內人士用來溝通的“行語”,它本來就是一種溝通界面。它的形式系統的理解人群數量顯然比個性化形式系統的理解人群大得多。

面向對象與面向過程系統最大的不同是:面向過程的系統由過程組成,而面向對象的系統由對象組成。過程的邏輯是輸入輸出,是嚴格定義的系統模塊。模塊間則通過輸入輸出接口進行合作。在這種合作模式下,無論采用多么抽象的設計與編程技術,耦合都不可能得到徹底的去除。原因是在這種模式中,耦合存在于編程或設計的范式本身。要想去掉耦合,就必須連范式一起去掉。而這顯然是不可能的。也就是說,在軟件開發中,只要采用了面向過程的技術系統就必然是一個緊耦合的系統。這樣的結果,其本身是由面向過程系統的功利性決定的而面向對象的系統正是通過從根本上推翻了軟件的功利性從而建立了一種低耦合的模型。正如民主國家從根本上將個人利益擺在國家利益的前面一樣,它是一種根本上的思維轉變:與集權制相比,民主制通過放棄短期的國家利益而使得國家的真正組成部分---民眾可以從中長期受益。而民眾就是國家,民眾受益了自然也就是國家受益了。然后通過這種方式實現了“國家”利益。與此類似,面向對象則是通過從根本上修改了對“軟件”的定義來達到重新定義軟件的目的的:軟件不是為了完成某個目標而構建的實體,它跟目標沒有任何關系。它只是用來指代一大堆對象也即主體的名詞而已。存在的不是軟件本身,而是對象。正如民主思想中的“國家即人民”的構建思想一樣,在面向對象的軟件開發范式中,軟件即對象。軟件存在是因為對象存在。而“對象存在”則是這個邏輯的終點:對象存在是因為對象存在。面向對象并沒有任何最終的構建理論,因為它沒有目標。一個最終構建出來的系統它要么不能工作,要么能工作。如果不能工作則持續改進,直到其可以工作。這樣的工作模式,聽起來怎么很象我們平常的工作模式。的確,我們平常的工作正是這樣的。對于研發工作,我有個理論那就是我們所對付的就是未知。因為如果其已經是已知的,為什么還會需要這么多的程序員呢。程序員的大部分時間都是用在對付未知上面了。而對付未知,唯一的辦法其實就是時間。事實上,人+時間,本身也是軟件業用來衡量開發成本的一種度量。所以說這樣的工作模式雖然聽起來好象很平常,但實際上它卻是人類工作模式在計算機中的一種映射。這說明,使用這種模式,在某個程度上,電腦其實已經開始以人的模式進行工作。,,

的確,聽上去很平常的東西往往并不平常。

而相對于面向對象,一個面向過程的系統也許能從一開始就能對系統進行精確的定義與分解,但越準確的系統其應變能力越差。也就是說,其可進化性越差。。。這樣的結果在西方哲學可能很難解釋,但是在東方哲學中卻早就解決了(老子:福兮,禍之所伏;禍兮,福之所倚)。所以對我們沒有任何理解上的困難。

面向對象因為不對系統作功能劃分,所以自然就沒有了在面向過程范式中引起了高耦合性的接口的概念。或者說,至少,接口在這里不再是一級成員。這樣的分析結果是又一個讓我吃驚的地方,因為很多面向對象的文章都認為OO是面向接口的。這難免引起新的沖突:必須解決掉面向對象與面向接口的統一性問題。因為系統中顯然將同時存在對象與接口,如果不能在理論上將兩者統一,那么系統當然是存在問題的。。。這里暫時堅持接口是二級成員的觀點。

接上。既然沒有了接口,也就沒有了輸入輸出(出現在一級成員中)。而在一個沒有輸入輸出的系統中,自然也就沒有了解耦的問題(與此恰好相反,面向對象最大的問題非但不是解耦,而是正好相反的。即如何把那些原本就是分開設計的對象給“耦合起來)。因為對象們在設計時就不是在假想它們將一起工作的基礎上設計的。

是面向對象最“偉大”的地方。

它在解決一個問題(即解耦)的同時創造了恰好相反的另外一個問題。或者說,它通過創造一個與原來問題正好相反的問題解決了一個問題。。。。。。通過創造問題的方式來解決問題,這難道不是人類智慧的最佳體現嗎?

(NOTE:輸入輸出VS林立的對象)

只有一個對象的系統一定不是面向對象的系統。比如,一支軍隊,一個公司,這些都是面向過程的系統:系統中的任何或每一個部分,都只為了一個目的而生。因為這些系統它們本來就只有一個目標。面向過程的系統是面向目標的系統。實際上,面向對象在初期也有少少的面向目標的特征。這就是為什么很多介紹面向對象的文章讀完沒有任何感覺的原因:它們并沒有把面向對象當成一種軟件開發模式的根本改變來論述。它們只是把面向對象作為另一種實現軟件目標的系統。

我認為事實并不是那樣。因為我把面向對象當成一種多主體系統。既然是面向對象,那么肯定是以對象的思維進行建模。這么做的一個肯定結果是,系統將存在多個對象。而對象即主體。所以面向對象其實就是多主體系統。

什么是多主體系統?主體的意思是,它獨立于任何其它事物。它并不附屬于任何事物。其實從哲學的角度考慮,主體,個體,都只是人類概念,它們并不是客觀存在的事物。但是思維或語言的意義本來就只在于它是我們的一種工具。思維力與行動力一樣,只是人類的工具。

既然它是工具,那么我就應該使用它。我并不同意工具或實用主義哲學,但在現在的語境下,我只能把它當成工具來使用一次。

多主體意味著思維上的根本改變。這個改變就是,當在考慮如何構建一個系統時并不以構建一個系統為目標。或者說,有些任務本身就是沒有目標的系統(比如,我只是想看看這么做以后到底會發生什么。我的目標就是這個程序本身份---在這種情況下,系統以自身為目標,所以可以被視為沒有目標),取而代之的是,我的目標是建立一個存在諸多主體的系統。這里的主體,有兩層含義:

1,面向過程的系統實際上是沒有主體的。也就是說,當在構建一個面向過程的系統時,構建者即是主語。系統所做的任何事情是謂語。系統本身并不完整。因為其缺乏主語。系統所完成的任何工作,只能被視為由構建者完成的。因為在這樣的系統中,系統的全部工作其目標就是為了完成設計者的目標。根據系統所處的位置,規劃者從構建過程的最開始就已經決定了系統的目標。也就是說,在這樣的系統中,系統為構建者工作。因為系統中不存在任何主語。這樣的系統在完工以后,一旦存在任何改變,都會要求對系統的更改。因為系統沒有主語,自適應等等所有的工作都無法,至少在正常的語義上,無法完成。相反,在面向對象的系統中,因為已經將主語從系統設計者的腦中移到系統中,系統顯然一方面在邏輯上更完備(因為所有系統設計者腦中存在的概念已經被原封不動地轉移或被實現到系統中),另一方面則因為主語的存在將具有更強的環境或變化適應力(因為原來的無主語系統其工作模式是:如果改變發生,那么我將改變某個模塊。所以這個設計是良好的!?但是有主語系統的工作模式是:主謂系統本身將解決大部分的應變與魯棒性問題(因為主謂系統是一種更完備的邏輯形式------證據就是人類本身的應變能力));

2,稱其為主體,是因為其并不為其它對象存在。它甚至并不為系統而存在。它存在于系統中,是因為它存在于客觀世界中(由此也可見,面向對象設計的根據是模擬客觀世界的解決方案,而不是提出自己的解決方案------也即在設計以前,我并不知道問題是怎么解決的。我也沒有問題到底應該怎么解決的任何想法或前提。我使用它,是因為在現實世界中,類似的東西解決了問題------這個跟神經網絡的工作邏輯其實差不多:神經網絡并不知道問題到底是怎么解決的,也就是說,它對于解決問題并沒有任何理論------從這一點上,也可以很容易看出面向對象與面向過程的區別:面向過程的步驟化,其實就是一種邏輯化方案:它將問題劃分成多個子問題,然后逐個解決。當所有子問題都解決以后,(總)問題自然就解決了。這是一種典型的邏輯化思路------但現實世界并不總是邏輯的。日常生活中就存在很多邏輯束手無策的領域,如音樂、美術。在構建這樣的系統時,只有一種辦法,就是主體建模。不過這樣的結論并不影響將面向對象應用到可以或已經邏輯化的領域,因為前面講過,面向對象只是一種方案。所以在遇到可以同時使用邏輯化與非邏輯化處理兩種方案時但非邏輯化方案顯然優于邏輯化方案時,顯然它應該被優先采用)。它具有獨立的存在權。也就是說,在真正的面向對象設計階段,考慮的并不是如何完成任務,而是主體"是"什么。因為面向對象的系統并不是目標導向的系統。它是面向主體建模的系統。它的目標永遠都只有一個:形式化真實的物理世界。并且這里還要注意的是,被形式化的對象只能是物理對象。因為前文討論過,人類思維中的概念有很多種,對象只能概括其中的一小部分。很多其它概念如幸福,科學,或痛苦等等,這些跟對象都沒有任何關系。但是對象對于描述真實的物理對象本身即唯物主義中的真正的思維對象卻是足夠的。因為所有的物理對象都是對象。事實上,object這個詞本身就帶有很重的唯物主義味道。它的語義在很大程度上其實依賴于對外部世界其客觀性的承認或者說唯物主義的意識形態。

面向對象從面向主體建模中得到的最大好處是:真實世界的主體,它擁有應變能力。這種應變能力,幾乎等同于設計師或程序員本身的應變能力。比如,如果需求的確發生變更,那么設計師將會對程序進行修改。

?

不面向目標的另一個好處是, 系統變成一個更穩定的松耦合系統. 這一點也可以從軍隊或公司系統的結構看出來. 所有軍隊或公司都是緊耦合系統.? 因為在公司或軍隊的內部, 所有職能單位的存在都具有非常明確的目標性. 而面向對象則因為邏輯不同所以產生了一種完全不同的效果: 對象之所以存在是因為對象它存在. 對象不因為任何別的事物而存在. 至于目標是怎么完成的, 它并不知道. 這個答案必須從真實世界中去尋找. 系統本身不回答這樣的問題, 也不研究這樣的問題. 系統本身只做一件事情, 那就是照搬現實世界的案例. 照搬現實當然不可能總是最好的方案, 但它卻是一個最靈活的方案. 也更(完整地. 因為面向過程顯然也不是什么其它生物的思維模式. 它也是人類的一種思維模式. 只不過這種方式相對面向對象, 所能承載的東西更少而已0000-0--比如, 它沒有主語?)符合人類的思維模式.? 使用面向過程的思路可能構建出非常好的方案, 但是這樣的方案不管是對當前目標的耦合性還是自身內部的耦合性也非常高. 這是造成軟件進化困難的根本原因. 因為軟件進化與自然進化在本質上其實是一樣的, 都是一種環境適應能力. 環境適應性需要經歷長期的優勝劣汰得到, 如果軟件開發者一直陷在解耦的泥潭中不得解放, 如何能把心思放到對軟件進化的研究中來呢?

在面向過程的系統中, 每一個過程都只不過是系統的一個螺絲釘. 也就是說, 面向過程系統中的組成單元除了職能性, 不具有任何其它屬性. 但在面向對象的系統中, 其組成單元對象因為是一個獨立存在的個體, 所以可以擁有任何屬性. 也正是這些屬性構成了對象的獨立性.

說面向對象的系統是自頂向下的或自底向上的都不對,因為面向對象的系統不是一個面向目標的功能分解系統。它是一個主體系統。它不是通過直接考慮職能來實現系統的。它的思路是,在更高的層次即主語層次而不是主語的職能屬性上來考慮問題。它所考慮的唯一對象就是“對象”。而在一個對象系統中,所有的對象都是客觀存在物,其本身并不存在相互的附屬性。所謂的相互附屬或依賴性,都不在對象的討論范圍內。因為Object意味著客觀物理存在,而相互附屬或依賴性這些東西都不是objective的,它們全是subjective即主觀的概念。面向對象其實本身意味最大的就是從主觀向客觀的轉移。也就是說在使用面向對象的思維構建系統時,并不考慮對這個系統的評價或任何其它主觀因素如職能,因為它們都是主觀的。取而代之的是一種客觀思維,即一種描述性思維,其思維重點是對象本身到底是怎么樣的,而不是對象好不好。這是面向對象與面向過程的最大區別:面向過程是在一種主觀思維環境下進行的,而面向對象則是在一種完全客觀的思維環境下進行的。在這種思維環境下,我并不評價我所構建單元的優劣,我所做的一切即描述系統的描述對象。一旦我完成了描述整個系統,我也就完成了系統的構建。

所以可以說,在使用面向對象的思維進行系統分析或設計時,相比于面向過程的功利性構建它更象一個藝術思維與創作過程。藝術當然也可以功利(就如其實面向對象的最終目的當然也是功利的),但其過程卻是不功利的。而且也只有通過一個不功利的過程才可能創作出真正好的藝術。這就是為什么藝術總是強調原創的原因,因為只有原創者,才能進行真正的非功利創作。原因是,只有原創者才能或最完整地描述自己的描述對象,或者說,甚至是“知道”自己的描述對象。這也是為什么面向對象的分析工作要求對領域的深入分析的原因(相反地,面向過程則不需要這么做------面向過程的思路是,別跟我說你們是怎么工作的,請告訴我你想讓系統完成什么------這也是傳統的需求分析為什么喜歡追根問底的原因,,這種分析模式往往在需求分析階段把客戶逼向絕境,然后在產品驗收階段又被客戶逼向絕境。這樣當然不好)而面向過程的分析可以在完全不了解領域對象的情況下完成的原因:面向過程的關注點只有一個,那就是“功能”。功能是一個外部概念,所以面向過程設計出來的東西全部都是內外高度耦合的系統。這樣的系統,怎么可能擁有應變的能力?它也許可以在構建期縮減不少的企業成本(這可能就是它流行的原因------快速實現或實施顯然意味著更低的開發期成本),但卻幾乎不具有任何應變或進化能力。這有點象請求-線程的多任務處理模型,它們都因為太僵硬所以失去了彈性。在系統設計中進行內外分離很重要---首先,它帶來了設計上的自由性這給了系統很大的可“能”性。其實面向接口的思想只是這種思想在編碼設計工作中的一種應用。因為這種思想其實在很多地方都有應用,即使人們并沒有意識到它的存在;其次它更安全,并且在系統發生變更時帶給系統原有元素更好的可復用性---內部元素不直接對應外部元素的一個好處是,它不需要隨外部元素的改變而改變。因為它從設計一開始就并不依賴于外部元素而存在。

注: 本文所指對象, 非數據對象, 也非職能對象, 指的是作為系統組成單元的對象. 它在概念上其實有點象"人". 比如, 不管是好人還是壞人他都必須首先是自由的, 然后才可能是人. 一個對象也必須首先是自由且獨立的, ?然后才可能是一個對象.??不自由的不是對象, 附庸品不是對象(它是屬性或者, 過程(在面向過程的開發模式中)), 只有在真正具有了獨立存在的能力以后, 它才算得上是一個真正的對象. 實際上生活中的對象正是如此, 比如一塊石頭, 它就是獨立的,一滴水也是獨立的。

我討論面向對象的動機有兩個:一是當前的設計任務,一是長期的軟件進化。可以看出這是一種將論域按時間進行劃分的邏輯方法:即按現在的系統特性和以后的系統特性來進行劃分。我以客觀的眼光或方法來構建系統的結果并不影響我以主觀的眼光對它進行評判。那么,我現在就要進行我的評判。

通常,系統的當前特性包括可理解性,性能,正確性,環境友好性,用戶友好性(這兩者好象已經屬于政治問題了,,但是,難道政治真的不重要嗎),健壯性等等。系統的未來特性則包括可擴展性,靈活性,可伸縮性,可進化性。

面向對象對正確性,環境友好性,健壯性好象沒什么太大的幫助(這可能就是它為什么事實上從來沒有真正流行過的原因---至少在國內,我觀察的結果是這樣的---因為國內的軟件構建水平就只在當前特性,甚至很多連當前特性也不考慮),它的主要幫助集中在未來特性。因為面向過程同樣可以得到很好的短時正確性或健壯性。事實上,一個經過良好設計與測試的過程系統一樣可以得到非常好的健壯性。但是可理解性在過程系統中永遠是個問題。因為它沒有主語。理解這樣的系統需要大量的大腦周期,因為它沒有主語所以理解者必須在大腦中建立“假設”的主語,然后才能對它進行邏輯思考。也就是說,這樣的系統在邏輯上是不完整的,在邏輯上是一個沒有完成的系統。這種不完全的形式化表達,不適合于應用開發。當它處于系統底層時,也許反而工作得更好,但一旦進入真正的邏輯環境,它的缺點便暴露無遺。這可能正是面向對象的興起時間跟軟件商用的大量興起時間很相近的原因。因為邏輯完整性是應用層的問題而不是系統層的問題。系統層因為高度的復用它考慮更多的當然不是其可理解性,而是應用支撐的能力。

自治-->進化

轉載于:https://my.oschina.net/digerl/blog/33810

總結

以上是生活随笔為你收集整理的面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。