文档章节

重构随笔——重构的原则

人独立
 人独立
发布于 2016/07/21 16:15
字数 790
阅读 33
收藏 2
点赞 0
评论 0

重构的基本原则之一:不改变软件的可观察行为。

这一基本原则阐述的是我们在做重构的时候,维持外部的功能外观不变,让用户无法感知重构的变化。其实这很好理解,重构与添加新功能两者的角色仿佛总是对立的。添加新的功能与重构所做的事情应该恰恰相反:不应该修改既有的代码,只是添加功能而已。

我们总是在不知不觉中切换两者的角色,业务需求总是要我们添加新的功能,但是我们在开发过程中会发现,如果重构一下代码,可以更优雅的添加我们的功能。所以你会发现两者其实并非绝对对立:重构为了更好的增新,增新则会带来新的重构。

这与中国道家的阴阳理论不谋而合,“奇正相生,如循环之无端,孰能穷之。”没有一劳永逸的重构,在代码的编写上,重构与增新总是循环往复,交织在一起。分清你现在的角色就显得很重要了,重构的时候一定要牢记自己的原则与初衷,这样才不会在重构上偏的太远。

重构的时间原则:理论上,当你感觉到代码让你写起来觉得恶心的时候,意味着重构的时机已到。没有什么特定的时间去重构,想到了就去做,随时随地,不用为重构留出特意准备的时间,你会发现你定好的时间总是或早或晚,早了没有必要,晚了则承受了太多痛苦。但是在项目的开发中,我们总要遵循一定的规范,那么我建议是下面三个时机是最好的。

1.添加功能的时候。最重要的时机,你总会在新增功能的时候发现设计上不合理的时候,这是你可以体会你设计上优缺点最敏感的时候,不要错过这个时机。

2.修复BUG的时候。错误往往是由于你的设计不合理而产生的,设计上的不合理会让你产生对代码的误解,从而在修改代码的时候引入新的错误。如果你的项目中总是有一些无法一眼看到的BUG隐藏在角落里,那么这个时候你就需要考虑去重构你的代码。

3.审核代码的时候。审核代码一般都是很多人在一起或者是一个老手在审核你的代码,人们往往总是针对一个熟识的东西会无意识的过滤其优缺点。代码也是,我们需要别人给我们提供建议,他们的建议是站在别人的角度,这对于我们是尤为重要,代码是要给人读的,能写出给机器读的代码很容易,写出给人读的代码才是高手。

© 著作权归作者所有

共有 人打赏支持
人独立
粉丝 5
博文 39
码字总数 17213
作品 0
昌平
程序员
读《代码重构》一书小计

通过阅读《代码重构》一书,让我了解的最重要的一点是“重构不同于优化”。在这之前,我的观念中,“重构”与“优化”是划等号的。不过通过这本书,我了解到他们做着完全不同的事情,甚至是对...

钟良
2016/07/13
160
1
重构 - 代码整洁之道

作者简介 新茗 蚂蚁金服·数据体验技术团队 前言 之前也介绍过我们团队的前端项目从零开始经历8个月迭代业务代码10万行(仅为产品长期规划需求的20%),至今仍然在不断迭代的过程。 团队成员除...

01/14
0
0
.NET系列文章——近一年文章分类整理,方便各位博友们查询学习

由于博主今后一段时间可能会很忙(准备出书:《.NET框架设计—模式、配置、工具》,外加换了新工作),所以博客会很少更新; 在最近一年左右时间里,博主各种.NET技术类型的文章都写过,根据...

王清培
2014/03/02
0
0
重构(Ruby版)迷你书免费下载

《重构(Ruby版)》前言 差不多十年前,我(Martin)曾经和Kent Beck一起做过一个项目。这个项目的名字叫C3,它后来成为极限编程诞生的标志性项目,并帮助我们看清了敏捷软件运动的方向。 我们...

hzbook2010
2010/05/21
943
1
什么是重构,什么不是重构

有时候,会有程序员跑到我这里说他们不喜欢某个东西的设计,“我们需要给它来个全面的重构”,来纠正里面的错误。哦,哦。这听起来可不是个好主意。而且这听起来也不是重构… 重构(Refactor...

长平狐
2012/11/12
62
0
什么是重构,什么不是重构

有时候,会有程序员跑到我这里说他们不喜欢某个东西的设计,“我们需要给它来个全面的重构”,来纠正里面的错误。哦,哦。这听起来可不是个好主意。而且这听起来也不是重构… 重构(Refactor...

景德真人
2012/05/14
2.7K
14
代码重构方向原则指导

重构是 一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量。代码重构之于软件,相当于结构修改 之于散文。每次人们对如何对...

oschina
2013/10/21
5.5K
19
谈边做业务边做架构重构(4)—— 文武双全

引言 前面讲了那么多,看起来都是和项目管理相关的的,例如“有的放矢”是关于找目标的、“合纵连横”是关于沟通协调的、“运筹帷幄”是关于项目规划的。。。。。。架构师怎么变成了项目经理...

无寄语
2016/09/29
7
0
落地TDD,需要知道的

TDD TDD是个好东西,推广时,需从Why/what/how来说明别人,结合最近看的一些资料,来说明一下问题: 1、单元测试的理由 《[高效程序员的45个习惯:敏捷开发修炼之道》中已经对于单元测试好处...

通爸
2017/12/24
0
0
不要将时间浪费到编写完美代码上

一个系统的迭代开发可能持续运行5年至10年甚至是20年。相比之下,某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天,甚至当你为了解决一个问题迭代测试不同方案时它们的生命周...

oschina
2016/08/05
14.1K
69

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0
Python数据分析numpy基础-维度的认识

什么是多维数组? 核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。 概念: 1. axes(轴):数组的维度统称为轴。 2. rank:轴的数量称为rank。...

十年磨一剑3344
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部