改善既有的代码-重构(ppt)-课件
改善既有的代码-重构(ppt)-课件

重构与设计
重构可以从很大程度上去扶助设计,通常情况 下我们的设计不是能贯穿我们软件开发的全过 程的,在这个过程中,我们的需求变更的可能 性非常大,当需求变了,设计也得变,但是我 们已有的实现怎么办?全部废除?显然不能! 这时候就要依靠重构来解决这种矛盾。
重构与性能
关于重构,有一个常被提出的问题:它对程序的性能 将造成怎样的影响?为了让软件易于理解,你常会作 出一些使程序运行变慢的修改。这是个重要的问题。 我并不赞成为了提高设计的纯洁性或把希望寄托于更 快的硬件身上,而忽略了程序性能。已经有很多软件 因为速度太慢而被用户拒绝,日益提高的机器速度亦 只不过略微放宽了速度方面的限制而已。但是,换个 角度说,虽然重构必然会使软件运行更慢,但它也使 软件的性能优化更易进行。关键在于自己的理解,当 你拥有了重构的经验,你也就有能力在重构的基础上 来改进程序的性能。
重构技术
成都智政数据科技有限公司 主讲人:郑雪林
主要内容
重构介绍 重构原则 代码的坏味道 重构技巧 Q&A
名言
任何一个傻瓜都能写出计算机可以理 解的程序,只有写出人类容易理解的 程序才是优秀的程序员 – Martin Fowler
什么是重构
Refactoring是对软件内部结构的一种调整,目 的是在不改变外部行为的前提下,提高其可理 解性,降低其修改成本。
double perimeter = 2 * (_height + _width); System.out.println (perimeter); double area = _height * _width; System.out.println (area);
Remove Assignments to Parameters(移除对参数的赋值)
重构-改善既有代码的设计总结

重构-改善既有代码的设计总结(JAVA)重构目的:1.改变既有代码的架构,使架构更加清晰。
2.提取相同的代码,提高代码的复用率,减小项目本身的大小。
3.改善代码的逻辑,使代码更加精炼和高效,进而纵向效率。
重构注意事项1.测试,一定要编写单元测试(JUnit),修改任何一个变量,方法,类或者接口都必须需要测试。
2.编写代码之前,一定要整理好重构的思路和步骤,按照思路和步骤编写代码和测试相应的代码。
3.动机,确定自己重构的动机,重构完成后检查重构的效果(是否达到预期的效果)。
重构原则:1:DRY(Don't repeat yourself)即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。
如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要在两个以上的地方使用一个代码块,那么可以将它设为一个独立的方法。
SOLID设计原则的优点是易于维护,但要注意,不要滥用,duplicate 不是针对代码,而是针对功能。
这意味着,即使用公共代码来验证OrderID和SSN,二者也不会是相同的。
使用公共代码来实现两个不同的功能,其实就是近似地把这两个功能永远捆绑到了一起,如果OrderID改变了其格式,SSN验证代码也会中断。
因此要慎用这种组合,不要随意捆绑类似但不相关的功能。
2:封装变化在软件领域中唯一不变的就是“Change”,因此封装你认为或猜测未来将发生变化的代码。
OOPS设计模式的优点在于易于测试和维护封装的代码。
如果你使用Java编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从private 到protected和not public.有几种Java设计模式也使用封装,比如Factory设计模式是封装“对象创建”,其灵活性使得之后引进新代码不会对现有的代码造成影响。
3:开闭原则即对扩展开放,对修改关闭。
这是另一种非常棒的设计原则,可以防止其他人更改已经测试好的代码。
改善计划ppt课件

制定安全管理制度
7
人才老化,职工队伍缺少梯队培养,缺 根据企业发展规划,招聘适应企业要求的年轻
乏发展后劲
员工充实职工队伍,做到老中青合理搭配。
8
个人素养
技术力量薄弱,产品缺乏更新换代,缺 加大技术人才的引进和培养,尤其注重自动控
乏市场竞争力
制方面的人才的储备和培养
人才是企业最大的资源。只有有了人才, 才能使老产品不断更新换代和不断开发适 应市场需求的新产品,并以此来提升公司
烟台XXXXXX
2018.4. 共 10 项
总
论
烟台XXXX机械有限公司经过十五年的发展,已经发展成为玻璃制造设备行业知名企业, 但是由于行业竞争激烈,产品技术含量较低,以前粗放式管理模式已经完全不适应目前企 业和社会发展的需求。公司决策层经过深思熟虑,决定对企业进行彻底的管理模式改革, 将企业以前的粗放的作坊式管理模式逐步向具有初步的现代企业管理模式转变,使企业无 论从运营管理模式还是从产品技术含量,都能产生质的飞跃,以适应工业装备高品质智能 化的要求,从而逐步将烟台XX公司打造成玻璃制造设备行业的知名企业。
老产品优化设计 新产品设计开发 产品制造工艺优化(作业指导书)
根据市场反馈及考察 情况,单独制定工作
计划
长远计划,逐 步推进
结束语
一个企业的发展成长受很多因素的制约,但是只要具备创新的思维和理念,就一定能时刻走在行业 的前端,成为行业的引领者!
思维变则万变 没有规矩不成方圆
此课件下载可自行编辑修改,供参考! 感谢您的支持,我们努力做得更好!
4
生产现场6S管理混乱
制定6S规范及考核制度,定期进行考核督导
5
生产管理及
生产车间没有区域划分,车间布局不合 理,不但影响美观,而且降低工作效率
重构改善既有代码的设计

重构改善既有代码的设计最近接⼿⼀个项⽬,源代码的架构和许多设计都有坏的味道。
想要重构,但是⾃⼰并没有⾜够的底⽓.⼀、重构的纠结:(1)现有代码可⽤,你重构后是否会⽐现在更有效率;(2)项⽬进度⽐较紧,你是否要抽出时间做这种没有KPI的⼯作;(3)你重构后,别⼈需要重新阅读你的源代码,给同事带来了重新学习代码的⼯作量;(4)项⽬是否能够持续,如果没有需求,不⽤了,你还重构什么?(5)你是否要在这个公司待很久,等重构完后,你可能都不在了。
⼆、如果不重构,确实会给开发带来很⼤困难:原代码就像是⼀个打满了补丁的棉袄,它可以保暖,但是很难定位到哪⾥漏风,即使定位到了,不过是新打些补丁,但是缝缝补补的⼯作可能没有尽头。
(1)修改很耗精⼒;(2)BUG花样迭出(3)扩展性差,持续开发跟进需求很难;(4)应变能⼒差,牵⼀发动全⾝。
重构或不重构,这是个问题,直到看了《重构改善既有代码的设计》,给了我很⼤启发。
粗略看了⼀遍,道理明⽩了⼀些,我之前的想法应该叫做重写⽽不是重构。
重构是逐步改善的过程,是重写与打补丁的中间选项。
当然看完书之后,我还是选择了重写,因为项⽬还不是很⼤,重写做起来⼯作量更⼩⼀些。
重构的核⼼还是使代码尽量遵循设计模式的六⼤原则:(1)单⼀职责原则(2)⾥⽒替换原则(3)依赖倒置原则(4)接⼝隔离原则(5)迪⽶特法则(6)开闭原则重构中⽤到的⽅法,是写代码过程中很好的参照。
⽅法都写在2-13章的⽬录⾥了,意思⽐较明显,闲来的时候看看,也⼤有裨益。
第2章重构原则2.1何谓重构532.2为何重构552.3何时重构572.4怎么对经理说602.5重构的难题622.6重构与设计662.7重构与性能692.8重构起源何处71第3章代码的坏味道3.1 DuplicatedCode(重复代码)763.2 LongMethod(过长函数)763.3 LargeClass(过⼤的类)783.4 LongParameterList(过长参数列)783.5 DivergentChange(发散式变化)793.6 ShotgunSurgery(霰弹式修改)803.7 FeatureEnvy(依恋情结)803.8 DataClumps(数据泥团)813.9 PrimitiveObsession(基本类型偏执)813.10 SwitchStatements(switch惊悚现⾝)823.11 ParallelInheritanceHierarchies(平⾏继承体系)833.12 LazyClass(冗赘类)833.13 SpeculativeGenerality(夸夸其谈未来性)833.14 TemporaryField(令⼈迷惑的暂时字段)843.15 MessageChains(过度耦合的消息链)843.16 MiddleMan(中间⼈)853.17 InappropriateIntimacy(狎昵关系)853.18 AlternativeClasseswithDifferentInterfaces(异曲同⼯的类)853.19 IncompleteLibraryClass(不完美的库类)863.20 DataClass(纯稚的数据类)863.21 RefusedBequest(被拒绝的遗赠)873.22 Comments(过多的注释)87第4章构筑测试体系4.1⾃测试代码的价值894.2 JUnit测试框架914.3添加更多测试97第5章重构列表5.1重构的记录格式1035.2寻找引⽤点1055.3这些重构⼿法有多成熟106第6章重新组织函数6.1 ExtractMethod(提炼函数)1106.2 InlineMethod(内联函数)1176.3 InlineTemp(内联临时变量)1196.4 ReplaceTempwithQuery(以查询取代临时变量)1206.5 IntroduceExplainingVariable(引⼊解释性变量)1246.6 SplitTemporaryVariable(分解临时变量)1286.7 RemoveAssignmentstoParameters(移除对参数的赋值)1316.8 ReplaceMethodwithMethodObject(以函数对象取代函数)1356.9 SubstituteAlgorithm(替换算法)139第7章在对象之间搬移特性7.1 MoveMethod(搬移函数)1427.2 MoveField(搬移字段)1467.3 ExtractClass(提炼类)1497.4 InlineClass(将类内联化)1547.5 HideDelegate(隐藏“委托关系”)1577.6 RemoveMiddleMan(移除中间⼈)1607.7 IntroduceForeignMethod(引⼊外加函数)1627.8 IntroduceLocalExtension(引⼊本地扩展)164第8章重新组织数据8.1 SelfEncapsulateField(⾃封装字段)1718.2 ReplaceDataValuewithObject(以对象取代数据值)1758.3 ChangeValuetoReference(将值对象改为引⽤对象)1798.4 ChangeReferencetoValue(将引⽤对象改为值对象)1838.5 ReplaceArraywithObject(以对象取代数组)1868.6 DuplicateObservedData(复制“被监视数据”)1898.7 ChangeUnidirectionalAssociationtoBidirectional(将单向关联改为双向关联)197 8.8 ChangeBidirectionalAssociationtoUnidirectional(将双向关联改为单向关联)200 8.9 ReplaceMagicNumberwithSymbolicConstant(以字⾯常量取代魔法数)2048.10 EncapsulateField(封装字段)2068.11 EncapsulateCollection(封装集合)2088.12 ReplaceRecordwithDataClass(以数据类取代记录)2178.13 ReplaceTypeCodewithClass(以类取代类型码)2188.14 ReplaceTypeCodewithSubclasses(以⼦类取代类型码)2238.15 ReplaceTypeCodewithState/Strategy(以State/Strategy取代类型码)2278.16 ReplaceSubclasswithFields(以字段取代⼦类)232第9章简化条件表达式9.1 DecomposeConditional(分解条件表达式)2389.2 ConsolidateConditionalExpression(合并条件表达式)2409.3 ConsolidateDuplicateConditionalFragments(合并重复的条件⽚段)2439.4 RemoveControlFlag(移除控制标记)2459.5 ReplaceNestedConditionalwithGuardClauses(以卫语句取代嵌套条件表达式)250 9.6 ReplaceConditionalwithPolymorphism(以多态取代条件表达式)2559.7 IntroduceNullObject(引⼊Null对象)2609.8 IntroduceAssertion(引⼊断⾔)267第10章简化函数调⽤10.1 RenameMethod(函数改名)27310.2 AddParameter(添加参数)27510.3 RemoveParameter(移除参数)27710.4 SeparateQueryfromModifier(将查询函数和修改函数分离)27910.5 ParameterizeMethod(令函数携带参数)28310.6 ReplaceParameterwithExplicitMethods(以明确函数取代参数)28510.7 PreserveWholeObject(保持对象完整)28810.8 ReplaceParameterwithMethods(以函数取代参数)29210.9 IntroduceParameterObject(引⼊参数对象)29510.10 RemoveSettingMethod(移除设值函数)30010.11 HideMethod(隐藏函数)30310.12 ReplaceConstructorwithFactoryMethod(以⼯⼚函数取代构造函数)30410.13 EncapsulateDowncast(封装向下转型)30810.14 ReplaceErrorCodewithException(以异常取代错误码)31010.15 ReplaceExceptionwithTest(以测试取代异常)315第11章处理概括关系11.1 PullUpField(字段上移)32011.2 PullUpMethod(函数上移)32211.3 PullUpConstructorBody(构造函数本体上移)32511.4 PushDownMethod(函数下移)32811.5 PushDownField(字段下移)32911.6 ExtractSubclass(提炼⼦类)33011.7 Extract Superclass (提炼超类) 33611.8 Extract Interface (提炼接⼝) 34111.9 Collapse Hierarchy (折叠继承体系)34411.10 FormTemplateMethod(塑造模板函数)34511.11 Replace Inheritance with Delegation(以委托取代继承)35211.12 Replace Delegation with Inheritance (以继承取代委托)355第12章⼤型重构12.1 Tease Apart Inheritance (梳理并分解继承体系)36212.2 Convert Procedural Design to Objects (将过程化设计转化为对象设计)368 12.3 Separate Domain from Presentation (将领域和表述/显⽰分离)37012.4 Extract Hierarchy (提炼继承体系)375。
Java代码优化ppt课件

reference类型在32位系统上每个占用4bytes, 在64位系 统上每个占用8bytes。
19
100个entries,cost 8.6k, 实际的double=2*100*8=1.6k
20
Double=16+8,double=8,67%额外开销
21
TreeMap包括: 48bytes+n*40bytes(entry)
Cache分类实现 1.AlarmCache封装了活动告警/1409/清除告警的插入,活动放7天,清除3小时
2.AlarmCFPCache<cfp,fpList>增加本地缓存,提升查询效率
14
DW缓存优化 封装完,代码量依然很大,而且日志不方便,继续拆分:
1.alarmService负责写操作,cacheService负责读操作
3、找到优化的关键点
这是有效优化的关键。找到项目中与你的目标(性能、资源或其他)相背的地方,并将你的努力和 时间用在那里。举一个典型的例子,一个Web项目速度比较慢,开发者在优化时将大部分精力放在了数 据库优化上,最终发现真正的问题是网络连接慢。另外,不要分心于容易实现的问题。这些问题尽管很 容易解决,但可能不是必要的,或与你的目标不相符。容易优化并不意味着值得你花费工夫。
2、选择正确的优化指标
选择正确的指标,是优化的一个重要组成部分,你需要按照这些指标来测量优化工作的进展情况。如 果指标选择不恰当,或者完全错误,你所做的努力有可能白费了。即使指标正确,也必须有一些辨别。 在某些情况下,将最多的努力投入到运行消耗时间最多的那部分代码中,这是实用的策略。但也要记住, Unix/Linux内核的大部分时间花费在了空循环上。需要注意的是,如果你轻易选择了一个很容易达到的 指标,这作用不大,因为没有真正解决问题。你有必要选择一个更复杂的、更接近你的目标的指标。
重构与模式

译者序设计模式代表了传统的软件开发思想:好的设计会产生好的软件,因此在实际开发之前,值得花时间去做一个全面而细致的设计。
重构代表了敏捷软件开发的浪潮:软件并不是在一开始就可以设计得完美无缺的,因此可以先进行实际开发,然后通过对代码不断的进行小幅度的修改来改善其设计。
二者从不同角度阐述了设计的重要性。
重构是实现设计模式的一种手段,设计模式往往也是重构的目的。
Martin Fowler序重构其实就是循序渐进的进行较大的修改。
前言重构:改善既有代码设计的过程模式:针对反复出现的问题的经典解决方案建议使用模式来改善既有的设计,要优于在新的设计早期使用模式。
建议通过一系列低层次的设计转换,也就是重构,来应用模式,改进设计。
第1章本书的写作缘由应该通过重构实现模式、趋向模式和去除模式(refactoring to, towards, and away from pattern),而不是在预先设计中使用模式,也不再过早的在代码中加入模式。
这技能避免过度设计,又不至于设计不足。
过度设计:代码的灵活性和复杂性超出所需。
项目中每人负责一块会使每个人都在自己的小天地工作而不关注别人是否已经完成了自己所需,最终导致大量重复代码。
设计不足产生的原因:程序员没有时间,没有抽出时间,或者时间不允许进行重构程序员在何为好的软件设计方面知识不足程序员被要求在既有系统中快速的添加新功能程序员被迫同时进行太多项目长期的设计不足,会使软件开发节奏变成“快,慢,更慢”,可能的后果是:系统的1.0版本很快就交付了,但是代码质量很差系统的2.0版本也交付了,但质量低劣的代码使我们慢下来在企图交付未来版本时,随着劣质代码的倍增,开发速度也越来越慢,最后人们对系统、程序员乃至使大家陷入这种境地的整个过程都失去了信心到了4.0版本时或者之后,我们意识到这样肯定不行,开始考虑推倒重来测试驱动开发和持续重构提供了一种精益、迭代和训练有素的编程风格,能够最大程度的有张有弛,提高生产率。
精益改善项目实例PPT课件

TP Process and Its Sample 改善项目流程及其样例
Design Phase Introduction 设计阶段介绍
第22页/共53页
TP Process and Its Sample 改善项目流程及其样例
Planning Phase Introduction 计划阶段介绍
第13页/共53页
A Brief Review of Lean Basic
CIP 持续改善
第14页/共53页
Agenda
A Brief Review of Lean Basic 精益基础知识回顾
15 minutes
TP Process and Its Sample 精益改善项目流程
45 minutes
Planning phase 计划阶段 1. 计划阶段的主要工作:
* 确定需要采取的改善行动区域的优先顺序; * 识别项目中工作任务分解后的工作包(WBS); * 识别资源需求及资源的可获得性; * 工作任务的职责确立; * 制定项目监督机制、制定行动计划等, * 通过计划这些活动从而可以制定出一套推行计划和对应的职责。 2. 该推行计划获得管理层的承诺以及推行小组签署该推行计划,来增加这些人 员的紧迫感和责任意识,使得接下来的推行阶段更加顺畅。 3. 值得借鉴的一条经验是要快速推行,以便打破旧有的模式如工作习惯、流程 等。
Mindset& Capability
第5页/共53页
A Brief Review of Lean Basic LHT three elements of success factors 汉莎精 益 管 理 三 要 M素anagement Infrastructure 管理基础
重构-改善既有代码的设计:简化函数调用 (八)

重构-改善既有代码的设计:简化函数调用(八)函数的名称未能揭示函数的用途。
修改函数名称。
大力提倡的一种编程风格是:将复杂的处理分解成小函数。
但是,如果做得不好,这会使你费尽周折却弄不清楚这些小函数各自的用途。
要避免这种麻烦,关键就在于给函数起一个好名称。
函数的名称应该准确表达它的用途。
给函数命名有一个好办法:首先考虑应该给这个函数写上一句怎样的注释,然后想办法将注释变成函数名称。
你常常无法第一次就给函数起一个好名称。
如果你看到一个函数名称不能很好地表达它的用途,应该马上加以修改。
你的代码首先是为人写的,其次才是为计算机写的。
而人需要良好名称的函数。
如果给每个函数都起一个良好的名称,也许你可以节约好多时间。
起一个好名称并不容易,需要经验;要想成为一个真正的编程高手,起名的水平至关重要。
当然,函数签名中的其他部分也一样重要。
如果重新安排参数顺序,能够帮助提高代码的清晰度,那就大胆地去做。
还有Add Parameter (添加参数)和Remove Parameter (移除参数)这2项武器。
某个函数需要从调用端得到更多信息。
为此函数添加一个对象参数,让该对象带进函数所需信息。
Add Parameter (添加参数)是一个很常用的重构手法。
使用这项重构的动机很简单:你必须修改一个函数,而修改后的函数需要一些过去没有的信息,因此你需要给该函数添加一个参数。
需要说明的是:不使用本项重构的时机。
除了添加参数外,你常常还有其他选择。
只要可能,其他选择都比添加参数要好,因为它们不会增加参数列的长度。
过长的参数列是不好的味道,因为程序员很难记住那么多参数而且长参数列往往伴随着坏味道:数据泥团(Data Clumps)。
请看看现有的参数,然后问自己:你能从这些参数得到所需的信息吗?如果回答是否定的,有可能通过某个函数提供所需信息吗?你究竟把这些信息用于何处?这个函数是否应该属于拥有该信息的那个对象所有?看看现有参数,考虑一下,加入新参数是否合适?也许你应该考虑使用Introduce Parameter Object (引入参数对象)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
何时重构?
添加新功能时一并重构
为了增加一个新的功能,程序员需要首先读懂现有 的代码。
修补错误时一并重构
为了修复一个Bug,程序员需要读懂现有的代码。
Code Review时一并重构
何时不该重构?
代码太混乱,设计完全错误。与其Refactor,不如重 写。 明天是DeadLine
永远不要做Last-Minute-Change。推迟Refactoring,但不可 以忽略,即使进入Production的代码都正确的运行。 一个Task的计划是3天,如果为了Refactoring,需要更多的 时间( 2天或更多)。推迟Refactoring,同步可以忽略。可 以把这个Refactoring作为一个新的Task,或者安排在 Refactoring的Iteration中完成。
重构技术
成都智政数据科技有限公司 主讲人:郑雪林
主要内容
重构介绍 重构原则 代码的坏味道 重构技巧 Q&A
名言
任何一个傻瓜都能写出计算机可以理 解的程序,只有写出人类容易理解的 程序才是优秀的程序员 – Martin Fowler
什么是重构
Refactoring是对软件内部结构的一种调整,目 的是在不改变外部行为的前提下,提高其可理 解性,降低其修改成本。
Refactoring的工作量显著的影响最后期限
两顶帽子
,你不应该修改既有代码,只管添加 新功能。 重构时你就不能再添加功能,只管改进程序结构。 此外你不应该添加任何测试(除非发现有先前遗漏 的东西) 两顶“帽子”可同时进行,一会重构,一会添加新 功能。
重构技巧
重新组织你的函数 在对象之间搬移特性 重新组织数据 简化条件表达式 简化函数调用 处理概括关系
<重新组织你的函数>
Extract Methods(提炼函数1)
String name = request.getParameter("Name"); if( name != null && name.length() > 0 ){ String name = request.getParameter("Name"); ...... if( !isNullOrEmpty( name ) ){ } ...... } String age = request.getParameter("Age"); String age = request.getParameter("Age"); if( age != null && age.length() > 0 ){ if( !isNullOrEmpty( age ) ){ ...... ...... } }
if (basePrice() > 1000) return basePrice() * 0.95; else return basePrice() * 0.98; ... double basePrice() { return _quantity * _itemPrice; }
Introduce Explaining Variable (引入解释性变量)
为什么重构
Refactoring可以提高开发速度
Refactoring对设计和代码的改进,都可以有效的提 高开发速度。好的设计和代码质量实体提高开发速 度的关键。在一个有缺陷的设计和混乱代码基础上 的开发,即使表面上进度较快,但本质是试延后对 设计缺陷的发现和对错误的修改,也就是延后了开 发风险,最终要在开发的后期付出更多的时间和代 价。 项目的维护成本远高于开发成本.
boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1; boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1; boolean wasResized = resize > 0; if (isMacOs && isIEBrowser && wasInitialized() && wasResized) { // do something }
为什么重构
提高代码质量,更易被理解
容易理解的代码可以很容易的维护和做进一步的开 发。即使对写这些代码的程序员本身,容易理解代 码也可以帮助容易地做修改。程序代码也是文档。 而代码首先是写给人看的,让后才是给计算机看的。
为什么重构
Refactoring帮助尽早的发现错(Bugs)
Refactoring是一个code review和反馈的过程。在 另一个时段重新审视自己或别人代码,可以更容易 的发现问题和加深对代码的理解。 Refactoring是一个良好的软件开发习惯。
Split Temporary Variable(剖解 临时变量)
double temp = 2 * (_height + _width); System.out.println (temp); temp = _height * _width; System.out.println (temp);
为什么重构
改进软件的设计。
程序员对代码所做的为了满足短期利益代码改动, 或再没有完全清楚增个架构下的改动,都很容易是 代码失去它的清晰结构,偏离需求或设计。而这些 改动的积累很容易使代码偏离它原先设计的初衷而 变得不可立即和无法维护。 Refactoring则帮助重新组织代码,重新清晰的体现 结构和进一步改进设计。
重构与模式
那么真正要实现重构时,我们有哪些具体的方法呢? 可以这样说,重构的准则由很多条,见《重构》这本 书。但它不是最终的标准,因为你要是完全按照它的 标准来执行,那你也就等于不会重构,重构是一种武 器,而真正运用武器的高手是没有武器胜有武器。只 有根据实际的需要,凭借一定的思想,才能实现符合 实际的重构,我们不能被一些固定的模式套牢了,这 样你的程序会很僵化。究竟如何把握这个度,需要大 家去总结。
Replace Temp with Query(以 查询取代临时变量)
double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98;
double perimeter = 2 * (_height + _width); System.out.println (perimeter); double area = _height * _width; System.out.println (area);
Remove Assignments to Parameters(移除对参数的赋值)
void printDetails (double outstanding){ System.out.println ("name: " + _name); System.out.println ("amount " + outstan }
Inline Method(将函数内联化)
Inline Temp(将临时变量内联化)
if ( (platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0 ) { // do something }
void printOwing() { //print banner System.out.println(“*********”); System.out.println(“Banner”); System.out.println(“*********”); //print details System.out.println ("name: " + _name); System.out.println ("amount " + getOutstanding()); } void printOwing(){ printBanner(); printDetails(getOutstanding()); } void printBanner(){ System.out.println(“*********”); System.out.println(“Banner”); System.out.println(“*********”); }
冗赘类(Lazy Class)
夸夸其谈未来性(Speculative Generality) 令人迷惑的暂时值域(Temporary Field) 过度遇合的消息链(Message Chains) 中间转手人(Middle Man) 狎昵关系(Inappropriate Intimacy) 异曲同工的类(Alternative Classes with Different Interfaces) 不完善的程序库类(Incomplete Library Class) 纯粹的数据类(Data Class) 被拒绝的遗赠(Refused Bequest) 过多的注释(Comments)
Refactoring的流程