楔子
現實世界精彩又復雜,業務邏輯和問題如何落實到代碼上呢?
采用一種劃分、整理邏輯的方式把現實世界的問題映射到代碼世界里,映射法則是軟件編程的范式和思想:
- 面向過程(結構化編程)
- 面向對象
- 函數式
面向過程的結構化設計從上世紀70年代興起,是軟件開發第一個系統化的編程思想。
一次完整的結構化編程的宏觀步驟
- 從代表目標系統整體功能的單個處理著手,自頂向下不斷把復雜的處理分解為子處理
- 一層一層的分解下去,直到僅剩下若干個容易實現的子處理功能為止,
- 用相應的工具來描述各個最低層的子處理。
因此,結構化方法是圍繞實現處理功能的“過程”來構造系統的,按功能來劃分、組織、梳理邏輯。
現實中,用戶需求的變化大部分是針對功能,這種變化對于基于過程的系統設計來說是跪弱的。結構化方法開發的軟件,其穩定性、可修改性和可重用性都比較差,這是因為結構化方法的本質是功能分解。
結構化和面向對象的關系
- 面向對象改善了結構化的不足,系統的分解不再基于功能而是基于對象。
- 把原來一個功能的邏輯分割、打散,放入到類里成為對象的行為和屬性,對象行為的邏輯實現是過程化的。
- 面向對象分析與設計對系統的分解,代表了一種演進式的開發,而不是對面向過程的革命式顛覆。
從結構化到面向對象,提醒我們開發業務功能的時候,把功能轉化成對象來組織,否則就會不自覺的陷入結構化編程里。
面向對象世界的演化 -- 萌芽
類別、概念&類、對象
類別: 該類別所有成員的集合
概念: 描述所具有的共同的本質屬性
舉個例子,“鳥”既可以作為一個類別,也可以作為一個概念。當“鳥”作為一個類別時,它包含了會飛和不會飛的所有不同種類的鳥。當“鳥”作為一個概念時,則描述的是所有的鳥所具有的共同的本質屬性,比如都有翅膀。
面向對象里的類說的是類別,面向對象里的對象說的是概念。類的實例化意味著認知從類別轉變成概念。類和實例,是一般-具體關系,類是對象的抽象,對象是類的具體化。
變量,方法;屬性;行為;狀態,操作
變量,屬性,狀態
類時,叫做變量和方法
類實例化成對象時,叫做屬性和行為;
屬性分為:
- 靜態屬性;如靜態變量,屬性不被行為改變
- 動態屬性;被行為更改過屬性值
- 只被一個行為更改,寫在該方法上面
- 被兩個及以上的行為更改,寫在類頂部
狀態: 對象的狀態是這個對象的所有屬性,以及每個屬性當前的值整體體現。所以某個對象狀態改變了,不一定只有一個屬性發生了改變,有可能多個;而屬性只要改變了,那么這個對象的狀態一定改變了。
操作: 指對象一個或多個的行為。通過操作改變狀態。
狀態、操作這兩個詞語更接近現實世界;
從代碼域到現實的問題域,概念的變化如下:
變量, 方法 ---》 屬性,行為 ----》 狀態,操作
在最左端,我們用數據結構來描述類的變量,用算法來描述類的方法。數據結構和算法是用來構建類,而類是面向對象的基本單元。
小結
變量,屬性,狀態這三者是近似概念;方法,行為,操作這三者是近似概念。
方法,行為,操作
- 純方法
- 副作用方法
按是否修改了成員變量,把方法分為純方法和有副作用的方法。(副作用,此處借用了函數式里的概念)
- 導演方法
- 角色方法
對象的方法,要么調用其他對象的方法,要么等著被其他的對象調用。如果這個方法里的實現是調用其他對象的方法,就像一位導演;這個方法我命名為導演方法。如果這個方法被別的對象調用,相當于扮演角色,這個方法我命名為角色方法。
這兩種維度可以相互組合,一個方法可以既是純方法又是導演方法,一個方法可以既是純方法又是角色方法,一個方法可以既是副作用方法又是導演方法,一個方法可以既是副作用方法又是角色方法。
注意的是,一個方法可以既是導演方法,又是角色方法。該方法體里調用了別的對象方法,同時又被其他對象調用。
.....
未完,更多內容,周三再續
.....