面向過程(面向結構)與面向物件的區別
先說說結構化方法的主要思想:
(1)功能的分解是一種遞迴定義。也就是說:第0層(代表整個系統)它只看得見 1,2,3,至於1,2,3各自自身怎麼實現,那不是它的事,而對於模組1來說,它只管1.1,1.2,1.3,它並不管1.11,1.12等.這種思維能讓我們每次聚焦在一個部位上,這個部位可能處於高層,也可能處於低層,但不管處在哪一層,都是用的迭代的思維,第n層只考慮它和第n+1層的關係,並不考慮第n+2,n+3層。
(2)模組1,2,3之間可能是"與"的關係,也可能是"或"的關係,它們相互協作來完成上一層的功能。
(3)也因為上述的遞迴定義,所有不管是函式,還是子系統,還是整個系統,都可把該系統分成幾個子系統之後,每個子系統仍然是用這個模型來描述。
(4)這個功能分解的層次圖如何建立呢?功能分解最終轉化為事件的分組,分包。所謂事件就是系統處理的外部使用者的請求.注意:這裡的事件不是指的使用者點選介面上的一個按扭,一個選單,當然可能是這種情況,介面通常是複雜的,"對話方塊套對話方塊",我們看的不是介面是什麼,而是使用者使用介面達到一個什麼目的,這個目的通常才是使用者對系統的請求,即"最後一個介面"
一個系統處理一大堆事件(1,2,...n),通過對這些事件進行分組,不同的模組處理不同的事件,最終以事件為線索對系統的功能進行分解。
面向物件方法的思想:
整個系統被分解成物件的集合,而不是功能的集合,每個物件有自己的職責,物件之間相互協作來完成使用者交給的任務。
(1)同結構化相比,它不是層次結構,在結構化中,上一層依賴下一層,下一層又依賴下下一層,
只要底層改變,上層也要跟著改變,它沒有很好的隔離變化.而面向物件剛很好的封裝了變化,外界只需使用物件的介面,而不用管這個介面是如何實現的
(2)一個重要區別是:這裡的箭頭是請求,而不是資料流.在結構化方法的DFD資料流程圖中,箭頭代表的是資料流,也就是說一個模組的輸出變成另一個模組的輸入,而這裡,指的是物件A請求物件B完成某項任務,也就是A呼叫B的方法。
從結構化到面向物件的兩個誤區,也就是兩個極端:
1.過大的類.一個類中包含了幾十個函式,這種大雜燴嚴重違背面向物件的單一職責原則。也就是說,一個物件要乾的事應該和它的名字一致,它要幹哪些事,從它的名字就應該能看出來.
2.類中只有函式,沒有屬性.這是陷入了功能分解的誤區,只是簡單的把函式組裝到一起.基本沒有封裝。
物件的一個重要特性是:物件是有狀態的(也就是屬性),物件的行為與它的所處的狀態密切相關。