Mooc軟件工程-02面向對象泛型
1 內聚
模塊
語義上連續的一系列語句, 由邊界符界定, 並且有一個聚集標識符
常見的模塊
在面向對象中的 類, 方法
在面向過程的 函數
模塊功能單一, 內部交互程度最大, 模塊之間交互程度為最小
模塊的內聚: 模塊內部的交互程度
模塊的耦合: 模塊之間的交互程度
模塊的內聚性從低到高分為7種:
偶然內聚 --> 邏輯內聚 --> 時間內聚 --> 過程內聚 --> 通信內聚 --> 功能內聚 --> 信息內聚
軟件模塊的內聚性越低越差, 越高越好
1) 偶然內聚: 模塊內部的內容毫不相幹
問題: 可讀性低, 可維護性低, 可重用性低
解決: 拆分成不同的模塊
2) 邏輯內聚: 合並後的EFG就是邏輯性內聚
問題: 接口復雜, 內部復雜, 內部難以修改, 效率低, 增加了調用模塊和被調用模塊的耦合度
3) 時間性內聚: 在相同時間需要做的一些操作, 但是可能在本質上沒有什麽關聯性
問題: 模塊內部關聯度比較弱, 但是和別的模塊可能關聯性較強, 一般不可重用
4) 過程內聚: 模塊內部操作必須有先後順序
問題: 內部之間多個操作不是相互關聯的, 只是有先後順序, 因此該代碼不容易被重用
5) 通信內聚
問題: 主要是重用性較低
6) 功能內聚:只具有一個功能或者一個操作
將之前的內容進行拆分形成的
具有較高的重用性
糾錯修改也比較容易, 減少更少的回歸錯誤
更加容易擴展
7) 信息內聚: 執行多個任務, 每個任務都有自己的入口點,相對獨立的代碼, 並且在相同的數據結構進行操作
2 耦合
模塊的耦合, 模塊之間的交互程度, 越低越好
內容耦合 --> 公共耦合 --> 控制耦合 --> 印記耦合 --> 數據耦合
1) 內容耦合
實例: 在一個類中, 可以直接訪問類中某個變量並且可以進行一系列的操作
class A:
name = ‘a‘
class B:
mA = A()
def setItem(self):
self.mA.name = ‘aa‘
2) 公共耦合: 兩個模塊存取相同的變量(常見的是全局變量)
盡量減少公共耦合, 盡量減少全局變量的使用, 防止全局變量在多個模塊被修改
3) 控制耦合: 一個模塊向另一個模塊傳遞控制參數, 最常見的就是傳遞開關變量, 而且必然導致被調用模塊的邏輯內聚
解決辦法, 把邏輯判斷模塊寫到A中, 將B的兩個功能拆分成兩個模塊
4) 印記耦合: 一個模塊傳入另一個模塊的封裝數據, 但是具體在模塊中只使用一部分數據
例如在類A中傳入B的對象, 在A中只是使用B的兩個成員變量
class A:
name = ‘a‘
age = 18
sex = ‘male‘
class B:
def setItem(self, obj):
self.name = obj.name
self.age = obj.age
b = B( A() )
問題: 接口不清晰, 如果不通讀代碼, 不會知道哪些數據是需要的哪些是不需要的, 降低了可讀性, 非常難重用
5) 數據耦合: 所有參數都是同構的參數, 或者簡單的數據, 或者是簡單的數據結構且內部的數據都被使用
3 數據封裝和信息隱藏
諸如操作系統的任務隊列
如果對每個操作寫成一個模塊, 固然是好事, 但是如果操縱的數據結構更改則所有就要更改
所以形成新一個模塊, 給各個操作共同使用一個數據結構
這樣就形成了信息內聚, 也是對數據的一種封裝
數據封裝的優勢:
1) 這樣的數據結構+數據操作 就形成了數據抽象, 使得編寫最開始專註於數據結構和操作, 而不局限於怎麽實現某些操作
2) 在維護上, 數據封裝可以使以後代碼改動最小化, 減少出現回歸錯誤的出現可能性
信息隱藏: 對外提供接口, 而隱藏具體的實現細節
4 類的繼承
類: 抽象數據類型
對象: 類派生出來的實例
繼承: 子類繼承父類, 會取得父類所有的公開內容
在UML中, 繼承是用一個空心箭頭指向, 被指向的是父類, 指向出去的是子類
一個類基本由三部分組成, 第一部分是類名; 第二部分是由成員變量組成, 前面加上減號表示; 第三部分是成員函數, 由加號前面表示
繼承之間的關系可以用 is a kind of 來表示
5 類的聚合
類的聚合是指多個類共同組成了一個大類
具體有兩個例子
其中空心菱形表示脫離聚合的大類, 原有組成的小類可以繼續存在
實心菱形表示, 脫離了聚合的大類之後, 原有組成的小類將不可繼續存在
6 類的關聯和多重性
類的關聯關系是, 兩個類之間, 既不是繼承也不是聚合也不是組合關系, 兩者之間可以通過一個動作來關聯, 共同構成了主動賓關系
如學生上課, 顧客下訂單
如果有多個動作關系, 那應該都列舉出來, 例如借書的人與書之間的關系有借書, 還書, 續借, 預約
具體在代碼中的表現就是, 類中包含其他類的對象
在描述類之間的關系的時候, 還需要考慮多重性
也就是一對多, 多對一,多對多等之間的關系, 具體可以查看多重性指示器
7 多態與動態綁定
在運行中, 正確的方法被激活, 這就是動態綁定
方法可以被不同的類的對象調用, 這也就是多態
8 面向對象泛型
抽象數據類型的優勢: 信息隱藏, 數據抽象, 過程抽象
結構化泛型當程序超過50000行之後, 變暴露出問題了
此時使用面向對象泛型更為合適
面向對象泛型主要是基於 將數據和操作綁定到一起; 或者說形成對象, 利用對象來綁定操作
9 UML
UML 統一建模語言
UML定義了多種圖, 各種圖的相互之間的關系如下
用例圖
類圖: 分為簡單類圖和復雜類圖(實體類,邊界類等詳細類圖)
活動圖
狀態圖
順序圖: 說明每個用例的具體實現過程
協作圖
常見的UML工具
visio; rational rose; magicdraw; argouml等
Mooc軟件工程-02面向對象泛型