版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年企业公章使用合同
- 礼品品牌推广合同
- 2024年基础设施建设施工管理协议书
- 服务合同书格式
- 企业融资抵押合同
- 生物多样性保护合同
- 2024在职员工绩效分红合同
- 2024年室内装饰用品购买协议
- 公园活动策划财务管理制度
- 婚姻登记担保合同
- 水果电池课件
- 液化气站消防安全知识员工培训
- 装饰工程各种安全技术操作规程
- 支气管哮喘急性发作个案护理记录
- 询价投标文件(范本)
- 水处理反渗透设备日常维护保养点检记录表
- 一年级数学专项练习(大括号问题、求总数、求部分数、一图四式)
- 2022-2023学年浙江温州市高考一模试卷物理试题
- 《故事》罗伯特·麦基
- 子宫内膜息肉的诊断和治疗
- 感动中国十大人物顾方舟事迹ppt(思修课堂展示or爱国主题演讲)
评论
0/150
提交评论