坏味道代码和解决方法简介

以下纯粹是概念和解决方法的简介,真实的衡量标准需要在工程实践中累积经验和智慧,最后得到“直觉”,凭借“直觉”判断多少行重复的代码可以判断为重复代码坏味道,方法超过多少行或者方法职能不单一,认定为超长函数等。提供的参考值并无学术上的参考价值,仅仅当前阅读代码能力的参考。

重复代码(Duplicate code):代码结果类似,表达式相似的代码。
解决方法:提取方法(Extract Method),方法上移(Pull Up Method),塑造模板方法(Form Template Method),替换算法(Substitute Algorithm)
参考值:建议不要有超过10行的相似代码

过长函数(long method):一个方法或者函数的代码或者职能过多,影响阅读维护,可读性差。
解决方法:提炼方法(Extract Method),以查询代替临时变量(Replace Temp with Query),引入参数对象(Introduce Parameter Object),保持完整对象(Preserve Whole Object),以函数对象取代函数(Replace Method with Metho Object),分解条件表达式(Decompose Conditional)
参考值:方法只有一个功能;一个方法不要超过50行

过大的类(Large class):类文件的代码数量太多,类做的事情太多,出现太多的实现变量
解决方法:提炼类(Extract Class),提炼子类(Extract Subclass),提炼接口(Extract interface)
参考值:类的职责应该单一,类文件应该不超过2000行

过长参数列(Long Parameter List):一个函数的参数过多;函数参数过多,影响使用,使用这个函数,需要了解所有的参数
解决方法:以函数取代参数(Replace Parameter with Metho),保持完整对象(Preserve Whole Object),引入参数对象(Introduce Parameter Object)
参考值:参数个数应该少于5个

发散式变化(Divergent Change):引起一个类变化的原因不止一个;也就是说类承载的功能过多,修改功能点1和功能点2修改的类是相同的;这同样违反了单一职责原则。
解决方法:提炼类(Extract Class)
参考值:类的功能单一

散弹式修改(Shotgun Surgery):要修改某个功能点,需要在很多类中修改;与发散式变化相反的概念
解决方法:搬移函数(Move method),搬移字段(Move Field),将类内联化(Inline class)
参考值:修改一个功能点,超过3处,可能就是散弹式修改的坏味道。

依恋情结(Feature Envy):函数对其他类的兴趣高过对自己所处类的兴趣
解决方法:搬移函数(Move method),提炼方法(Extract Method)
参考点:需要频繁的去别的类获取数据的情况

数据泥团(Data Clumps):两个类中的相同的字段或者函数签名相同的参数,并且删除其中一个,造成其他函数也变得没有意义。
解决方法:提炼类(Extract Class),保持完整对象(Preserve Whole Object),引入参数对象(Introduce Parameter Object)
参考:如果超过三个字段或者函数的参数超过三个,且这三个参数强关联在一起

基本类型偏执(Primitive Obsession):过多使用基本类型,没有应用面对象特性
解决方法:以对象取代数据值(Replace Data value with Object),以类取代类型码(Replace Type code with Class),以子类取代类型码(Replace Type code with subclass),以State/Strategy取代类型码(Replace Type Code with State/Strategy),提炼类(Extract Class),引入参数对象(Introduce Parameter Object),以对象取代数组(Replace Array with Object)
参考值:确定范围,位置等

Switch惊悚现身(Switch Statements):过多使用switch语句
解决方法:提炼方法(Extract Method),搬移函数(Move method),以子类取代类型码(Replace Type code with subclass),以State/Strategy取代类型码(Replace Type Code with State/Strategy),以多态取代条件表达式(Replace Conditional with Polymorphism),以明确函数取代参数(Replace parameter with explicit Methods),引入Null对象(Introduce NullObject)
参考值:见到Switch就可以考虑是否有这种坏味道

平行继承体系(Parallel Inheritance Hierarchies):当为某个类增加一个子类时,必须为另一个类相应增加子类(这里和工厂模式有些冲突,需要仔细衡量)
解决方法:让一个继承体系的实例应用另一个继承体系的实例。搬移函数(Move method),搬移字段(Move Field)
参考值:略

冗赘类(Lazy class):一个类的职责可被取代或者已不能构成一个单独职能类
解决方法:折叠继承体系(Collapse Hierarchy),将类内联化(Inline class),提炼子类(Extract Subclass)
参考值:略

夸夸其谈未来性(Speculative Generality):类的某字给有可能的场景使用
解决方法:折叠继承体系(Collapse Hierarchy),将类内联化(Inline class),移除参数(Remove Parameter),函数重命名(Rename Method)

令人迷惑的临时字段(Temporary Field):其内某个实例变量仅为某种特定情况而设
解决方法:提炼类(Extract Class),引入Null对象(Introduce NullObject)
参考值:略

过度耦合的消息链(Message Chains):很多的点点点,方法调用方法,继续调用方法的方法返回值
解决方法:隐藏委托(Hide Delegate),提炼方法(Extract Method),搬移函数(Move method)
参考值:点点点超过3ge

中间人(Middle Man):接口类有一半的函数都委托给其他类
解决方法:移除中间人(Remove middle Man),内联方法(Inline Method),继承取代委托(Replace Delegation with Inheritance)
参考值:接口类有一半的函数都委托给其他类

狎昵关系(Inappropriate Intimacy):两个类过于亲密,关注彼此的private成分
解决方法:搬移函数(Move method),搬移字段(Move Field),将双向关联改为单向关联(Change Bidirectonal Association to UniDirectional),提炼类(Extract Class),隐藏委托(Hide Delegate),委托替代委托(Replace Inheritance with Delegation)
参考值:略

异曲同工的类(Alternative Classes with Different Interface):两个函数做同一件事,却有着不同的签名
解决方法:函数重命名(Rename Method),搬移函数(Move method)
参考值:略

不完美的类库(Incomplete Library Class):略

纯稚数据类(Data Class):只有字段和访问字段的代码,只是一个数据容器
解决方法:封装字段(Encapsulate Field),封装集合(Encapsulate Collection),移除设值函数(Remove Setting Method),搬移函数(Move method),提炼方法(Extract Method),隐藏函数(Hide Method)
参考值:略

被拒绝的馈赠(Refused Bequest):子类不想继承超类的函数和紫盾
解决方法:为子类新建兄弟类,然后下移方法(Push down Method)和下移字段(Push Down Field),委托替代委托(Replace Inheritance with Delegation)
参考值:略

过多的注释(Comments):过多的注释
解决方法:提炼方法(Extract Method),函数重命名(Rename Method),引入断言(Introduce Assertion).

代码坏味道类型和解决方法简介相关推荐

  1. 25种代码坏味道总结+优化示例

    前言 什么样的代码是好代码呢?好的代码应该命名规范.可读性强.扩展性强.健壮性......而不好的代码又有哪些典型特征呢?这25种代码坏味道大家要注意啦 1. Duplicated Code (重复代 ...

  2. 代码坏味道之非必要的

    :notebook: 本文已归档到:「blog」 翻译自:https://sourcemaking.com/refactoring/smells/dispensables 非必要的(Dispensab ...

  3. 25 种代码坏味道总结+优化示例

    作者 | 捡田螺的小男孩       责编 | 欧阳姝黎 前言 什么样的代码是好代码呢?好的代码应该命名规范.可读性强.扩展性强.健壮性......而不好的代码又有哪些典型特征呢? Duplicate ...

  4. .NET代码质量 | 一天一点代码坏味道(3)

    [代码精进]| 总结/Edison Zhou 作为一个后端工程师,想必在职业生涯中都写过一些不好维护的代码.本文是我学习<代码之丑>的学习笔记,今天第三天,品品大类和长参数列表的味道. 上 ...

  5. java 代码坏味道_代码中的坏味道

    前言 在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味("坏味道"),这个时候我们就应该把它扔掉.同样,代码也有"坏味道",当然确定什么是和不是代码& ...

  6. 代码 | 一天一点代码坏味道(1)

    [代码精进]| 总结/Edison Zhou 作为一个后端工程师,想必在职业生涯中都写过一些不好维护的代码.本文是我学习<代码之丑>的学习总结,今天第一天发车,先来看看在命名上的一些常犯的 ...

  7. 讲点码德!避免这些代码坏味道,努力做一名优秀的程序员

    Martin Fowler:任何一个傻瓜都能写出计算机可以理解的代码.唯有写出人类容易理解的代码,才是优秀的程序员. 大家闭着眼睛想一下什么是好代码?也许你的脑海中漂浮着一堆词:干净.整洁.命名规范. ...

  8. .NET代码质量 | 一天一点代码坏味道(4)

    [代码精进]| 总结/Edison Zhou 作为一个后端工程师,想必在职业生涯中都写过一些不好维护的代码.本文是我学习<代码之丑>的学习笔记,今天最后一天,一起品品滥用控制语句的味道,再 ...

  9. 讲点武德!避免这些代码坏味道,努力做一名优秀的程序员

    Martin Fowler:任何一个傻瓜都能写出计算机可以理解的代码.唯有写出人类容易理解的代码,才是优秀的程序员. 大家闭着眼睛想一下什么是好代码?也许你的脑海中漂浮着一堆词:干净.整洁.命名规范. ...

  10. 计算机蓝屏代码0x000000ED,蓝屏代码0x000000ed的4大解决方法详解!蓝屏0x000000ed的原因和解决方法!...

    说到电脑问题,就不得不提蓝屏的问题.最近有位朋友的电脑开机的时候,并没有进入正常的启动程序,反而进入了蓝色界面,显示代码0x000000ed,不知道为什么会这样,也不知道如何去解决.下面就来看看蓝屏0 ...

最新文章

  1. 综述的综述!5 篇2020 年「图像分割算法」最佳综述论文详解
  2. 重磅!Gartner公布2019年十大战略科技发展趋势
  3. Access denied for user 'root'@'localhost' (using password: YES)的解决
  4. Mybatis-入门篇-根据官方文档搭建
  5. 查看redhat版本信息
  6. BZOJ3527: [Zjoi2014]力 [FFT]
  7. 查询手机号段对应地区编码_2020陕西专升本考试今日起查询成绩啦
  8. 信息学奥赛一本通(1117:整数去重)
  9. c语言微秒级延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  10. 地图旋转_如何使用万能地图下载器计算七参数
  11. 关于Viual Studio 改变编辑器背景背景及背景图片(转)
  12. Whale Alert显示600枚比特币从Mt.Gox冷钱包转出系误报,实为f2pool钱包地址
  13. 第六章 培养感恩的习惯
  14. matlab preparets,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?
  15. 9步搞定:用迅雷等工具下载百度网盘资源
  16. 企业进行客户关系管理的重要性是什么
  17. 执行董事和非执行董事的区别
  18. 2429: [HAOI2006]聪明的猴子
  19. metrics 指标分析——你不在意的p99和p999
  20. VS2008下编写Colors应用程序

热门文章

  1. 基于PaddleX的岩石识别
  2. 利用HTML自制鬼灭之刃动态壁纸
  3. java中指数形式的格式_java – 复数的指数形式
  4. python locale.setlocale啥意思_Python locale 多语言模块及遇到问题解决
  5. 金融小知识-八行五保-三大综合性金融
  6. wps2022无法加载此加载项程序mathpage.wll
  7. JVM学习笔记(13) 垃圾回收-相关概念
  8. error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-h4wtvo23\opencv\
  9. Wamp安装教程(Windows Apache Mysql PHP集成安装环境)
  10. 2021金三银四Java面试突击集锦