红色有角F叔对《修改代码的艺术》的笔记(9)

红色有角F叔
红色有角F叔 (次元の呪い)

读过 修改代码的艺术

修改代码的艺术
  • 书名: 修改代码的艺术
  • 作者: Michael Feathers
  • 页数: 384
  • 出版社: 人民邮电出版社
  • 出版年: 2007-09-25
  • 解依赖
    依赖性往往是进行测试的最为明显的障碍。这表现在两个方面:一是难以在测试用具中实例化目标对象;二是难以在测试用具中运行方法。通常在遗留代码中你得先解依赖而后才能将测试安置到位。
    2016-09-27 23:32:32 回应
  • 时间紧迫,但必须修改
    新生方法:
    1. 确定修改点 2. 如果你的修改可以在一个方法中的一处地方以单块连续的语句序列出现,那么在修改点插入一个方法调用,而被调用的就是我们下面要编写的、用于完成有关工作的新方法
    只要你发现待添加的功能可以写成一块独立的代码,或者暂时还没法用测试来覆盖待修改方法时,我都建议你采用新生方法。这比往原方法中添加代码好多了。
    新旧代码被清楚地隔离开。这样即使暂时没法将旧代码置于测试之下,至少还能单独去关注所要做的改动,并在旧代码之间建立清晰的接口。
    新生类
    我们想要添加的只是一个小小的功能,可以将它放入一个现有的类中,但问题是我们无法将这个类放入测试用具。哪怕至少能将它编译进测试用具,也还能试着用新生方法技术,只可惜有时候连这点运气都没有。
    弄清这两种情况的关键在于认识到虽说它们之间的动机不同(一个是为了避免职责混淆,另一个则是因原类无法放入测试用具),但从结果来看其实并无显著区别。一个功能是否强大到足以成为一个新的职责,完全凭个人判断。
    2016-09-29 09:46:16 回应
  • 时间紧迫,但必须修改
    本章罗列了一系列技术,借助于它们,你无需将现有类纳入测试便可以对其进行修改。从设计的角度上讲,很难说清到底应该怎样来理解它。许多时候,这么做使得我们能够在新旧职责之间拉开一段距离。换句话说,我们正朝着更好的设计前进。然而在另一些情况下,之所以去创建一个新类唯一的原因就是我们想要编写受测试的新代码,而目前还没有时间将那个现有类纳入测试。这是个很现实的情况。当你在实际项目中这样做时,将会看到新的类和方法在旧的、巨大的类旁不断冒出来。但接下来会发生一件有趣的事情:一段时间后,你对于总是避开旧类庞大的身躯变得厌烦了,于是开始试图将它纳入测试中。而这项工作的一个成分就是去熟悉你要纳入测试的类,所幸的是,因此把它纳入测试也就变得越来越不可怕了。此外,这项工作的另一个部分就是要避开厌烦情绪。
    2016-09-29 10:23:09 回应
  • 修改时应该测试哪些方法
    倘若你的代码结构良好,则其中的大多数方法的影响结构也会比较简单。实际上,衡量软件好坏的标准之一便是,看看该软件对外部世界的相当复杂的影响能否由代码内的一组相对简单得多的影响所构成。
    进行影响推测的工具:
    每门语言中都存在所谓的“防火墙”,即能够阻止影响继续传播的语言结构。
    我们对影响的扩大范围的限制越是严厉,便起程序来就越容易,从而减少理解一段代码所需的前提知识。最极端的情况便是使用像 scheme 或 haskell 这样的函数式编程语言来编程。
    2016-10-03 19:28:39 回应
  • 影响和封装
    我在向人们展示本书中的一些解依赖技术时,他们常常会指出许多解依赖技术都破坏了封装性。没错,的确如此。... 封装有助于我们对代码进行推测。... 没错,打破封装会令代码中的影响推测变得更难,然而若是最终我们能够给出具有很好的说明和阐述作用的测试,情况就恰恰相反了。因为一旦一个类有了测试用例,就可以使用这些测试用例来更为直接地进行影响推测了。
    实际上封装与测试覆盖也并不总是冲突的,只不过,当它们真的发生冲突时,我会倾向于选择测试覆盖。通常它能够帮助我实现更多的封装。
    2016-10-03 19:33:15 回应
  • 目标测试
    许多特征测试就像定心丸一样。它们不去测试大量的特殊情况,而只是检验某些特定的行为是否存在。在一番移动或提取代码的重构之后,只要看到这些行为仍然存在,我们就可以放心地告诉自己:我们的重构保持了行为。
    2016-10-04 12:03:30 回应
  • 反省你们的交流或讨论
    在对付遗留代码时,我们一般都不愿看到系统里面再出现新的抽象了。
    代码基中一些其他代码也有很漂亮的,但大块大块的过程式代码仿佛对人有种催眠的魔力:吸引人再往里面加代码。
    实际编码可不像纸上谈兵那样只要意思到了就行,而是需要满足更强的约束,但若是在交流与实际编码之间没有一个牢固的共性,就得问问为什么了。
    2016-10-13 22:05:27 回应
  • 处理大类
    封装是好事情,但可别对测试人员这么说,他们可不这样想。过分庞大的类往往隐藏了过多的东西。
    职责识别
    关键是要能够看清职责并学习如何将它们很好地分离开来。
    我们并没有创造出新的职责,而仅仅是识别出本来就存在的职责。
    如果你迫切需要测试一个私有方法,那么该方法就不应该是私有的;如果将它改为公有会带来麻烦,那么可能是因为它本就应属于另一个独立的职责。
    寻找成员变量和方法之间的关系。“这个变量只被这些方法使用吗?”
    当一个类的接口呈现出负责多样事务的形态时,它就在接口层面违反了单一职责原则。
    然而我们最为关心的 SRP 违反是实现层面的。简单地说就是,我们关心的是该类是否真的做了这些事情,还是仅仅将其委托给其他的类来完成。如果属于后者,那么该类并不能算是一个巨大的单片类;而只不过是一大帮小类的“前端”,一个更容易掌控的 facade。
    2016-10-13 22:13:11 回应
  • 当你绝望时
    对付遗留代码是件苦差事,这一点没什么好否认的。尽管各自情况不同,但有衡量工作价值的方式是相同的:算算你能从中得到什么。对某些人来说也许是薪水——这没什么不好意思的,毕竟人人都得生活。但我认为肯定还有其他什么原因让你成为一个程序员的。
    要想在对付遗留代码时保持积极向上的心态,关键是要找到动力。尽管有很多程序员的生活都较小,但工作时有一个良好的环境,有你所尊敬的并且知道如何快乐工作的人做同事仍然是一个非常大的诱惑。
    如果你的团队士气低迷,而且是由于代码质量太低而低迷当饿,那么有个办法可以试一试——从项目中找出一组最糟糕的类,将它们置于测试之下。一旦你们作为一个团队共同克服了一个最困难的问题,那么就会感觉一切不过如此了。这种情况我经历得太多了。
    2016-10-18 22:16:50 回应

红色有角F叔的其他笔记  · · · · · ·  ( 全部654条 )

注定一战
1
美国反对美国
1
哲学·科学·常识
1
计算机组成(第 6 版)
2
图解TCP/IP(第5版)
1
沸腾十五年
2
重新理解创业
8
雄性衰落
3
股市真规则
1
资本和收入的性质
2
存在主义是一种人道主义
3
程序员的职业素养
1
何为良好生活
1
活出生命的意义
3
货币的教训
3
Docker——容器与容器云(第2版)
2
政治的人生
4
中国巨债
3
深入浅出React和Redux
5
历史的教训
4
聪明的投资者
8
Designing Data-Intensive Applications
4
投资中最简单的事
5
供给的逻辑
1
逃不开的经济周期
1
图解服务器端网络架构
1
斯坦福极简经济学
3
政治的逻辑
4
原则
5
大数据之路
1
在苍茫中传灯
4
巴菲特传(纪念版)
1
中产阶级如何保护自己的财富
1
指数基金投资指南
4
模式分类
2
深度学习
1
我看电商
2
数据挖掘导论
1
中国国家治理的制度逻辑
2
漫步华尔街
2
尽在双11:阿里巴巴技术演进与超越
2
共同基金常识
3
企业IT架构转型之道:阿里巴巴中台战略思想与架构实战
6
未来简史
2
MySQL DBA修炼之道
1
大国大城
2
计算广告
4
机器学习
1
集体智慧编程
1
重新定义公司
1
Hadoop应用架构
1
第二性
6
硅谷钢铁侠
1
大数据
5
经营的本质
1
人人都是产品经理
7
你凭什么做好互联网
4
Spark机器学习
2
聊聊架构
8
游戏引擎架构
1
美国大城市的死与生(纪念版)
5
给大家看的Photoshop讲座
1
技术的本质
5
我们房地产这些年
2
行动的勇气
2
合作的进化
5
马克斯·韦伯与德国政治:1890—1920
6
数据库索引设计与优化
1
精益企业
7
高可用MySQL
2
发布!软件的设计与部署
2
项目管理艺术
2
右派国家
5
现实感
4
领域驱动设计
11
从0到1
1
高效程序员的45个习惯
1
可扩展的艺术
3
空之境界 上
1
成为技术领导者
1
改革的逻辑
3
恰如其分的软件架构
7
软件开发者路线图
3
实现领域驱动设计
1
21世纪资本论
9
持续交付
16
构建之法
6
黑格尔导论
19
极端的年代
1
微服务设计
10
Site Reliability Engineering
5
测试驱动的面向对象软件开发
3
城市的胜利
2
对知识的恐惧
5
ZeroMQ
6
现代经济学主要流派
7
数学之美
2
程序员的思维修炼
1
大教堂与集市
1
一切坚固的东西都烟消云散了
5
兜售繁荣
1
数据科学与工程技术丛书
1
政治的细节(第10版)
8
发展研究指南(第二版)
2
代码大全(第2版)
2
企业应用架构模式
9
The Datacenter as a Computer
3
无情的革命
6
新教伦理与资本主义精神
3
人类简史
7
Understanding MySQL Internals
2
他改变了中国
1
态度改变与社会影响
4
复杂
2
民主新论
19
人件
2
国家的常识
4
乌合之众
3
Web Operations
2
个人印象
4
湖上闲思录
2
自由及其背叛
7
C++语言的设计与演化
8
百年中国经济史笔记
1
改变
4
创新与企业家精神
5
Cassandra
3
不敢止步
4
意志力
2
通向财务自由之路
1
制造同意
6
美国种族简史
4
NoSQL Distilled
4
理解专业程序员
2
一个自由主义者的良知
4
政治经济学要义
2
施瓦辛格健身全书
2
房地产的繁荣与萧条
5
为学十六法
2
Akka in Action
1
Java虚拟机并发编程
3
软件工艺
3
面向模式的软件架构,卷3
1
动物精神
4
非理性繁荣
10
MongoDB权威指南
2
海量数据库解决方案
1
Erlang/OTP并发编程实战
1
学术与政治
12
Java并发编程实战
16
论中国
3
金融炼金术
4
多处理器编程的艺术
1
Effective java 中文版(第2版)
1
中國近代史(下冊)
6
系统之美
6
压力下的角逐
2
古代东方史
1
Go 语言程序设计
1
Remote
1
深入Linux内核架构
2
中國近代史(上冊)
3
隐秩序
1
空之境界(上下集合售)
1
开放社会
4
中国近代史八种
5
喀提林阴谋 朱古达战争
1
政治秩序的起源
5
现代性的后果
2
失去的胜利
9
了不起的盖茨比
5
许倬云说历史:台湾四百年
2
大规模分布式存储系统
1
C++网络编程(卷1)
2
在约定的场所
1
中国的宗教
2
了不起的盖茨比
1
希腊罗马名人传(全三册)
2
自私的基因
2
学龠
1
中国政治思想史
4
列克星敦的幽灵
1
人月神话
2
现代体系结构上的UNIX系统
1
虚拟机
2
朱熹的历史世界
1