sourcemaking

如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹。
正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 “代码异味”。
今天让我们一起来熟悉开发中经常出现的22种坏味道情形和解决方法。

Duplicated Code


重复代码
不良影响 解决方法
重复代码,难维护 提取公共函数

Long Method


函数长
不良影响 解决方法
函数长, 难理解 拆分成若干函数

Large Class


类大
不良影响 解决方法
类大, 难理解 拆分成若干类

Long Parameter List


参数多
不良影响 解决方法
参数多,难用,难理解 将参数封装成结构或者类

Divergent Change


万能类
不良影响 解决方法
万能类,发散试修改,改好多需求,都会动他 拆,将总是一起变化的东西放在一块儿

Shotgun Surgery


天女散花的逻辑
不良影响 解决方法
天女散花的逻辑,散弹式修改,改某个需求的时候,要改很多类 将各个修改点,集中起来,抽象成一个新类

Feature Envy


红杏出墙的函数
不良影响 解决方法
红杏出墙的函数,使用了大量其他类的成员 将这个函数挪到那个类里面

Data Clumps


数据团
不良影响 解决方法
数据团,常一起出现的一坨数据 他们那么有基情,就在一起吧,给他们一个新的类

Primitive Obsession


偏爱基本类型
不良影响 解决方法
偏爱基本类型,热衷于使用int,long,String等基本类型 反复出现的一组参数,有关联的多个数组换成类吧

Switch Statements


switch语句过多
不良影响 解决方法
switch语句过多, 难以理解和维护 state/strategy 或者只是简单的多态

Parallel Inheritance Hierarchies


平行继承
不良影响 解决方法
平行继承,增加A类的子类ax,B类也需要相应的增加一个bx 应该有一个类是可以去掉继承关系的。

Lazy Class


冗赘类
不良影响 解决方法
冗赘类,如果他不干活了,炒掉他吧 把这些不再重要的类里面的逻辑,合并到相关类,删掉旧的

Speculative Generality


夸夸其谈未来性
不良影响 解决方法
夸夸其谈未来性 删掉

Temporary Field


临时字段
不良影响 解决方法
临时字段,仅在特定环境下使用的变量 将这些临时变量集中到一个新类中管理

Message Chains


消息链
不良影响 解决方法
消息链,过度耦合的才是坏的 拆函数或者移动函数

Middle Man


中介
不良影响 解决方法
中介,大部分都交给中介来处理了 用继承替代委托

Inappropriate Intimacy


太亲密
不良影响 解决方法
太亲密,两个类彼此使用对方的私有的东西 划清界限拆散,或合并,或改成单项联系

Alternative Classes with Different Interfaces


相似的类
不良影响 解决方法
相似的类,有不同接口 重命名,移动函数,或抽象子类

Incomplete Library Class

不良影响 解决方法
不完善的类库 包一层函数或包成新的类

[https://sourcemaking.com/data-class]()


纯数据类
不良影响 解决方法
纯数据类,类很简单,仅有公共成员变量,或简单操作函数 将相关操作封装进去,减少public成员变量

Refused Bequest


继承过多
不良影响 解决方法
继承过多,父类里面方法很多,子类只用有限几个 用代理替代继承关系

Comments


太多注释
不良影响 解决方法
太多注释,这里指代码太难懂了,不得不用注释解释 避免用注释解释代码,而是说明代码的目的,背景等。好代码会说话

参考资料

Bad Smell (代码的坏味道)的更多相关文章

  1. 【转】Bad Smell(代码的坏味道)

    1.Duplicated Code(重复的代码) 臭味行列中首当其冲的就是Duplicated Code.如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好. ...

  2. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  3. 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  4. Refactoring之——代码的坏味道(一)过长方法

    1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...

  5. Chapter 3 :代码的坏味道

    "如果尿布臭了,就换掉它." --Beck奶奶,论保持小孩清洁的哲学 代码的坏味道这一章集中论述该何时重构.具体的重构方法在后面的章节. "没有任何度量规矩比得上见识广博 ...

  6. 消灭 Java 代码的“坏味道”

    消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...

  7. 代码的坏味道(22)——不完美的库类(Incomplete Library Class)

    坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

  8. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  9. 代码的坏味道(20)——过度耦合的消息链(Message Chains)

    坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...

随机推荐

  1. Checked异常和Runtime异常体系

    Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常).所有的RuntimeException类及其子类的实例被称为Runtime异常:不是RuntimeException类 ...

  2. [SoapUI] 设置Excel的第一行为自动过滤

    import org.apache.poi.ss.util.* XSSFWorkbook workbook = new XSSFWorkbook() XSSFSheet sheet = workboo ...

  3. [SoapUI] 如何让某个步骤的Assertion失败之后继续执行后面的步骤

    To continue tests executing after failed test step you need disable "Abort on error" optio ...

  4. redis集群部署及常用的操作命令(上)

    简单说下自己测试搭建简单的redis集群的大体步骤: 1.首先你的有6个redis(官方说最少6个,3master,3slave),可以先在一台机器上搭建,搭建到多台上应该只需要改变启动命令即可(可能 ...

  5. HDU 6201 transaction transaction transaction (树形DP)

    题意:给定一棵树,每个点有一个点权,每条边也是,找一条路径,问你 T-S-sum,T表示路径的终点的权值,S表示路径始点的权值,sum表示从S到T的边权和. 析:把这一条路径拆开来看,那么就是必然是从 ...

  6. vCenter Server Heartbeat

    1.简介 vCenter Server Heartbeat为VMware vCenter Server提供关键任务高可用性,保护虚拟基础架构免受硬件.网络.配置等的影响,基于Windows的服务,可为 ...

  7. Introduction MBG

    文档地址 http://www.mybatis.org/generator/configreference/xmlconfig.html 源码地址 https://github.com/mybatis ...

  8. zrender源码分析3--初始化Painter绘图模块

    接上次分析到初始化ZRender的源码,这次关注绘图模块Painter的初始化 入口1:new Painter(dom, this.storage); // zrender.js /** * ZRen ...

  9. (转)UI设计实战篇——利用Bootstrap框架制作查询页面的界面

    原文地址:http://www.cnblogs.com/grenet/p/3413085.html Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺 ...

  10. alpha七天冲刺计划

    alpha七天冲刺计划(更新ing) 第一天:https://www.cnblogs.com/renluqian/p/9895895.html 第二天: 第三天: 第四天: 第五天: 第六天: 第七天 ...