多個常見代碼設計缺陷


多個常見代碼設計缺陷
0 前言

在軟件設計開發中,代碼的設計都體現在:子系統與子系統、模塊與模塊、函數與函數之間的關系,設計越糟糕的軟件,維護成本越高,質量也往往難以達標和稱贊。

好的設計必定是:層次關系簡潔、清晰、易維護和擴展的。

不會研究太高深的設計,只總結出一些常見的代碼設計缺陷,這些設計缺陷如能很好的解決和避免,相信代碼能力(編寫、設計、評審、重構)能提高一個檔次。

主要介紹下面15個常見代碼設計缺陷:

1 復雜函數(Blob Operation)

缺陷特征:指的是代碼行多,分支嵌套深,變量多,參數多,注釋多,復雜度高等特征的函數。

缺陷影響:函數不易理解和維護,代碼重復、冗余。

解決方法:新開發代碼時,函數都是越寫越復雜的,應該要有意識地、積極地去分解提煉成小函數或獨立功能的函數,甚至當感覺需要以注釋來說明點什么的時候,這時其實就應該獨立成一個函數。函數建議值:代碼行24,if語嵌套深度6,圈復雜度10,功能應該單一。

2 數據泥團(Data Clumps)

缺陷特征:函數的參數多且參數列表相似,反復調用相同的參數列表。

缺陷影響:大量重復,影響編譯的效率;參數多,很難理解和調用。

解決方法:參數列表應該封裝成結構。建議值:函數參數平均為2,避免5個以上。

偽碼示例:GetDate(int year,int month,int day,int time) -> GetDate(struct DateRange)。

3 不必要的耦合(Unnecessary Coupling)

缺陷特征:包含某個頭文件,但是卻沒有使用頭文件中任何內容。

缺陷影響:編譯鏈接速度慢,耦合度高,頭文件錯誤包含,如包含某個頭文件卻沒有使用里面的內容,某個頭文件卻依賴某個dll,則會引起不必要的dll依賴和錯誤。

解決方法:頭文件不能亂包含,100%確認每個包含的頭文件使用情況,刪除不必要包含的頭文件。

4 過度耦合(Intensiue Coupling)

缺陷特征:一個函數調用大量其它模塊的函數,卻調用很少本模塊的函數。

缺陷影響:一個函數與多個函數(這些函數屬於少數一兩個類)聯系過於緊密;一個類提供了很多函數給外部某個函數調用;耦合度高,類不夠抽象。

解決方法:識別內、外部模塊函數,外部模塊要足夠抽象調用。

5 循環依賴(Cyclic Dependencies)

缺陷特征:多個子系統處於一個環狀互相依賴關系里面;函數的調用關系混亂、循環;文件直接或間接交叉引用。

缺陷影響:不易理解和維護,編譯慢,關系混亂,重用困難。

解決方法:多文件或系統間要划分清楚結構、層次關系,應做到無環依賴。

偽碼示例:循環包含頭文件,file A包含file B,而file B又包含了file A。

6 依戀情節(Feature Envy)

缺陷特征:函數很少訪問自己模塊數據,總是訪問外部模塊數據;訪問自己模塊少,訪問其它模塊多;數據和操作不在同一模塊;對其它類的數據比較感興趣。

缺陷影響:耦合度高。

解決方法:同一模塊的數據和操作應該放在一起。

7 重復代碼(Repeat code)

缺陷特征:不同模塊或文件間有類似或重復功能的類;不同類間有類似或重復功能的函數;同一父類的子類間存在相似或重復功能的代碼。

缺陷影響:代碼膨脹混亂,不易維護,本來維護一處代碼由於重復代碼要維護多處。

解決方法:提煉重復代碼。如工具函數封裝成工具類,通用功能封裝成公共庫。

8 不穩定依賴(Unstable Dependencies)

缺陷特征:一個子系統或模塊依賴於另一個比它更不穩定的子系統或模塊,如上層模塊依賴於不穩定的底層模塊,上層模塊肯定會問題不斷。

缺陷影響:不獨立,不穩定,牽一發而動全身。

解決方法:當有依賴關系時,一定要先保證被依賴子系統或模塊的穩定性。至少應保證不穩定的子系統要依賴穩定的子系統。

9 未利用的接口(Underutiliaed Interface)

缺陷特征:設計並實現了很多接口,大部分未使用或只在內部使用;定義了很多全局變量,大部分其它模塊未使用。

缺陷影響:冗余,設計過度,暴露可視化。

解決方法:按需設計接口,不需要對外公開的變量和函數應該私有化。

10 紊亂類(Schizophrenic Class)

缺陷特征:一個類實現了多個不同的功能,如界面類又處理了業務相關的功能。

缺陷影響:不易理解,耦合度高,公共方法太多。

解決方法:對多個功能進行拆分。

11 復雜類(Blob Class)

缺陷特征:規模非常龐大、復雜性高的類,常常包含多個復雜函數,有多重功能。

缺陷影響:圈復雜度高,內聚性差,耦合度高,不易看懂和維護。

解決方法:解決復雜函數,結構要清晰,類功能應該單一。建議值:類行數應在2000以內。

12 全能類(God Class)

缺陷特征:一個類集中了多個不相關類的功能;一個類操作其它模塊數據太多;大而復雜。

缺陷影響:破壞了類的封裝性,耦合度高,內聚性差,不易維護。

解決方法:多個功能不相關的類應該分別封裝成不同的類,適當搬移函數,解決復雜函數問題。

13 歪曲層次(Distorted Hierarchy)

缺陷特征:類的繼承關系比較深。

缺陷影響:復雜度高,不易維護。

解決方法:類的繼承層次結構不應該超過6。

14 數據類(Data Class)

缺陷特征:提供許多公共屬性和函數,供很多其它類來操作,自己卻很少操作。

缺陷影響:非面向對象,缺乏封裝性,不易維護。

解決方法:封裝性。

15 破壞繼承(Tradition Breaker)

缺陷特征:派生類幾乎沒有使用任何繼承父類的功能,卻增加了全新的功能。

缺陷影響:非繼承關系卻繼承,難理解,不易維護。

解決方法:理清類與類之間的繼承關系,不適合繼承關系的類應該單獨分開。

16 推薦2本相關書籍
                                                   


免責聲明!

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



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