版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抽样方案GB2828.1-2012培训
- 《财务管理项目化教程(第2版)》高职全套教学课件
- 学校最易劳动合同范本
- 房屋设计外包合同范本
- 批发服装供货合同范本
- 户外楼梯订购合同范本
- 微商版权协议合同样本
- 技术开发免税合同范本
- 植物体的结构层次
- 物质的量课件-高一上学期化学人教版
- 浙江省宁波市海曙区2023-2024学年一年级上学期数学期末试卷(含答案)
- 江西省九江市2024-2025学年上学期期末考试 七年级 数学试题
- 品牌商户入驻大型购物中心流程
- 04 《生于忧患死于安乐》对比阅读(解析版)
- 碳积分交易平台市场分析报告
- 学校食堂防鼠培训内容
- 应急管理概论真题及答案
- 储粮企业安全培训班课件
- 国网培训课件
- 脑电图外出进修后回院汇报
- 酚类毒性代谢通路研究-洞察及研究
评论
0/150
提交评论