遗留代码

关键词:遗留代码,代码修改,测试

概述

从其他人或者其他版本获得的代码。

特点

架构设计差

代码风格不一致

文档少和模糊

非常有价值,成功代码

修改遗留代码原因

新功能

Bug

重构

优化

修改

Risky change 修改风险

  • What changes do we have to make? 哪些是必须修改的内容
  • How will we know that we’ve done them correctly? 修改正确吗
  • How will we know that we haven’t broken anything? 修改无副作用吗

加快理解代码实现

  • Notes/Sketching     笔记和草图
  • Listing markup       搜索所有关键字
  • Scratch refactoring    重构
  • Delete unused code   删除次要代码

如何防止破坏代码

  • 隔离新代码
  • 新生方法 (sprout method)
  • 包裹方法(wrap method)

Sensing & separatin 感知和隔离

修改耗时的原因:

  • 理解设计和代码
  • 修改副作用检查
  • 编译时间
  • 无单元测试
  • 测试反馈慢(feedback slow)

修改正确吗

  • Hyperaware editing      小心翼翼修改
  • Single-goal editing       修改高度内聚,一次只改一个功能
  • Preserve signatures      签名修改
  • Lean on the compiler     使用编译器检查修改

工具和流程

流程

  • Mindset/Books    思想,书
  • Code                   一起编码
  • TDD/BDD            单元测试
  • Code Coverage   代码覆盖率
  • CI                           代码集成
  • Static Analysis    代码静态分析
  • Code Review        代码评审

工具

Lexical analysis

命名, 代码风格

Flow/path analysis

空指针,无用代码

C++ - Covtool, gcov

C++ - CppUTest.  so mycoworkers don‘t break my codes. 防止同事误操作

Dependency analysis

架构

C++- (Sp)Lint

Verification

C++- Jenkins (Shell/Make)

单元测试,保持代码整洁

? test individual units                                              测试粒度

? isolate each part                                                  隔离每个单元

? show that the individual parts are correct       正确性验证

? regression testing                                               回归测试

? sort of living documentation                              动态文档

? executed within a framework                            自动化框架

It‘s an hard work but (usually) not impossible !

参考

Working.Effectively.with.Legacy.Code

时间: 2024-10-11 04:18:47

遗留代码的相关文章

遗留代码的测试

遗留代码的测试 在大多时候代码的测试很难,因为很多代码无法进行参数注入,那么这个时候有一款不受限的隔离框架TypeMock供你使用,不过遗憾这款软件是付费的一个隔离框架,有15天的免费使用权,如果能解决你现有的问题我想这份费用并不能算多.TypeMock的官方下载http://www.typemock.com/.下面开始看看TypeMock是怎么样使用的. 1:伪造一个静态的方法来看一个例子 被测试的静态方法 public static int DoSomethingSpecialOnALeap

对历史遗留代码的维护和再开发

一.时间宽松时的代码维护 对于新人,一般都会留出一段时间进行代码的接手,那么对于如何处理接到手中的代码,是不是只是看看代码.写写心得,还是能够利用这段空闲时间,煅炼提升自己,我期望是后者,结合公司部门的情况,对这种情况进行个人阐释: 1.对现有代码的熟悉.若是对拿到手中的代码,都不知道是做什么的,有什么用,可能就什么意义也没有,后面的也不用看了. 2.加入或者补充测试用例,若是没有测试用例,后面的重构基本上是没办法进行判断是否正确的. 3.用测试用例对代码进行测试,以期达到相关效果和理解代码逻辑

应用MVP模式对遗留代码进行重构

AV(Autonomous View)自治视图 在面向终端用户的应用中,都需要一个可视化的UI来与用户交互.这个UI称为View视图. 在早期,我们习惯将所有前台的逻辑,与视图揉在一起,称为AV自治视图. 这些逻辑包括:数据呈现(Display),用户动作的扑捉与响应,数据存储等. 在.Net的Winform和ASP.NET Web Form中,采用的都是事件驱动模型. AV是将所有UI相关的逻辑都注册到视图本身,或者视图元素对应的事件上. 人机交互应用的3个关注点. 数据在UI上的展示. UI

跟遗留代码打交道:干掉顽固漏洞的简单方式

事实证明,跟遗留代码打交道未必需要花费数天时间去研究晦涩难懂的注释.要想找到并修复漏洞,开发者可采用简单的测试工具来对问题抽丝剥茧. 跟遗留代码打交道会是比较困难的,尤其是如果代码是由某位不知道名字的程序员用一种不熟悉的语言编写的话.但跟据Mob Programming 的R Jason Kerney 和Llewellyn Falco的说法,遗留应用中的bug是可以相对迅速地发现和修补好的,这个过程只需要若干相当直截了当的技巧. "我通常是没有机会去理解(遗留)代码的,所以我必须想出办法在不理解

重构遗留代码(1):金牌大师

旧代码,丑陋的代码,复杂的代码,意大利面条似的代码,鬼话废话……就是四个字:遗留代码.这是一个系列文章,将有助于你处理并解决它. 在理想的世界中,你只会写新代码.你会把代码写得既漂亮又完美.你将永不会再看你的代码,并且你将永远不会维护一个有十年之久的项目.在理想的世界中… 不幸的是,我们生活在现实的而非理想的世界.我们必须理解修改和增强年代久远的代码这件事.我们必须处理遗留代码.那么你还在等什么?让我们一头扎进第一篇教程,拿着代码,读懂一点点,并为了我们日后的修改编织一张安全网. 遗留代码的定义

读《软件驱魔》调试和优化遗留代码的艺术

读<软件驱魔> 调试和优化遗留代码的艺术 软件维护方法论的书,其间还有作者的感悟,读起来情深意切啊 此书中文版,第一版是2014年5月 内容给人感觉作者早已成书多年了.但软件知识还是有不过时的东西. 软件发展到现在,在我们身边,已经可以发生着许多书中的故事. 如大量的历史代码无人维护或者是开发人员不可寻且没有文档,没有流程图等等. 在这种情况下,作者指点读者去如何做更有益. 用了许多方法,并科学的介绍了不只一种方法. 收益良多. 还介绍了可能会出现的人员交流的问题.这种问题我在工作中也是常遇到

对遗留代码的解依赖技术

参数适配 使用场景:当无法对一个参数的类型使用接口提取,或者该参数难以被"伪装"时. 例如,该参数的类型是一个含有很多方法的接口类型.在进行单元测试时必须编写一个实现该接口的实现类. 可以使用Mock. 问题:从维护的角度来看,传递了一个宽接口,而其实方法内部只使用了该接口的部分契约. 所以,应该尽量使用窄接口来替代宽接口. 分解出方法对象 使用场景:若方法规模太大,或者使用了实例变量或者其他方法. 将大方法移到一个新类中,因为该类仅含有一个方法成员,所以称为方法对象. 可以方便地对方

资深程序员冒死揭开软件潜规则:无法维护的代码

原始博文发布于: Roedy Green's Mindproducts (http://mindprod.com/unmain.html ). 翻译链接: 点击打开链接 2014年11月25日 03:11 如何编写无法维护的代码 让自己稳拿铁饭碗 ;-) Roedy Green 简介 永远不要(把自己遇到的问题)归因于(他人的)恶意,这恰恰说明了(你自己的)无能. -- 拿破仑 为了造福大众,在Java编程领域创造就业机会,兄弟我在此传授大师们的秘籍.这些大师写的代码极其难以维护,后继者就是想对

深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

才华横溢的Stoyan Stefanov,在他写的由O’Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会是件很美妙的事情.具体一点就是编写高质量JavaScript的一些要素,例如避免全局变量,使用单变量声明,在循环中预缓存length(长度),遵循代码阅读,以及更多. 此摘要也包括一些与代码不太相关的习惯,但对整体代码的创建息息相关,包括撰写API文档.执行同行评审以及运行JSLint.这些习惯和最佳做法可以