1. 程式人生 > >Mooc軟件工程-02面向對象泛型

Mooc軟件工程-02面向對象泛型

組成 ima 固然是 name 成員 專註 對象 指示 類的繼承

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面向對象泛型