重构学习(一)
来源:互联网 发布:1个域名指向多个ip 编辑:程序博客网 时间:2024/05/15 17:45
- 文档编写:记录学习《重构 改善既有代码的设计》。时间久了发现程序员这个行业的魅力就是神秘。
- “我不是个伟大的程序员,我只是个有这一些优秀习惯的好程序员。”重构能够帮助我更有效地写出强健的代码。
一、重构
1.重构定义
- 名词形式:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
- 动词形式:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
- “重构就是在整理代码吗?”从某种角度上,是的。但是重构不止于此,因为它提供了一种更高效且受控的代码整理技术。
- 重构的目的是使软件更容易被理解和修改。你可以在软件内部做很多修改,但必须对软件可观察的外部行为制造成很小变化,或设置不造成变化。
- 使用重构技术开发软件时,你把自己的时间分配给两种截然不同的行为:添加新功能,以及重构。添加新功能时,你不应该修改既有代码,只是增加功能。通过测试,你可以衡量自己的工作进度。重构时你就不能添加功能,只管改进程序结构。此时,你不应该添加任何测试(除非发现之前的问题)。
2.为何重构
- 重构改进软件设计。贸然修改代码,程序将逐渐失去自己的结构。
- 重构使软件更容易理解。重构就是对程序的修改在不影响功能的前提下,使代码更简洁更易懂。
- 重构帮助找到bug。
- 重构提高变成速度。
3.重构的使用
- 使用重构技术开发软件时,你要把自己的时间分配给两种截然不同的行为:添加新功能,以及重构。
- 添加新功能:不应该修改既有代码,只管添加新功能。
- 重构:不在添加新功能,只管改进程序结构。
4.何时重构
- 三次法则:第一次做某件事时只管去做,第二次做类似的时会产生方案,但无论如何还是可以去做;第三次再做类似的事情,你就应该重构。
- 事不过三,三则重构。
- 添加功能时重构:当添加新功能时可以先进行重构。
- 修补错误时重构:如果收到一份错误报告,这就是需要重构的信号,因为显然代码还不够清晰—-没有清晰到让你能一眼看到bug。
- 复审代码时重构。
二、重构的重点
- 《重构改善既有代码的设计》中我觉得比较重要的东西就是Kent Beck的说法摘写,真的很厉害说的很清楚。
- 对于“为什么重构有用?”。程序编写不是牺牲明天为了完成今天的任务的编写。
- “是什么让程序如此难以了解?”
a.难以于都的程序,难以修改;
b.逻辑重复的冲虚,难以修改;
c.添加新行为时需要修改已有代码的程序,难以修改;
d.带负载条件逻辑的程序,难以修改。 - 我们希望程序:(1) 容易阅读;(2)所有逻辑都只在唯一地方指定;(3)新的改动不会危及现有行为;(4)尽可能简单表明田间逻辑;
- 对于“间接层和重构”。计算机科学是这样一门科学:它相信所有问题都可以通过增加一个间接层来解决。间接层的某些价值:
a.允许逻辑共享。比如一个子函数在两个不同的地方被调用,或超类中的某个函数被所有子类共享。
b.分开解释意图和实现。你可以选择每个类和函数的名称,这给了你一个解释自己意图的机会。类和函数内部则解释实现这个意图的做法。如果类和函数内部又以更小单元的意图来编写,你所写的代码就可以描述其结构中的大部分重要信息。
c.隔离变化。很可能我在两个不同地方使用同一对象,其中一个地点我想改变对象行为,但如果修改了它,我就要冒同时影响两处的风险,为此我做出一个子类,并在需要修改处引用这个子类,现在,我可以修改这个子类而不必承担无意中影响另一处的风险。
d.封装条件逻辑。对象有一种奇妙的机制:多态消息,可以灵活而清晰地表达条件逻辑,将条件逻辑转化为消息形式,往往能降低代码的重复、增加清晰度并提高弹性。
0 0
- 重构学习(一)
- 重构(一)
- 重构(一)
- 重构(一)
- 学习 重构--改善既有的代码 (一)
- 重构-------(一)重构杂谈
- 重构代码学习笔记一:重构的原则
- 重构代码学习笔记一:重构的原则
- 《重构》读书笔记(一)
- 重构原则(一)
- java重构(一)
- 说说什么是重构(一)重构的起点
- C++自制Redis 数据库 (十五)【重构】数据库学习(一)
- 由学习《软件设计重构》所想到的代码review(一)
- 重构-改善既有代码设计学习笔记(一)—代码的坏味道
- 学习《重构-改善既有代码的设计》一
- Android学习记录(一) 重拾Activity
- 不算重零开始的java学习(一)
- iBET Online Casino Bonus ADIDAS YEEZY Lucky Draw(ADIDAS YEEZY, iBET)
- 八.Kafka Consumer和 offset提交
- Oracle trunc()函数的用法
- 认识mvp代码风格
- 原型链-柯里化-记忆缓存
- 重构学习(一)
- JavaMail——进阶
- JavaWeb Apache Shiro 应用
- MSE等名词解释
- Jquery中的DOM操作 (五.包裹节点和属性操作)
- Archive for required library: proxool/proxool/0.9.0RC3/proxool-0.9.0RC3.jar' cannot be read or is no
- Vue模板
- ScrollView怎么判断是否滑动到了底部?
- 数据波动特征,数据离散型的数学公式