refactoring Patterns(二):为什么要 Refactoring

Refactoring Improving the Design of Existing Code 重构—改善既有代码的设计,MartinFowler著 熊节译,北京:人民邮电出版社,2010.4 立即下载
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 为什么要去改变已经可以正确运行的软件?这样的改变是否影响到我们的设计,从而进一步改变我们对于面向对象系统进行设计的方法和思路?本部分试图回答这些问题。 Refactoring虽然需要更多的"额外工作",但是它给我们带来的各种好处显然值得我们做出这样的努力: 简化测试 一个好的Refactoring实现能够减少对新设计的测试量.因为Refactoring的每一步都保持可观察的行为,也就是保持系统的所有单元测试都能顺利通过。所以只有发生改变的代码需要测试.这种增量测试使得所有的后续测试都建立在坚实的基础之上,整个系统测试的复杂性大大降低。 更简单的设计 Refactoring降低初始设计的复杂程度.Gamma指出复杂设计模式的一个陷阱是过度狂热:"模式有其成本(间接性、复杂化),因此设计应该达到需求所要求的灵活性,而不是越灵活越好"。如果设计试图介入太多以后可能需要的灵活性,就会产生不必要的复杂和错误。Refactoring能够以多种方式扩展设计。他鼓励为手头的任务建立刚刚合适的解决方案,当新的需求来到时,可以通过Refactoring扩展设计。 Refactoring增进软件可理解性 程序的最终目的是为了指引计算机完成人们需要完成的事情。但是,要完成这个目标并非想象的那么容易。 程序编写是人的活动,人首先要理解才能行动。所以,源代码的另一个作用就是用于交流的工具。其他人可能会在几个月之后修改你的代码,如果连理解你的代码都做不到,他又如何完成所需的修改呢?我们通常会忘掉源代码的这种用处,尽管它可能是源代码更重要的用处。不然,我们为什么发展高级语言、面向对象语言,为什么我们不直接使用汇编语言甚至是机器语言来编写程序?难道我们真的在意计算机多花了几个CPU周期去完成一件事? 如果一个人能够理解我们的代码,他可能只需要一天的时间完成一个增加功能的任务,而如果他不理解我们的代码,可能需要花上一个礼拜或更长的时间。这里的问题是,我们在编写代码的时候不但需要考虑计算机CPU的想法,更要把以后的开发者放在心上。除非,你写代码的唯一目的就是把它丢掉。你不想让任何别的开发人员用到这段代码,包括你自己。因为你不可能记得所有你写过的代码,如果你经常回过头去看一下自己的代码,你就会体会到代码的可理解是如何重要。 Refactoring可以使得你的代码更理解,Refactoring支持更小的类、更短的方法、更少的局部变量、更小的系统耦合,Refactoring要求你更加小心自己的命名机制,让名字反映出你的意图。如果哪一块代码太复杂以至于哪一理解,你都需要对他进行Refactor。 你可能认为,反映代码的意图应当是注释和文档的责任。假设你写好了一段程序,给他加上注释,来说明你这段代码完成了什么。每次代码发生改变,你都需要修改注释。而其实代码本身应当足以说明这个问题。如果代码不能反映自己的意图,即使是再多的注释也不足以让你理解代码的所有机制,除非你把代码的每一句话都加上注释。甚之,这种重复的责任使得一旦注释和代码发生不一致,它反而会阻碍你对代码的理解。而任何一个程序员都不愿意写太多的注释和文档。所以Martin fowler说: When you feel the need to write a comment,first try to refactor the code so that any comment becomes superfluous。 Martin Fowler同时指出,Refactoring不但能够增加别人对你代码的理解,而且是一种非常好的理解别人代码,学习别人代码的方法。通常,当你拿到一大堆代码时,你可能会觉得一片茫然,不知道从何处开始。学习别人代码最好的方法就是对代码进行进行Refactor。如果你发现自己不能理解一段代码,那么试图使用对自己说,哦,这段代码可能是在做什么事情。给他一个有意义的名字,refactor它。Refactor使得你对代码的理解不是仅仅停留在脑袋中,而是看到代码确实按照你的理解再发生变化。如果你的refactor改变了系统的行为,那么说明你的理解还有问题。你必须返回重来。 Refactoring 改进软件的设计 许多人把编程看作是一种低级活动。他们认为代码仅仅是设计的附属物。然而正是代码,而不是你脑袋里或纸上的设计,真正驱动计算机完成你想做的事情。而绝大多数的bug也产生于编码阶段。 很多方法学认为通过分析和设计的严格化就能产生更高质量的软件,这实际上是不可能的。正如Brain Foote和Joseph Yoder在《Big Ball of MUD》一文中指出,虽然许多作者提出了很多理想上非常完美的体系结构,如Layer、PIPELINE等等。但在实践中,几乎从来都不能看到这么结构清晰的系统。 这一方面是由于分析和设计一个领域的应用程序需要对该领域丰富的知识,而这种知识不是在一开始都能获得的。我们通常需要在实践反馈的过程中才能一步步加深自己对该领域的理解。因而,我们一开始的设计可能并不能正确反映系统的内在本质,所以也不可能在代码中得到很好的反映。 另一方面,即使一开始的设计是完好的,随着用户对系统使用的深入,新的需求可能会被加入,旧的需求会被修改、删除。一个最先的设计不可能完全预料到这些变化。 一旦实现开始偏离最初的设计,那么它的代码将不受控制,从而不可避免地开始腐蚀。代码加入越多,腐蚀的速度越快。如果没有办法让设计尽可能地与实现保持一致,那么这种腐蚀的最后结果就是代码不得不被抛弃。 但是让代码实现和设计始终保持一致并非那么简单,在传统的软件方法中,一旦开发到了实现阶段,就很难对设计做出变化。所以最近发展的面向对象方法学把增量迭代(iterative)作为一个基本原则。 也许是题外话,在目前最为时行的一些"重型"软件方法学中,我们很难找到对迭代(包括设计的迭代)明确的支持、定义和操作过程,以及如何提高程序员适应这种动态开发能力的方法。在我看来,重型的软件方法学即使能够对软件开发起到一定的作用,他也不可能包罗万象,解决软件开发中的所有问题。开发方法学重视生命周期管理和控制,但软件的开发并不只有过程和生命周期,更重要的是,同时往往被"正规"的软件方法所忽略的是,软件开发是人的活动。不管你的过程控制是多么的严格,不管你的生命周期模型是多么的完美,如果不能提高人的生产力,提高产品的质量,那么一切都是毫无意义的。 在这里,要实现这样一种增量迭代的开发模型,你必须能够让分析人员、设计人员、程序人员、测试人员等等,所有参于开发活动的人有能力或者能够有切实可行的方法来实现迭代,实现增量。如果不是这样的话,你无法随时保持实现和设计之间的一致性,无法把编码实现中所发现的不合理设计反馈到初始设计,也无法在需求变化时对实现所产生的影响准确及时地得到反映。 如果没有切实可行的基本方法来支持迭代中所需要的改变,那么迭代将是非常困难的.我们可以设想,一旦新的需求到达,新的一轮迭代开始,而原先的系统设计被证明无法适应现在的变化,这个时候你如何能够使得迭代顺利地以增量的方式进行下去? Refactoring提供了对incremental iterative development最好的支持。随着系统的演变,代码的结构越来越差,通常这意味着要完成一件事情需要更多的代码。很多情况,通常缘于在几个不同的地方都有类似的代码。因此Refactoring最重要的课题之一就是排除重复。我们通过排除重复力求能够达到Once And Only Once的境界。而它正是好设计的一个基本标准。Once and Only Once虽然不能直接提高软件的效率,但却让代码的修改和理解变得更为容易、系统的结构更加清晰。它是消除代码腐蚀的最佳途径。 Refactoring 帮助你寻找 Bug 帮助理解代码同时也可以帮助你发现bug。很多代码处于系统中一些非常微妙的地方。如果你只是一遍又一遍地阅读代码,恐怕你永远也找不到bug。有的时候,你使用IDE提供的工具也难以跟踪这样的bug。因为如果你的代码没有很好的结构,譬如一个类具有太多的责任,那么它必然具有太多的状态,在调试程序的时候,你同样需要注意太多的现象。 你可以用refactoring使得程序代码的结构更清晰,每一个时刻可以更集中关注专一的数据和行为,这会使你的工作量大大减少。同时,由于refactoring要求small steps,并且对每一步都进行严格的测试,这样会使得bug很容易地浮现出来。 Refactoring 让你编程更快 在了解refactoring后,你可能承认refactoring能够改进软件的质量、设计、结构、可读性,减少bug,但是你会认为运用refactoring技术进行软件开发有可能减慢你的开发速度。毕竟,你要编写额外的单元测试,你要去refactor的代码本来就能够工作的代码。 那么,为什么要如此麻烦?他不会拖我的进度吗? 事实上,Refactoring确实能够加快软件的开发速度。一个好设计的基本前提就是允许更快的软件开发。说得更绝对一点,好设计的全部就是它是否能够更快、更灵活地支持软件的变化。如果没有一个好的设计,一开始你可能可以开发得很快,但是随着功能的增加,你的代码逐渐腐蚀,结构渐渐失去。每次当你需要加入新功能时,你必须花大量的时间去理解原来的代码,修改原来代码的bug。改变一项功能需要花费越来越长的时间。 Refactoring支持好的结构、设计和理解性,它让你更快地开发软件。因为它可以防止软件的侵蚀,他甚至用于改进设计。 关于作者 石一楹,现任浙江大学灵峰科技开发公司技术总监。多年从事OO系统分析、设计。现主要研究方向为Refactoring和分析模式。你可以通过shiyiying@hotmail.com和我联系。
 

代码太容易变坏,重复代码随处可见,特别是那些初看相似细看又不同的

代码泛滥于整个系统:

条件表达式,循环结构、集合枚举.....信息被共享于系统一些关系甚少的

组成部分之间,通常,这使得系统中几乎所有的重要信息都变成全局或者重复。

解决这个问题的最好办法当然是让它不要发生。然而,要阻止代码的腐化,

你需要付出额外的代价。每次在修改或增加代码之前,你都要看一看手上的这些代码。

如果它很好的话,那么你应该能够很方便地加入新的功能。如果你需要花很长的时间

去理解原来的代码,花更长的时间去增加和修改代码。

那么,先放下手里的活,让我们来做 Refactoring。 



一.Refactoring 介绍 

二.Refactoring 理由 

三.Refactoring 问题 

四.Refactoring 困难 

五.Refactoring 方法 

六.Refactoring 与软件设计 

七.Refactoring 场合与命名规则 



中文JAVA技术网重新整理发布

Refactoring - Improving the Design of Existing Code 经典的书籍,系统的讲授了软件重构。。。。 用Java语言描述。。。 立即下载

相关推荐

Refactoring Improving The Design of Existing Code

Refactoring Improving The Design of Existing Code 重构已有代码

真专家其实是热情、厚道的

每次回杭州总能有很多收获,这次尤甚,感谢博文视点周筠老师在会议开始的前几天提供会议信息,使我得以成行。 见到“真正的技术大会” 参加过很多技术大会,但大都是由厂商主导,比如IBM的DW大会,MS的TechED,BEA的eWorld等,并不是说这些会议不好,而是说其内容难免会染上太多厂商的味道,失却些中立性。所以阿里巴巴这次能安排这么大、非盈利的大会,确实让人振奋。怀着一种美好的愿望来揣测马

编辑空间 2905

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3947

重构模式4

refactoring Patterns:第四部分 内容:不应 Refactoring 的场合实施Refactoring可能碰到的阻碍以及解决方案学习Refactoring获得短期效益削减Refactoring的额外开销安全

xxcc的专栏 1448

带隙基准电路设计实战:从HSPICE仿真到Virtuoso版图全流程解析

在模拟集成电路设计中,基准电压源是确保系统精度与稳定性的核心模块。其基本原理在于巧妙结合具有正、负温度系数的电压,通过加权求和实现近似零温度系数的稳定输出,这一特性对于高精度数据转换器、电源管理芯片等至关重要。从工程实践角度,利用HSPICE进行深入的直流工作点、温度扫描和工艺角仿真,是验证电路性能、优化温度系数和电源抑制比的关键步骤。而借助Cadence Virtuoso进行版图实现时,必须重点关注电阻与BJT的匹配布局、敏感节点的保护以及电源完整性设计,以确保设计意图在硅片上得以准确呈现。通过完整的从前

weixin_29181861的博客 288

利用Skipper跨层追踪技术高效定位LVS Short问题

本文详细介绍了如何利用Skipper跨层追踪技术高效定位LVS Short问题。通过解析Skipper的跨层trace net原理和实战操作步骤,帮助芯片设计工程师快速识别版图中的短路问题,显著提升验证效率。文章还提供了处理大规模设计的高级技巧和常见问题排查方法。

weixin_29239661的博客 510

重构模式5

refactoring Patterns:第五部分 内容:增量迭代Moving Target拥抱变化-Refactoring和XP参考资料关于作者相关内容:该系列的其他部分

xxcc的专栏 1284

安卓模拟器绕过检测全解析:雷电、MuMu、蓝叠、逍遥、夜神与WSA完整指南

随着手机游戏和应用的普及,越来越多的用户选择在PC上通过模拟器来运行安卓应用。然而,许多应用和游戏为了防止作弊或出于安全考虑,会检测是否运行在模拟器环境中。本文将详细介绍各大主流模拟器的检测绕过方法,帮助用户在电脑上流畅体验各类安卓应用。1. 获取模拟器系统镜像2. 使用ROM厨房工具修改系统文件3. 替换模拟器的系统镜像雷电模拟器:适合游戏,推荐使用MAGISK + EdXposed方案MuMu模拟器:适合中度游戏,推荐太极框架蓝叠模拟器:适合国际应用,推荐MAGISK方案逍遥模拟器。

专注技术分享 3万+

杭州ERPTAO组织成功举办第一次技术讲座

2004年2月28日,在浙江大学软件学院和优快云网站的大力支持下,ERPTAO组织在浙大成功地举办了第一次软件技术讲座。有上百名专业软件开发者及爱好者到场参加,两位主讲人熊节(也就是我本人)和石一楹为大家送上了关于重构思想及O/R mapping技术的演讲,现场气氛相当热烈。稍后我们会按照签到表上的email地址给到场听众发送今天的讲义及相关资料,并在网上提供下载。今后我们会不定期地经常举行

透明思考@优快云 2511

ARINC429协议分析

如下表所示,ARINC429在发送一帧过程中,首先发送以START开始,以END结束,共发送32bits数据,其中0~7bits为Lable数据,9~8bits为SDI数据,10~28bits为数据,29~30bits为SSM,31bit为校验位End30292827262524校验位SSM2322212019181716DATA15141312111098SDI7654321Start。

5223

「自然语言驱动生产力」23. 科研神器:DeepSeek+EndNote实现文献智能综述

摘要:传统文献综述面临周期长、漏检率高、数据整合繁琐等痛点,某985课题组数据显示,4人团队完成一篇综述平均需5个月,重要成果遗漏率达25%。本文提出基于DeepSeek+EndNote的智能综述方案,通过“自然语言解析→精准检索→智能筛选→自动生成”四步流程实现全自动化。核心技术包括检索式智能生成算法、文献优先级评分模型、可视化图表自动生成工具及结构化综述框架引擎。实际应用中,文献调研周期从3-6个月缩短至2周,重要成果遗漏率降至3%以下,图表制作时间完全解放。某课题组采用该方案后,1人3周完成的综述被A

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1667

Role分析模式(二)角色对象创建和管理

概要Role Object(一)提出对解决Role问题的基本方法,但是我们还有许多问题需要深入,这些问题包括如何创建具体的Role实例,如何管理这些角色并实现角色之间的约束。 Role Object提出了对解决Role问题的基本方法,但是我们还有许多问题需要深入,其中的一个问题是如何创建具体的Role实例。动机对Role的创建有几个基本的需求。前面我们使用角色的名字作为Specification来

ivanlovetracy::伊凡::的专栏 1894

菱Q系列串行通信模块QJ71C24N:概述与特点

该模块支持多种串行通信协议,包括RS-232、RS-422和RS-485等,并提供了可靠的数据传输和高效的通信性能。菱Q系列串行通信模块QJ71C24N是一款功能强大的模块,具有多种通信协议支持、高速数据传输、多点通信能力和简化配置与使用等特点。简化配置和使用:QJ71C24N模块具有简单易用的配置工具和用户界面,使得用户能够快速进行模块的设置和调整。高速数据传输:QJ71C24N模块提供了高速的数据传输能力,可实现快速的数据交换和通信。本文将介绍QJ71C24N模块的概述和特点,并提供相应的源代码示例。

IunScala的博客 1937

Refactoring to Patterns 读书笔记(二)

用 Factory 模式封装具体类对于在一个包中实现了同一接口的具体类,不必让客户代码来直接地实例化这些实现类,应该创建一个 Factory 类来负担这样的责任。这样做的好处是: 1. 遵守了“面向接口编程,而非面向实现编程”的原则。 2. 减轻了代码中的“概念负担”(conceptual weight)。使用 Factory 类屏蔽有关包内实现类的细节,客户代码就只需要了解接口和 Facto

I SEE STARS 1262

thinkphp6/8 - 实现评论区发表评论、回复评论功能数据库表设计与整个逻辑思路过程分析,tp5 评论盖楼等功能(附带源码稍加改造即可使用)

tp5评论区数据库表设计,tp5发表回复评论功能设计,thinkphp5如何做评论功能,tp5 php评论区实现发表回复删除评论,tp5评论区盖楼源码及数据表设计思路,thinkphp评论功能详细教程,thinkphp实现评论与回复功能,thinkphp实现文章评论和回复评论功能,tp5实现评论回复功能,thinkphp如何实现评论区,tp5网站PC移动端h5怎么做评论区发表留言及回复功能,thinkphp实现评论区插件,thinkphp评论区相互发表回复功能详细教程,thinkphp有没有评论区的组件插件

✅ 精选推荐文章 3160

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【重构获得模式 Refactoring to Patterns】

现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而更好地应对需求的变化”。“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。

代号1998的专栏 1538

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

refactoring Patterns:第二部分

refactoring Patterns:第二部分为什么要 Refactoring  为什么要去改变已经可以正确运行的软件?这样的改变是否影响到我们的设计,从而进一步改变我们对于面向对象系统进行设计的方法和思路?本部分试图回答这些问题。Refactoring虽然需要更多的"额外工作",但是它给我们带来的各种好处显然值得我们做出这样的努力:简化测试一个好的Refactoring实

flyelf的专栏 966

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

refactoring Patterns:第三部分

本文紧接第二部分,继续讲述应用 refactoring 应该考虑的问题。任何一种技术都可能有它自己的麻烦。但是往往在我们使用一种新技术的时候,可能还不能深入到发现它带来的问题,正如Martin Fowler所说:在学习一种能够极大提高生产力的新技术时,你很难看到它不能应用的场合。他把Refactoring的情景和面向对象出现使得情景相比较:情况恰如10年前的对象。不是我不考虑对象有限制。只

flyelf的专栏 1040

refactoring Patterns:第一部分

refactoring Patterns:第一部分       这是关于refactoring思考的第一部分内容。本文将介绍refactoring的基本概念、定义,同时解释正确、安全进行refactoring需要坚持的几个原则介绍代码太容易变坏。代码总是趋向于有更大的类、更长的方法、更多的开关语句和更深的条件嵌套。重复代码随处可见,特别是那些初看相似细看又不同的代码泛滥于整个系统:条件表达

flyelf的专栏 1085

《Refactoring to patterns》

同学推荐的一本书,看完觉得挺不错的,作者的一个重要思想是应当在出现性能、复杂度较高难于维护等问题时,利用patterns对代码进行重构。和《Refactoring》一书类似,全书对于重构过程的描述非常细致,不同的是书中示例都是作者的经验结晶,重构过程浓缩着作者对于模式的深刻理解,读起来更为生动、自然。实践和理论相结合,是计算机这行必须遵循的一个原则,如果不能像书中所述那样细致的一步一步进行重构,就

飞光流影 1025

Refactoring Patterns (Second Part)

为什么要 Refactoring 石一楹 (shiyiying@hotmail.com)浙江大学灵峰科技开发公司技术总监2001 年 12 月为什么要去改变已经可以正确运行的软件?这样的改变是否影响到我们的设计,从而进一步改变我们对于面向对象系统进行设计的方法和思路?本部分试图回答这些问题。Refactoring虽然需要更多的"额外工作",但是它给我们带来的各种好处显然值得我们做出这样的努力:简化

glietpku的专栏 774

refactoring Patterns:第四部分

任何一种技术都不是万能的。正象设计模式,合理的运用可以极大地提高设计的效率和美感,再不适当的场合运用就会产生所谓的反模式。我们的refactoring亦然。但是,作为一种强有力的设计演变工具,refactoring值得我们付出努力。不能因为对新技术的恐惧而放弃这样的工具,我在这里对可能出现抗拒情绪的一些问题进行了解释。不应 Refactoring 的场合程序原型当你原型化一个系统时,你

flyelf的专栏 1046

refactoring Patterns第七部分

虽然refactoring几乎可以随时进行,然而,按照我们关于两顶帽子的原则,在某些场合下,refactoring的介入显得更加实际、有意义、富有成效。另外,在最后进入Refactoring实践之前,我把Kent Beck和Martin Fowler给我们的忠告和建议放在这里。这些内容,特别是Code Smell和命名规则不但对我们进行refactoring具有很强的实践意义。同时,他们也促使

flyelf的专栏 1005

Refactoring Patterns (Seventh Part)

内容:Refactoring 应用的场合Refactoring和命名参考资料关于作者相关内容?lt;/B>该系列的其他部分Refactoring场合和基本命名规则 石一楹 (shiyiying@hotmail.com)浙江大学灵峰科技开发公司技术总监2001 年 12 月虽然refactoring几乎可以随时进行,然而,按照我们关于两顶帽子的原则,在某些场合下,refactoring的介入显得更加

glietpku的专栏 764

《重构与模式》(Refactoring To Patterns)中文版 JPG

http://www.verycd.com/topics/205321/

mowengaoboa的博客 389

Refactoring Patterns (First Part)

refactoring Patterns:第一部分内容:介绍什么是Refactoring?Refactoring原则参考资料关于作者相关内容:该系列的其他部分

天行健 ● 君子以自强不息 1317
上一篇: refactoring Patterns(三):问题
下一篇: refactoring Patterns(四):困难
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值