模塊化開發——高內聚低耦合


 前言:emmm最近都在趕進度,已經好久沒輸出了,接下來都使用MakeDown文檔寫文,推薦大家使用VsCode編譯工具,加入Markdown Preview Enhanced插件,創建一個MD文件,復制過去

點擊下圖顯示的圖標,就可以預覽了,格式我就不修改了,哈哈哈,ヾ( ̄▽ ̄)Bye~Bye~

 

模塊化

842ed7e039074c5ae9c504bf55491887.png  

## 耦合性

### 定義

#### 1/塊間聯系
模塊之間聯系越緊密==>其耦合性就越強==>模塊的獨立性則越差
#### 2/模塊間依賴程度
指軟件系統結構中各模塊間相互聯系緊密程度

### 要素

#### 1/模塊間接口的復雜性
#### 2/調用的方式
#### 3/傳遞的信息

### 分類:低->高

ede34b7072fddacf9be35dec23ffa612.png  

#### 無直接耦合
- AB模塊間無直接關系
- AB間的聯系完全是通過主模塊的控制和調用來實現的
- 耦合度最弱,模塊獨立性最強
- **E.G:模塊A實現輸出字符串,模塊B實現接收int數據,兩者之間沒有信息傳遞。這種情況下模塊A和模塊B就是非直接耦合**
#### 數據耦合
- 指AB模塊間有調用關系
- 傳遞的是簡單的數據值,相當於高級語言的值傳遞
- **E.G:模塊A實現兩個數的加法操作,模塊B實現兩個加數的初始化,模塊B將兩個加數傳給模塊A,模塊A進行相加。這種情況下模塊A和模塊B就是數據耦合**
#### 標記耦合
- 傳遞的是數據結構,如高級語言中的數組名、記錄名、文件名等這些名字即標記
- 實質為傳遞該數據結構的地址
- **E.G:模塊A向模塊B傳遞Object類型的數據。這種情況下模塊A和模塊B就是標記耦合**
#### 控制耦合
- 指AB模塊間有調用關系
- 傳遞的是控制變量,如開關、標志等
- 被調模塊通過該控制變量的值有選擇地執行塊內某一功能
- **E.G:模塊A獲取用戶類型(普通用戶、高級用戶)傳遞給模塊B,模塊B根據不同類型的用戶提供不同的服務。這種情況下模塊A和模塊B就是控制耦合**
#### 公共耦合
- 指通過一個公共數據環境相互作用的那些模塊間的耦合
- 公共數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等
- 若模塊只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬於比較松散的公共耦合
- 若模塊既向公共數據環境輸入數據又從公共數據環境取出數據,這屬於較緊密的公共耦合
- 公共耦合的復雜程序隨耦合模塊的個數增加而增加
- **E.G:定義了一個全局變量a,在A、B、C模塊中均調用了a,這種情況下模塊A、模塊B、模塊C就是公共耦合**
****
**公共耦合會引起以下問題:**
1. 無法控制各個模塊對公共數據的存取,嚴重影響了軟件模塊的可靠性和適應性。
2. 使軟件的可維護性變差。若一個模塊修改了公共數據,則會影響相關模塊。
3. 降低了軟件的可理解性。不容易清楚知道哪些數據被哪些模塊所共享,排錯困難。
一般地,僅當模塊間共享的數據很多且通過參數傳遞很不方便時,才使用公共耦合。
****
#### 內容耦合
- 最高程度的耦合,也是最差的耦
- A模塊直接訪問B模塊的內容
- A模塊直接使用B模塊的內部數據
- B模塊通過非正常入口而直接轉入A模塊內部
- 一個模塊有多個入口
- AB模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)
- 可能在匯編語言中出現
- **E.G:模塊A中定義了變量a,在模塊B中直接使用了。這種情況下模塊A和模塊B就是內容耦合**

****
## 內聚性

### 定義

#### 1/塊內聯系
模塊的功能強度/緊密程度的度量
#### 2/模塊內緊密程度
一個模塊內各元素(語名之間、程序段之間)聯系的越緊密==>內聚性就越高

### 分類:低->高
63dcd4794720af0d2d6899a2904c3173.png  

#### 偶然內聚/巧合內聚
- 指同一個模塊內的各處理元素之間沒有任何聯系
- 內聚程度最低
- **E.G:A模塊中有三條語句(一條賦值,一條求和,一條傳參),表面上看不出任何聯系,但是B、C模塊中都用到了這三條語句,於是將這三條語句合並成了模塊A。模塊A中就是偶然內聚**
#### 邏輯內聚
- 指同一個模塊內執行幾個邏輯上**相似**的**功能**,通過參數確定該模塊應完成哪一個功能
- **E.G:A模塊實現的是將對應的人員信息發送給技術部,人事部和財政部,決定發送給哪個部門是輸入的控制標志決定的。模塊A中就是邏輯內聚**
#### 時間內聚
- 指同一個模塊內將需要**同時執行**的動作組合在一起
- **E.G:編程開始時,程序員把對所有全局變量的初始化操作放在模塊A中。模塊A中就是時間內聚**
#### 過程內聚
- 指模塊內部的處理成分是相關的,而且這些處理必須以特定的次序進行執行
- **E.G:用戶登陸了某某網站,A模塊負責依次讀取用戶的用戶名、郵箱和聯系方式,這個次序是事先規定的,不能改變。模塊A中就是過程內聚**
#### 通信內聚/信息內聚
- 指各處理模塊都使用**相同**的輸入**數據**或者產生相同的輸出數據
- 指模塊內所有處理元素都在同一個數據結構上操作
- 或所有處理功能都通過公用數據而發生關聯(有時稱之為信息內聚)
- **E.G:模塊A實現將傳入的Date類型數據轉換成String類型,以及將Date類型數據插入數據庫,這兩個操作都是對“Date類型數據”而言的。模塊A中就是通信內聚**
#### 順序內聚/過程內聚
- 指一個模塊中各個處理元素都密切相關於同一功能且必須**順序執行**,前一功能元素輸出就是下一功能元素的輸入
- 順序內聚的內聚度比較高,但缺點是不如功能內聚易於維護
- **E.G.模塊A實現將傳入的Date類型數據轉換成String類型,然后再將轉換好的String類型數據插入數據庫。模塊A中就是順序內聚**
#### 功能內聚
- 指模塊內所有元素共同完成一個功能,**缺一不可**
- 最強的內聚,與其他模塊的耦合是最弱的
- 優點是它的功能明確
- 判斷一個模塊是否功能內聚,一般從模塊名稱就能看出。如果模塊名稱只有一個動詞和一個特定的目標(單數名詞),一般來說就是功能內聚
- 功能內聚模塊的一個重要特點是:他是一個“暗盒”,對於該模塊的調用者來說,只需要知道這個模塊能做什么,而不需要知道這個模塊是如何做的
- **E.G.模塊A實現將新注冊的用戶信息(用戶名,密碼,個性簽名)全部轉換成String類型並插入數據庫**

****
## 高內聚,低耦合的系統的優勢?

更好的重用性,維護性,擴展性

## 高內聚低耦合是否意味着內聚越高越好,耦合越低越好?
### 真正好的設計是在高內聚和低耦合間進行平衡,也就是說高內聚和低耦合是沖突的。
### 從內聚上
最強的內聚:一個類只寫一個函數==>類的數量急劇增多==>其它類的耦合特別多==>整個設計就變成了“高內聚高耦合”==>由於高耦合,整個系統變動同樣非常頻繁
### 從耦合上
最弱的耦合:一個類包含所有的函數,這樣類完全不依賴其它類,耦合性是最低的==>內聚性很低==>整個設計就變成了“低耦合低內聚“==>由於低內聚,整個類的變動同樣非常頻繁

## 軟件設計時,如何做好高內聚低耦合?
### 從內聚上
在模塊划分時,要遵循“一個模塊,一個功能”的原則,盡可能使模塊達到功能內聚
### 從耦合上
建立模塊間盡可能松散的系統,在設計上我們應采用以下原則:若模塊間必須存在耦合,應盡量使用數據耦合,少用控制耦合,慎用或有控制地使用公共耦合,並限制公共耦合的范圍,盡量避免內容耦合。

 參考文獻:

淺談高內聚低耦合

什么是高耦合低內聚?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM