- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9.1 分解条件式 复杂的条件语句 从if、then、else三个段落中分别提炼出独立函数。 9.2 合并条件式 一系列条件测试,都得到相同结果 将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。 确定这些条件语句都没有连带影响。 使用适当的逻辑操作符,将一系列相关条件式合并为一个。 编译,测试。 对合并后的条件式提炼函数。 9.3 合并重复的条件片段 在条件式的每个分支上有相同的一段代码。 将这段代码搬移到条件式之外。 找出执行方式不随条件变化而变化的代码: 如果这些代码位于条件式起始处,就将它移到条件式之前 如果这些代码位于条件式尾端,就将它移到条件式之后。 如果这些代码位于条件式中段,需要观察共同代码之前或之后的代码是否改变其他代码。如果有所改变,应该首先将共同代码向前或向后移动,移至条件式的起始处或尾端,再以前面所说的办法来处理。 如果代码不止一条语句,将共同代码提炼到独立函数中,再以上述方法处理。 9.4 移除控制标记 在布尔表达式中,某个变量待遇控制标记的作用 以break语句或return语句取代控制标记 方法: 找出跳出这段逻辑的控制标记值。 用break或continue代替不符合条件式的值赋予标记变量的语句。 每次并换后,编译并测试。 例:以break取代控制标记 例:以return取代控制标记 9.5 以卫语句取代嵌套条件式 函数中的条件逻辑使人难以看清正常的执行路径 以卫语句表现所有特殊情况 方法 对于每个检查,放进一个卫语句。 每次将条件捡查替换成卫语句后,编译并测试。 9.6 以多态取代条件式 条件式根据对象型别的不同而选择不同的行为 将这个条件式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数 如果要处理的条件式是个更大函数中的一部分,将它提炼到独立函数。 使用移动函数方法将条件式放在继承结构的顶端 任选一个子类在其中建立一个函数,覆写子类中容纳条件式的那个函数。将与该子类相关的条件式分支复制到新建函数中,并对它进行适当调整。 编译,测试。 在子类中删掉条件式内被复制的分支 针对条件式的每个分支,重复上述过程,直到所有分支都被移到子类中的函数为止。 将子类中容纳条件式的函数声明为抽象函数。 9.7 引入Null对象 某值为无效值null object 将null value替换为null object 为源类建立一个子类,使其行为像所在源类的null版本。在源类和null类加上isNull()函数,前者的isNull应该返回false,后者应该返回true。 编译。 找出所有要求源对象却获得null的地方。修改它们改而获得null object。 找出所有将源对象与null做比较的地方。修改它们调用isNull()函数。 编译,测试。 找出这样的程序点:如果对象不是null,做A动作,否则做B动作。 对于每一个上述地点,在null class中覆写A动作,使其行为和B动作相同。 使用上述的被覆写动作(A),然后删除对象是否等于null的条件测试。 编译并测试 9.8引入断言 某段代码需要对程序状态做出某种假设。 以assertion(断言)明确表现这种假设 一家公用事业公司的系统以site表示地点(场所)、庭院宅第( house)和集合公寓( apartment)都使用该公司的服务。任何时候每个地点都拥有(或说都对应于)一个顾客,顾客信息以Custmer表示: Customer的其中三个特性 class Site... Customer getCustomer() { return _customer; } Customer _customer; class Customer... public String getName() {...} public BillingPlan getPlan() {...} public PaymentHistory getHistory() {...} 系统以PaymentHistory表示顾客的付款记录 上面的各种取值函数允许客户取得各种数据。但有时候一个地点的顾客搬走了,新顾客还没搬进来,此时这个地点就没有顾客。所以必须保证Customer的所有用户都能够处理“Customer对象等于nu”ll的情况。 public class PaymentHistory... int getWeeksDelingquenInLastYear() Customer customer = site.getCustomer(); BillingPlan plan; if (customer == null) plan = BillingPlan.basic(); else plan
文档评论(0)