多个常见代码设计缺陷
生活随笔
收集整理的這篇文章主要介紹了
多个常见代码设计缺陷
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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) 缺陷特征:派生類幾乎沒有使用任何繼承父類的功能,卻增加了全新的功能。 缺陷影響:非繼承關系卻繼承,難理解,不易維護。 解決方法:理清類與類之間的繼承關系,不適合繼承關系的類應該單獨分開。
最新內容請見作者的GitHub頁:http://qaseven.github.io/
與50位技術專家面對面20年技術見證,附贈技術全景圖
10、紊亂類(Schizophrenic Class) 缺陷特征:一個類實現了多個不同的功能,如界面類又處理了業務相關的功能。 缺陷影響:不易理解,耦合度高,公共方法太多。 解決方法:對多個功能進行拆分。 11、復雜類(Blob Class) 缺陷特征:規模非常龐大、復雜性高的類,常常包含多個復雜函數,有多重功能。 缺陷影響:圈復雜度高,內聚性差,耦合度高,不易看懂和維護。 解決方法:解決復雜函數,結構要清晰,類功能應該單一。建議值:類行數應在2000以內。 12、全能類(God Class) 缺陷特征:一個類集中了多個不相關類的功能;一個類操作其它模塊數據太多;大而復雜。 缺陷影響:破壞了類的封裝性,耦合度高,內聚性差,不易維護。 解決方法:多個功能不相關的類應該分別封裝成不同的類,適當搬移函數,解決復雜函數問題。 13、歪曲層次(Distorted Hierarchy) 缺陷特征:類的繼承關系比較深。 缺陷影響:復雜度高,不易維護。 解決方法:類的繼承層次結構不應該超過6。 14、數據類(Data Class) 缺陷特征:提供許多公共屬性和函數,供很多其它類來操作,自己卻很少操作。 缺陷影響:非面向對象,缺乏封裝性,不易維護。 解決方法:封裝性。 15、破壞繼承(Tradition Breaker) 缺陷特征:派生類幾乎沒有使用任何繼承父類的功能,卻增加了全新的功能。 缺陷影響:非繼承關系卻繼承,難理解,不易維護。 解決方法:理清類與類之間的繼承關系,不適合繼承關系的類應該單獨分開。
最新內容請見作者的GitHub頁:http://qaseven.github.io/
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的多个常见代码设计缺陷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 因新漏洞问题 Firefox 49发布时
- 下一篇: Shadow Brokers扬言兜售新漏