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/

多个常见代码设计缺陷相关推荐

  1. java设计缺陷_多个常见代码设计缺陷

    0.前言 在软件设计开发中,代码的设计都体现在:子系统与子系统.模块与模块.函数与函数之间的关系,设计越糟糕的软件,维护成本越高,质量也往往难以达标和称赞. 好的设计必定是:层次关系简洁.清晰.易维护 ...

  2. 改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  3. 改善代码设计 —— 总结篇(Summary)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  4. 改善代码设计 —— 组织好你的数“.NET研究”据(Composing Data)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  5. 10个最常见的数据库缺陷

    保护数据库不是一件容易的事情,很多企业,包括数据库管理员在内,都存在侥幸心理,但黑客针对数据库本身存在的缺陷很容易得逞,本文是Appsec的安全团队公布的10个最常见的数据库缺陷,黑客经常利用它们发起 ...

  6. 重构-改善既有的代码设计-------代码的坏味道

    重构-改善既有的代码设计 代码的坏味道 神秘命名(Mysterious Name) 给函数.变量.模块和类命名时,要使它能清晰地表明自己的功能和用法,使得写下的代码直观明了. 常用重构手法为重命名,包 ...

  7. 常见的软件测试缺陷分类:遇到测试缺陷怎么处理?

    什么是软件测试缺陷呢?通俗来说,就是bug管理.在软件系统或者程序研发过程中,程序员编码.系统设计架构不合理都可能产生错误,影响程序的正常运行.而软件测试的目的之一,就是通过软件测试工具执行操作,找到 ...

  8. QT纯代码设计UI界面Demo

    目录 一.前言 二.界面 三.源码简析 四.Demo/源码 一.前言 UI的设计方法有几种: ①一种是使用Qt Designer,也就是可视化设计,这在小型项目中常见,优点就是可观简便: ②另一种就是 ...

  9. 特斯拉Model 3设计缺陷导致底盘经常堆积厚厚泥沙

    [摘要]在汽车底盘中发现大量的泥土和沙子并不常见.好在这些泥沙只堆积在底盘的铝板上,因此不会产生腐蚀作用. 腾讯科技讯 据外媒报道,特斯拉Model 3车主发现这辆车的底盘似乎有一个设计缺陷,在寒冷的 ...

最新文章

  1. python zen_Python的宗旨(Zen of Python)
  2. 树莓派 rtl8188eu 芯片wifi驱动
  3. 高仿真的类-DefaultListableBeanFactory
  4. nssl1195-健美猫【???】
  5. 【转】RabbitMQ六种队列模式-5.主题模式
  6. 关于c++的一些案例
  7. spark分区连接mysql_Spark数据存储和分区操作
  8. 在c语言中逗号运算符若不带括号,详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]...
  9. nginx 作为Web缓存服务器
  10. c# lu分解的代码_线性方程组的分解法——LU分解法
  11. 桌面计算机怎么显示桌面快捷方式,桌面快捷方式不见了,小编教你桌面快捷方式不见了怎么找回...
  12. Python代码打包在xp系统上运行~~
  13. mysql及格率70以上_数据库实例(统计最高分学生信息,不及格率等等)
  14. Flask+ZUI 开发小型工具网站(四)——ZUI 前端主页面 tabs
  15. 【机器学习】gini系数的计算
  16. vue项目设置浏览器标题title及图标
  17. 你的信用卡安全不?数据科学家怎么破解信用卡欺诈?
  18. c语言知道ascII码求字母,c语言的ascii代码
  19. [Python]经典例题——解一元二次方程
  20. 红蓝攻防演练过程中零失陷经验分享

热门文章

  1. boost::filesystem模块实现相对文件系统的测试程序
  2. 拷贝boost::exception的测试程序
  3. boost::visit_each的用法实例
  4. VTK:可视化算法之ProbeCombustor
  5. VTK:Utilities之DetermineActorType
  6. VTK:Utilities之TimerLog
  7. VTK:IO之DEMReader
  8. VTK:Disk用法实战
  9. Qt Creator进阶使用
  10. OpenGL Primitive Restart原始重启的实例