




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、控制圈复杂度的9种重构技术-Refactoring: Improving the Design of Existing Code控制圈复杂度:重构可以直接降低圈复杂度的9种重构技术(针对结构化编程):Composing Methods(重新组织你的函数)Extract Method(提炼函数)Substitute Algorithm(替换你的算法)Simplifying Conditional Expressions(简化条件表达式)Decompose Conditional(分解条件式)Consolidate Conditional Expression(合并条件式)Consolidate
2、Duplicate Conditional Fragments(合并重复的条件片断)Remove Control Flag(移除控制标记)Making Method Calls Simpler(简化函数调用)Separate Query from Modifier(将查询函数和修改函数分离)Parameterize Method(令函数携带参数)Replace Parameter with Explicit Methods(以明确函数取代参数)- Refactoring: Improving the Design of Existing Code针对面向对象编程:Replace Conditi
3、onal with Polymorphism(以多态取代条件式)Extract Method(提炼函数)void printOwing(double previousAmount) Enumeration e = _orders.elements(); double outstanding = previousAmount * 1.2; / print banner System.out.println (*); System.out.println (* Customer Owes *); System.out.println (*); / calculate outstanding whi
4、le (e.hasMoreElements() Order each = (Order) e.nextElement(); outstanding += each.getAmount(); /print details System.out.println (name: + _name); System.out.println (amount + outstanding);void printOwing(double previousAmount) printBanner(); double outstanding = getOutstanding(previousAmount * 1.2);
5、 printDetails(outstanding);void printBanner() / print banner System.out.println (*); System.out.println (* Customer Owes *);double getOutstanding(double initialValue) double result = initialValue; Enumeration e = _orders.elements(); while (e.hasMoreElements() Order each = (Order) e.nextElement(); re
6、sult += each.getAmount(); return result;void printDetails (double outstanding) System.out.println (name: + _name); System.out.println (amount + outstanding);将这段代码放进一个独立函数中,并让函数名称解释该函数的用途你有一段代码可以被组织在一起并独立出来Substitute Algorithm(替换你的算法)String foundPerson(String people) for (int i = 0; i people.length;
7、i+) if (peoplei.equals (Don) return Don; if (peoplei.equals (John) return John; if (peoplei.equals (Kent) return Kent; return ;String foundPerson(String people) List candidates = Arrays.asList(new StringDon, John,Kent); for (int i=0; ipeople.length; i+) if (candidates.contains(peoplei) return people
8、i; return ;你想要把某个算法替换为另一个更清晰的算法将函数本体替换为另一个算法Decompose Conditional(分解条件式)if (date.before (SUMMER_START) | date.after(SUMMER_END) charge = quantity * _winterRate + _winterServiceCharge;else charge = quantity * _summerRate;if (notSummer(date) charge = winterCharge(quantity);else charge = summerCharge (
9、quantity);你有一个复杂的条件语句从if、then、else三个段落中分别提炼出独立函数Consolidate Conditional Expression(合并条件式)double disabilityAmount() if (_seniority 12) return 0; if (_isPartTime) return 0; / compute the disability amountdouble disabilityAmount() if (isNotEligableForDisability() return 0; / compute the disability amou
10、nt将这些判断合并为一个条件式,并将这个条件式提炼成为一个独立函数你有一系列条件判断,都得到相同结果Consolidate Duplicate Conditional Fragments(合并重复的条件片断)if (isSpecialDeal() total = price * 0.95; send(); else total = price * 0.98; send(); if (isSpecialDeal() total = price * 0.95;else total = price * 0.98;send();在条件式的每个分支上有着相同的一段代码。将这段重复代码搬移到条件式之外Re
11、move Control Flag(移除控制标记)void checkSecurity(String people) boolean found = false; for (int i = 0; i people.length; i+) if (! found) if (peoplei.equals (Don) sendAlert(); found = true; if (peoplei.equals (John) sendAlert(); found = true; void checkSecurity(String people) for (int i = 0; i 100) result
12、 += (Math.min (lastUsage(),200) - 100) * 0.05; ; if (lastUsage() 200) result += (lastUsage() - 200) * 0.07; ; return new Dollars (result);Dollars baseCharge() double result = usageInRange(0, 100) * 0.03; result += usageInRange (100,200) * 0.05; result += usageInRange (200, Integer.MAX_VALUE) * 0.07;
13、 return new Dollars (result);int usageInRange(int start, int end) if (lastUsage() start) return Math.min(lastUsage(),end) -start; else return 0;若干函数做了类似的工作,但在函数本体中却包含了不同的值建立单一函数,以参数表达那些不同的值Replace Parameter with Explicit Methods(以明确函数取代参数)void setValue (String name, int value) if (name.equals(height
14、) _height = value; if (name.equals(width) _width = value; Assert.shouldNeverReachHere();void setHeight(int arg) _height = arg;void setWidth (int arg) _width = arg;函数实现完全取决于参数值而采取不同反应针对该参数的每一个可能值,建立一个独立函数Replace Conditional with Polymorphism(以多态取代条件式)double getSpeed() switch (_type) case EUROPEAN: return getBaseSpeed(); case AFRICAN: return getBaseSpeed() - getLoadF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安庆市迎江区事业单位公开招聘工作人员笔试历年典型考题及考点剖析附带答案详解
- 怎样下载数学教学课件
- 点亮新学期开启新征程-2025年秋季高一开学第一课主题班会课件-2025-2026学年高中主题班会
- 第十章化工机泵第五节风机37课件
- 第三章防火防爆技术23课件
- 地铁检修教学课件
- 2025年二级注册建筑师考试真题及答案
- 口腔基础知识课件下载
- 小学生秋冬季节疾病课件
- 2025年音乐版权运营与流媒体平台付费模式协同发展研究报告
- 公路应急值守管理办法
- 财务离职保密协议及竞业限制合同范本
- 市政工程施工员考试试题及答案
- 2025年陕西行政执法资格考试备考模拟题及答案(题型)
- 实验室培育钻石行业技术发展趋势报告
- 2025年领英大制造行业人才全球化报告-马来西亚篇
- 心肺复苏双人培训
- 2025年高考化学试卷(广东卷)(空白卷)
- 2025年北京市高考英语试卷真题(含答案解析)
- 初级社工职业道德试题及答案
- 国际压力性损伤-溃疡预防和治疗临床指南(2025年版)解读课件
评论
0/150
提交评论