前段时间读过martin fowler的《重构 ,改善既有代码的设计 》,不禁感叹:他老人家绝对对得起大师这个名号啊!对于入行不久的程序员来说,读这本书对提高代码质量肯定有帮助。就重构这个话题,还和部门同事做了次交流,将交流时的文档整理在此仅作备忘。
软件的成本
N 年前, Yourdon 和 Constantine 在 Structured Design 一书中将经济学作为了软件设计的底层驱动力,软件设计应该致力于减少整体成本。
COST total = COST develop + COST maintain
COST maintain = COST understand + COST change + COST test + COST deploy
软件的维护成本占了软件总成本的大部分,想要节约软件成本就要从软件的维护成本下手,而维护成本中理解老代码和修改老代码又占了绝大部分。可见,提高代码可理解性是多么重要,这时重构闪亮登场,为我们改善代码可读性提供了指导性的一些原则和手法。
什么是重构
看看 Martin Fowler的定义:
在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。重构是一种有纪律的、经过训练的、有条不紊的程序整理方法,可以将整理过程中不小心引入错误的机率降到最低。本质上说,重构就是在代码写好之后改进它的设计。
--Martin Fowler
重构 【 名词 】 :对软件内部结构的一种调整,目的是在不改变软件之可察行为 前提下,提高其可理解性,降低其修改成本 。
重构 【 动词 】 :使用一系列重构准则(手法),在不改变软件之可察行为 前提下,调整其结构。
关键的一点是重构离不开单元测试,测试驱动开发的模式。在已有单元测试的基础上进行代码重构,小步前进。
另外一个比较好的建议是 Kent Beck所说的 两顶帽子 :使用重构技术开发软件时,你把自己的时间分配给两种截然不同的行为 : 「添加新功能」和「重构」。
重构的好处
• 使软件更容易理解
• 帮你找到 bug
• 提高编程速度
重构时机
•三次法则
•添加新功能时
•Bugfix 时
•Code review 时
重构与设计
重构与设计并不是矛盾的,而是互为补充的:
•所有的设计都不可能做到滴水不漏,这个时候就需要重构来堵设计的漏洞;
•不能依赖重构而不重视重构。
重构与性能
重构和性能优化是不同维度的手法,重构的目的是提示程序的可理解性和可维护性,而优化则是侧重提升性能。重构为了提高代码可读性往往还会导致性能不是最优,考虑“二八原则”,如果这段代码不会显著导致程序性能严重下降,我们选择重构。
坏味道及应对重构手法
• 重复的代码
– 提炼函数,提炼类,上移函数,塑造模板函数
• 过长函数
– 提炼函数,查询取代临时变量,函数对象取代函数,分解条件表达式
• 过大类
– 提炼类,提炼子类,提炼接口,以对象取代数据值
• 过长参数列
– 函数取代参数,引入参数对象,保持对象完整
• 发散式变化
– 提炼类
• 散弹式修改
– 搬移函数,搬移值域,将类内联
• 依恋情结
– 搬移函数,搬移值域,提炼函数
• 数据泥团
– 提炼类,引入参数对象,保持对象完整
• 基本型别偏执
– 以对象取代数据值,提炼类,引入参数对象,以对象取代数组,以类取代型别码,以子类取代型别码,以 State/Strategy 取代型别码
• Switch 惊悚现身
– 多态取代嵌套条件表达式,以 State/Strategy 取代型别码,以明确函数取代参数
• 平行继承体系
– 搬移函数,搬移值域
• 冗余类
– 内联类,折叠继承体系
• 夸夸其谈未来性
– 折叠继承,将类内联,移除参数,重命名函数
• 令人迷惑的暂时值域
– 提炼类
• 过度耦合的消息链
– 隐藏委托
• 中间转手人
– 消除中间人,将函数内联,以委托取代继承
• 狎昵关系
– 搬移函数,搬移值域,改双向关联为单向,以继承取代委托,隐藏委托
• 异曲同工的类
– 重命名函数,搬移函数
• 不完美的类库
– 引入外加函数,引入本地扩展
• 单纯数据类
– 搬移函数,封装值域,封装集合
• 被拒绝的遗赠
– 以委托取代继承
• 过多的注释
– 提炼函数
重构法则分类
重新组织函数
•提炼函数
•将函数内联化
•将临时变量内联化
•以查询取代临时变量
•引入解释性变量
•剖解临时变量
•移除对参数的赋值操作
•以函数对象取代函数
•替换算法
在对象间搬移特性
•
•搬移函数
•搬移值域
•提炼类
•将类内联化
•隐藏委托关系
•移除中间人
•引入外加函数
•引入本地扩展
重新组织数据
•自封装值域
•以对象取代数据值
•将实值对象改为引用对象
•将引用对象改为实值对象
•以对象取代数组
•将单向关联改为双向
•将双向关联改为单向
•以符号常量或字面常量取代魔法数
•封装值域
•封装集合
•以数据类取代记录
•以类取代型别码
•以子类取代型别码
•以 State/Strategy 取代型别码
•以值域取代子类
简化条件表达式
•
• 分解条件表达式
• 合并条件表达式
• 合并重复的条件判断
• 移除控制标记
•以卫语句取代嵌套条件式
• 以多态取代条件式
简化函数调用
•重新命名
•重新命名函数
•查询和修改分离
•以明确函数取代参数
•保持对象完整 •以函数取代参数
•引入参数对象
•以工厂函数取代构造函数
•以异常取代错误码
• 将查询函数和修改函数分离
处理概括关系
•值域上移
•函数上移
•函数下移
•值域下移
•构造函数本体上移
•提炼子类
•提炼超类
•折叠继承体系
•塑造模板函数
•以委托取代继承
•以继承取代委托
最后,附上ppt。[/size][/size]
分享到:
相关推荐
Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...
1.Java 并发编程从入门到精通...18.java代码重构 19.一线架构师实践指南 20.springCloud微服务实战 21.重构改善 如此多的书籍是作者辛苦整理,多年沉淀学习的成果,今日拿出分享给新秀程序员,和想进入开发编程的小白。
### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...
综上所述,《从Java到Kotlin:重构指南》是一本非常适合Java开发者学习Kotlin并进行代码重构的专业书籍。它不仅提供了丰富的理论知识,还有大量的实践案例供读者参考,是从事软件开发工作的专业人士不可多得的宝贵...
Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例
Java代码重构是一种优化编程实践,旨在改进代码的结构和可读性,而不改变其外部行为。重构对于提高软件质量和维护性至关重要,尤其是在大型项目中。以下是一些在Java重构中的关键原则和技巧,通过实例来展示如何应用...
Java代码重构是软件开发过程中的一个关键环节,它旨在改进代码的结构,提高代码的可读性和可维护性,而不改变其外部行为。这个过程对于长期的项目维护和团队协作至关重要。以下是对“Java代码重构要求简要汇总”文档...
java代码重构以前忽视了,最近在看 字字珠玑,相见恨晚
### Java代码重构:掌握优化现有代码的艺术 #### 引言 在软件开发的过程中,随着项目的不断演进,代码库往往会出现复杂度增加、可读性和可维护性下降的问题。这时,进行代码重构变得至关重要。重构是指在不改变...
Java代码重构是一个重要的软件开发实践,它涉及到对现有代码的改进,目的是提高代码的可读性、可维护性和整体质量,而不改变其外在行为。重构对于大型项目尤其关键,因为随着时间的推移,代码可能会变得复杂且难以...
Java代码重构系统1是一个专注于提升代码质量和可维护性的项目,主要目标是对Java代码进行格式、命名和结构的规范化。在代码重构过程中,遵循良好的编码规范是至关重要的,本项目选择了Google的代码规范作为标准。 ...
《重构改善既有代码的设计》是针对提升Java代码质量的重要参考书籍,它的核心思想在于如何通过重构技术来改善和优化现有的代码设计,使其更为简洁、易于维护和扩展。"重构"一词在软件工程领域指的是在不改变软件外部...
对于Java,这通常涉及到解析字节码并尝试重构为人类可读的.java文件。这个过程可能会丢失一些元数据,比如原始注释和精确的源代码结构,因为字节码不保留这些信息。 3. **常用的反编译工具**: - **JD-GUI**:这是...
以上就是关于Java代码重构、优化以及设计优化的一些关键点,这些知识不仅能提升代码质量,还能帮助开发者更好地应对项目中的各种挑战。通过深入学习《重构-改善既有代码的设计》这样的经典书籍,你可以进一步提升...
Martin Fowler所著的《重构:改善既有代码的设计》就是一本专注于Java语言重构实践的经典指南。 本书的核心是向读者传达重构的必要性和重构所能带来的诸多好处。书中详细阐述了重构的基本原理和操作技术,并且用...
Java重构是一种针对已有代码设计进行优化的技术,旨在提高代码的可读性、可维护性和整体结构,而不会改变其外部行为。在这个过程中,开发者通过一系列小型、精确的步骤改进代码,消除坏味道,提高设计质量,同时保持...
### Java代码重构的策略与技巧 1. **提炼方法**:将一段代码块封装成一个独立的方法,不仅可以减少代码重复,还能使逻辑更加清晰。这是重构中最基础也是最常用的技术之一。 2. **重命名变量和方法**:选择更具有...
代码/源操作/重构 Javadoc徘徊 组织进口 手动或保存时触发 使用Ctrl+Shift+v(Cmd+Shift+v在Mac上)将代码粘贴到Java文件中时。 类型搜索 代码大纲 代码折叠 代码导航 编码镜头(参考/实现) 强调 代码格式(按...
"重构Java代码简洁之道"的主题旨在探讨如何通过有效的重构技术提升代码质量、可读性和可维护性,同时保持代码的简洁性。这对于任何Java开发者来说,都是一个值得深入学习的课题。 重构是一种在不改变代码外在行为的...