代码质量管理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
理想与现实
软件缺陷的引入
• 世上本没有BUG • 随着功能的增加,便有了BUG • 老的BUG改了,可能引入新的BUG • 事实1: 我们的软件,在发布前,其实就已经百病缠身了。
烂代码的伤害
发现、修改和预防烂代码
• 疑问1:我们如何发现烂代码?
• 疑问2:烂代码要不要改呢?应该怎么改? – 但愿客户不要发现…… – 不影响功能,反正用户也看不到,不要改了 – 时间来不及了,我们下个版本再说吧
代码重构的基本技术
• 双重否定表肯定 – Example1.java
• 分解复杂判断、拆分函数 – Example2.java
• 引入契约式设计 – 对输入和输出进行验证,以确保系统不会出现我们所想象不到的异常和得不到我们想要的结 果。
• 使用多态代替条件判断 (Stock) • 恰当的使用设计模式
• 疑问3:如果烂代码不是先天性的,那是不是可以预防?
是谁把代码变烂? *大泥球 (Big Ball of Mud),是指杂乱无章、错综复杂、邋遢不堪、随意拼贴的大堆代码
制约程序员编写高质量代码的因素
• 对需求和设计的理解不透彻 • 对软件业务流程不熟悉 • 没有开发经验,不知道怎样的代码是好的 • 对开发工具或开发语言不熟悉 • 缺少监督体系或不重视质量评估 • 受情绪因素的影响等因素 • 其它非代码因素也起着关键作用
• 什么是策略模式? – 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独 立于使用算法的客户。
设计原则
• 设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混 在一起。
• 设计原则2:针对接口编程,而不是针对实现编程。 • 设计原则3:多用组合,少用继承。“有一个”可能比“是一个”更好。
样式分离; • 公用js操作归为全局外部js引用,文件内尽量使用匿名方法,达到结构与行为分离
可维护性
• 模块清晰,容易理解 – 函数不要超过100行 – 类不要超过1000行
• 不要硬编码 – 定义常量或配置文件修改常用属性 – Java 5 的枚举类型 – seperator()和pathSeperator()
你写过、见到过这样代码吗?
主动重构与被动重构 - Make the Change
• 顾客想要一些新功能,他们决定更改现有的做法。 • 必须升级现有版本以支持WIN7,不然用户将无法使用。 • 应对技术改变,我们必须更新代码,以便适用于新的协议。(Wap, Cloud…) • 我们学到了新的设计方法,能够使现有系统变得更好。 • ……
– 改进代码美观度 – 快捷寻找BUG – 提高开发速度 – 改进源码可读性 – 增加程序的可扩展性
修改代码的两种方法
重构的驱动力
• 软件开发的现实:时间紧,任务重,变化频繁,客户难伺候。 • 有时,为了达到一些目的(商业或非商业),我们不得不在需求没有完全确定的情况下,开始设
计。 • 初始设计不充分或是跟不上需求的变化。 • 编码不符合规范,缺少注释,质量低下。 • 频繁打补丁,维护成本不断升高。
实现2
• 建一个DUCK父类,实现公共方法。 • 各种不同的DUCK继承父类,若实现不同,则覆盖父类中的方法。
– 很多方法在子类中都要重写,效率不高。
策略模式 (Strategy Pattern)
• 什么是设计模式? – 模式不是代码,是历经验证的OO设计经验 – 大多数模式都着眼于软件变化的主题 – 模式不是被发明的,而是被发现的
同行评审(Peer Review)
• 何时:桌前检查之后 • 谁:若干程序员和测试人员、设计人员组成一个会审小组 • 做什么:讲解、阅读、讨论和争议,对程序进行静态分析的过程 • 目的:促进开发人员、测试人员之间的交流,发现源代码中的缺陷
动态单元测试
• 思考: • 我们为什么不爱写单元测试? • 单元测试真的有用吗? • 测多少才算够呢? • 如何写单元测试?
代码重构实例 —— Duck
•要求: 编写一个Duck类,根据不同的鸭子类型(Mallard, Redhead, Rubber, Decoy),实现Swim, Display, Fly 和Quack函数
实现1
• 每种DUCK各写一个类,分别实现方法。 – 有大量重复代码,复用率太低。 – 修改费力,需要大量测试。
桌前检查(Desk Check/Self Review)
• 何时:程序通过编译之后,进行动态单元测试之前 (在跑完静态测试之后,因为工具可以帮我们 做掉很多事情。)
• 谁:程序员自己 • 做什么:对源代码进行分析、检验,并补充相关文档,根据《编码规范》编写或调整自己的代码
符合编码规范 • 重点:工具无法覆盖到的问题
保持代码简洁
函数的第一规则是要短小,第二条规则是要更短小。 我无法证明这个断言,我给不出任何证实 了小函数更好的研究结果,我能说的是,40年来,我写过各种不同大小的函数,我写过另人憎恶 的长达3000行的厌物,也写过许多100行到300行的函数,我还写过20行到30行的。经过漫长的试 错,经验告诉我,函数就该小。
• 项目透明 • 团队共享 • 构建自动化
Hudson 首页
思考
• 什么是重构?什么情况下代码需要重构? • 重构有哪些好处? • 重构有哪些基本方法? • 如何重构你的代码?
什么是重构?
• 所谓重构(refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改。 • 重构并不是重写,重构可以改进程序的内部结构,从而提高代码体的可维护性。
代码质量管理
自我介绍
• 6年工作经验,主要从事J2EE系统开发、测试及构建工作。 • 对Web系统开发,自动化测试以及构建技术有较为深刻的理解。 近年来致力于软件质量保证及过
程改进。 • E-mail:tjБайду номын сангаасhz@163.com
议程
• 理想与现实 • 是谁把代码变烂 • 什么是好的代码 • 提升代码质量的方法和工具 • 代码质量的衡量 • 重构 • 讨论
——《代码整洁之道》
可变更性
• 代码复用 • 设计模式
• 单例模式 • 工厂模式 • 策略模式 • 复合模式 • MVC • 设计原则
提升代码质量:途径 + 步骤
单元测试
• 什么是单元测试? • 单元测试是针对软件设计的最小单位——程序模块,进行正确性检验的测试工作。 • 目的 发现每个程序模块内部可能存在的差错 • 测试范围 • 模块接口、局部数据结构、边界条件、独立的路径和错误处理
破窗理论
破窗效应
好代码的特性
可读性
• 代码整洁、规范 – 变量、方法命名规则 – 代码样式,缩进与换行 – 使用Eclipse的Format – 举例
• 写好注释和文档 – 注释也需要规范 – 自动导出Java Doc (详见Java编程规范)
注释的要求
• 1、文件头标注开发者、功能、开发时间、最后修改时间、修改详情; • 2、方法头标注功能、输出参数、输入参数; • 3、方法体内重要代码及疑难代码行内注释; • 4、if else类代码优先考虑标注,标注在右大括号之后; • 5、数据成员、数据操作分组,两者之间空一行区分; • 6、方法之间空一行; • 8、采用垂直对齐,tab缩进,以保证代码上下整齐; • 9、嵌套(如if else及for)一般不要超过三层;
单元测试
• 测试依据:详细设计
• 执行者:开发人员/白盒测试人员 • 步骤:
– 先静态检查分析 – 再动态运行代码,检查执行结果
静态分析工具
• PMD/FindBugs (Eclipse) • CheckStyle (Eclipse) • DevPartner (支持VS + Eclipse) • 建议:在代码Check-in之前自己先做好静态测试和桌前检查。Check-in就是要先Check再In。
回顾
• 理想与现实 • 是谁把代码变烂 • 什么是好的代码 • 提升代码质量的方法和工具 • 代码质量的衡量 • 重构 • 讨论
推荐资料
• 《高质量C++/C编程指南》 • 《代码简洁之道》 • 《Head First - Java设计模式》
讨论
携手共进,齐创精品工程
Thank You
世界触手可及
• STAF Framework
Junit 测试覆盖率
Junit 测试覆盖率
集成看板 – Sonar Apache Tomcat Memo: http://nemo.sonarsource.org/dashboard/index/50544?page_id=2
持续集成与每日构建
• 持续集成 – 持续编译 – 持续测试 – 持续整合
WEB开发中HTML的格式
• 普遍采用xhtml格式规范,并额外附加 • 除</head>与<body>之间空一行外其余无空行; • 标记垂直对齐加tab缩进,同一行字符过多情况下可将同一级标签换行; • 数据显示使用table,布局使用div,写好全局css样式引用,避免行内书写css,达到结构与
– JUnit – TestNG – CPPUnit
修复BUG的成本
功能/性能测试工具
• IBM Rational Functional Tester • HP Quick Test Pro • Selenium (Open Source)
• IBM Performance Tester • HP WinRunner/LoadRunner 11.00 • Jmeter/Grinder (Open Source)