Chapter 3 :代码的坏味道
“如果尿布臭了,就换掉它。”
——Beck奶奶,论保持小孩清洁的哲学
代码的坏味道这一章集中论述该何时重构。具体的重构方法在后面的章节。
“没有任何度量规矩比得上见识广博者的直觉。你必须培养自己的判断力,学会判断一个类中有多少实例变量才算太大,一个函数内有多少代码才不算太长。”
——Martin Flower
3.1 改名
深思熟虑给函数,模块,变量和类命名,使其清晰的表明自己的功能和用法。
重构手法之一:改名(改变函数声明,变量改名,字段改名)
3.2 消除重复代码——提炼函数
同一个类的两个函数含有相同的表达式——提炼函数。
重复的代码段位于同一个超类的不同子类中——函数上移。
3.3 拆分过长函数
“活的最长,最好的程序往往都比较短”
“函数越长,就越难理解”
3.4 过长参数列表
- 如果发现几项参数经常出现,可通过引入参数对象将其合并为一个对象。(封装)
- 如果发现从现有的数据结构抽出很多数据项作为参数,不如直接传递完整的对象
- 以查询替代参数:可以像某个参数查询获得另一个参数的值。
3.5 全局变量
全局变量的问题:代码库的任何一个角落都可以修改,且无法探测。(代码病毒)
处理方法:封装变量。用函数封装起来,再搬到类或模块里,控制其访问权限。
3.6 发散式变化与霰弹式修改
发散式变化:遇到变化时固定修改某一部分代码。
霰弹式修改:代码的坏味道其中一种,遇到变化需要修改很多地方。
减小模块的耦合,实现模块的独立。在添加修改功能时实现代码变更的独立。
3.7 依恋情节
模块化:最大化区域的内部交互,最小化的跨区域交互。
依恋情节:一个函数和另一个模块的函数或者数据交流格外频繁,远胜于在自己内部的交流。
3.8 数据泥团
"两个类中相同的字段,许多函数签名中相同的参数...."
在必要时提炼类。引入参数对象,保持对象完整使之参数列表较短。
语义和形式的权衡。
3.9 使用多态替换switch
3.10 循环语句
以管道取代循环。
3.11 冗赘的元素
随着重构类变得越来越小,适时庄严赴义。
3.12 夸夸其谈通用性
如果用不到,就不值得。用不上的装置只会挡路。
3.13 中间人
封装往往伴随着委托。
委托应当适度,过度委托就会变成冗余。
3.14 过大的类
造成重复代码。
提炼类,提炼超类。
3.15 注释
“当你感觉需要写注释时,请先尝试重构。”
注释的应用场景:
- 这段代码做了什么
- 记录将来的打算
- 为什么做
Chapter 3 :代码的坏味道的更多相关文章
- 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- Bad Smell (代码的坏味道)
sourcemaking 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹.正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 "代码异味" ...
- 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- Refactoring之——代码的坏味道(一)过长方法
1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...
- 消灭 Java 代码的“坏味道”
消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...
- 代码的坏味道(22)——不完美的库类(Incomplete Library Class)
坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...
- 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)
坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...
- 代码的坏味道(20)——过度耦合的消息链(Message Chains)
坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...
- 代码的坏味道(21)——中间人(Middle Man)
坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...
随机推荐
- 解析XML数据,必看
xml源文件 <?xml version="1.0" encoding="UTF-8"?> <humans> <zhangying ...
- [java笔记] 最近学的一些笔记
1.@Override的用法 2.父类的返回值类型的范围,与子类返回值类型的返回的大小关系: 3.子类方法的权限修饰符,与子类方法的权限修饰符: 4.如果p1是一个对象,p2也是个对象,那么代码p1= ...
- nyoj 244-16进制的简单运算 (scanf("%x%c%x", &a, &b, &c); printf("%o", a ± b))
244-16进制的简单运算 内存限制:64MB 时间限制:1000ms 特判: No 通过数:12 提交数:13 难度:1 题目描述: 现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结 ...
- TreeMap树映射取出对象的方式
1.直接获取该TreeMap集合中的关系:entrySet() Map接口中的方法,返回值类型是该集合中的各个关系:返回值类型是:Set类型的Map.EntrySet类型:然后在通过Set集合中特有的 ...
- 多线程之美3一Java并发工具类
一.简介 1.1. Semaphore 信号量,见文知义,常用于并发控制中的限流作用,我理解是限定数量的共享锁机制.该共享资源最多同时可让n个线程访问,超过n个线程就阻塞等待,如有资源空闲, 唤醒其他 ...
- NLP 语义相似度计算 整理总结
更新中 最近更新时间: 2019-12-02 16:11:11 写在前面: 本人是喜欢这个方向的学生一枚,写文的目的意在记录自己所学,梳理自己的思路,同时share给在这个方向上一起努力的同学.写得不 ...
- 69道Spring面试题及答案
目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...
- 【RN - 基础】之FlexBox弹性布局
前言 弹性盒模型(The Flexible Box Module),又叫FlexBox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其能适应不同的屏幕,为盒装模型提供最大的灵活 ...
- Xtrabackup 增量备份 和 增量还原
目录 测试数据准备 进行全量备份 第一次增量插入一条数据 进行第一次增量备份 注意 第二次增量插入一条数据 进行第二次增量备份 注意 查看xtrabackup_binlog_info中的binlog位 ...
- centos 7 MysSQL 5.6.39 二进制安装
MySQL 5.6.39 二进制安装 CentOS 7 将默认数据库MySQL替换成了Mariadb. 这里会从系统的环境准备开始一步一步安装. 环境准备 系统版本 内核版本 IP地址 Centos ...