版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国孕期女性心理健康专家共识从筛查、评估到干预与服务管理2026
- 保险行业风险管理策略习题集
- 保险市场基础知识与行业动态模拟试题
- 一级建造师执业资格考试(建设工程经济)试题及答案(2026年四川省)
- 2026年职业教育集团化办学培训试题及答案
- 临床执业医师考前必做试题及答案
- 2026年烟草专卖法律法规基础模拟试卷及答案
- 2026年药品管理法政策知识竞赛试题及答案
- 陕西安康市2026年从村(社区)干部中考试录用乡镇(街道)机关公务员在线试题解析
- 2026年中小学珍惜淡水资源保护江河湖泊普法试卷
- 2026年云南昆明社区工作者招聘笔试真题及答案
- 煤矿井下动火作业操作规范
- 供排水安全培训手册
- 让家更美好课件2026-2027学年统编版道德与法治七年级上册
- 点线面体思维运营方案
- 2026年(完整版)国家GCP培训考试题库及参考答案(完整版)
- 中望3D建模基础教案
- (2025)AATS专家共识文件:二尖瓣环钙化的外科治疗解读
- Adobe Illustrator服装款式图绘制技法(第2版)
- 市政设施运维与管理指南(标准版)
- 2025年自考《08984房屋建筑工程概论全国+福建》真题附答案
评论
0/150
提交评论