OO真經筆記

2022-10-11 00:51:13 字數 2689 閱讀 7463

所有內容均來自於博文:oo真經——關於物件導向的哲學體系及科學體系的**

​ 程式中存在兩種東西:資料和邏輯。資料構成了程式的本體和狀態,而邏輯作用於資料,推動程式執行。

​ 過程論:資料和邏輯是分離的、獨立的,各自形成程式世界的乙個方面(aspect)。程式世界本質是過程,資料作為過程處理物件,邏輯作為過程的形式定義,程式世界就是各個過程不斷進行的總體。

​ 物件論:資料和邏輯不是分離的,而是相互依存的。相關的資料和邏輯形成個體,這些個體叫做物件(object),世界就是由乙個個物件組成的。物件具有相對獨立性,對外提供一定的服務。所謂世界的演進,是在某個「初始作用力」作用下,物件間通過相互呼叫而完成的互動;在沒有初始作用力下,物件保持靜止。這些互動並不是完全預定義的,不一定有嚴格的因果關係,物件間互動是「偶然的」,物件間聯絡是「暫時的」。世界就是由各色物件組成,然後在初始作用力下,物件間的互動完成了世界的演進。

​ 從現實意義上講,先有物件,然後才有類。類是具體物件的抽象。通過抽象思維,作用於每個具體的物件。

​ 抽象是有層次的。物件抽象出類,類可以進一步進行抽象。類似樹狀結構。樹為單根樹,根為「本體(object)」,越往下抽象層次越低,具體化程度越高。父節點和子節點之間,屬於繼承的關係,同一父節點的兄弟節點之間屬於多型的關係。

​ 物件論中,程式執行在某乙個抽象的層次上,而不是具體在某乙個具體的物件上。

開放-關閉原則:軟體實體應該是可拓展的,但是不可修改。

​ 對於這個原則,意思是,不能將程式指定到某乙個具體的物件上,類似於不能將一句話說得太死,完全無法拓展。同時,不能改變這個程式本來的功能。

黎克特制替換原則:子型別應該可以替換掉父型別,且替換後程式執行不會發生錯誤。

​ 這個原則主要定義了繼承的原則,不能隨意進行繼承,是一種is-a的關係,是「一般和特殊」的具體體現。

耦合的幾種型別

​ 泛化耦合:由於繼承關係的存在,父類、子類之間存在了一種邏輯關聯。

​ 聚合:a物件包含在b物件中,但是一種弱的整體與部分的關係,去掉部分後,不影響整體的功能,類似「羊群和羊」之間的關係,聯絡程度較低。

​ 組合:a物件包含在b物件中,是一種嚴格意義的整體與部分的關係,去掉a,則b的功能會受到影響。類似「汽車和車輪」,聯絡程度較高。

​ 依賴:在物件論的觀點中,程式是通過物件之間的相互呼叫、相互協作完成的。如果兩個類在邏輯範圍內,存在著協作的可能,則稱兩個類是存在著依賴關係。

「高內聚,低耦合」主要針對的是依賴關係

​ 物件論看來,在程式中,從來不存在具體的類,有的只是具體的物件,而類是我們進行抽象所得到的。同時,依賴是物件間的依賴,只不過在抽象時被抽象到了類中。

低耦合:物件之間彼此互不相識,只知道對方所能提供的服。不以其他物件實體本身為互動準則,而以其他物件的行為作為互動準則,與乙個物件是否進行互動純粹是從其行為判斷,而不對物件本體有任何概念

抽象類:以物件論的觀點,抽象類和類沒有區別,都是對於具體物件的抽象,只不過抽象類是一種特殊的類,程式設計時不允許抽象類產生具體的例項。

介面: 將物件的行為進行抽象,從而抽象出介面這個概念。可以認為,類是物件的抽象,而介面是物件行為的抽象。抽象出類是為了便於分析,而抽象出介面則是為了實現低耦合。類關注於物件之間共同的特徵,而介面則關注於物件之間具體的互動。

​ 例如,司機駕駛汽車。從中可以得到出司機汽車兩個物件,抽象出駕駛工具兩個類,其中,駕駛工具實現了可駕駛這個方法,從而實現了二者的互動。但是,這樣二者之間就會存在一定的依賴關係。因此,我們抽象出乙個可駕駛的介面,從而是得這個介面脫離了具體的類,與二者無關,無論哪個類實現了這個介面,都可以實現可駕駛,從而降低了耦合。

依賴倒置原則:依賴是有方向的。上面的例子中,人是客戶類,汽車是服務類,依賴的方向是從人到汽車,因為人必須要使用汽車提供的可駕駛方法去操作汽車,但是這個不夠「松耦合」。

​ 因此,將可駕駛抽象為介面,此時,二者誰也不依賴誰,這樣二者實現了松耦合。這就是介面的意義:對客戶類保證,對服務類約束。客戶類只要知道了這個介面的存在,就知道肯定有類實現了這個介面,這就是對客戶類保證;對服務類約束,意味著服務類要實現與客戶類的互動,必須實現這個介面才可以進行互動。

​ 誰擁有定義介面的權力:若是服務類擁有介面,意味著每個服務類都會定義自己的介面,而這些介面一般情況下不會相容,對於客戶類來說,依賴方向依舊是從客戶類到服務類。若是客戶類擁有介面,服務類必須去實現,客戶類不必知道服務類,而服務類必須知道客戶類定義了什麼介面,依賴方向變味了從服務類到客戶類,這就實現了依賴倒置。

​ 定義:客戶類和服務類都必須依賴於抽象介面,而客戶類擁有介面。

依賴注入容器:通過依賴注入容器,來挑選符合介面的服務類為客戶類提供服務。

​ 參與程式運作的本質只有物件,物件不直接依賴,沒有選擇權,互相不知道,而只知道各個介面。客戶類制定介面,物件間通過接**互,形成運作。依賴注入容器決定選擇哪個服務類給客戶類使用。

OO設計模式學習筆記

學習設計模式,首先要了解設計原則 學設計模式,就像學唱歌,先模仿名人,再活學活用,把別人的經驗變成自己的,然後創造自己的經驗模式 學習設計模式,是學習其他開發人員的智慧型和經驗,使用設計模式,可以更好的做到 復用 不用把設計模式都背熟,但是一定要在腦子裡有乙份設計模式的目錄,在設計時,知道什麼時候要...

JS學習筆記 OO疑問之封裝

封裝是物件導向的基礎,今天所要學習的匿名函式與閉包就是為了實現js的物件導向封裝。封裝實現 封裝變數。提高資料 系統安全性。封裝正是物件導向的基礎。即沒有名字的函式。其建立方式為 function 單獨存在的匿名函式,無法執行,可通過賦值給變數呼叫或通過表示式自我執行來實現執行。1.賦值給變數為一般...

JS學習筆記 OO疑問之物件建立

問 一 引入工廠,解決反覆 前面已經提到,js中建立物件的方法,不難發現,主要的建立方法中,建立乙個物件還算簡單,假設建立多個類似的物件的話就會產生大量反覆的 解決 工廠模式方法 加入乙個專門建立物件的方法,傳入引數避免反覆 function createobject name,age return...