重构-改善既有代码的设计
诛仙89
11111
展开
-
【第十一章】塑造模板函数
这个是我经常使用的重构。这个结合模板设计模式更好理解 你有一些子类,其中相应的某些函数一相同的顺序执行类似的操作,但各个操作的细节有所不同 重点 某些子类有相同的代码执行顺序 比如类B init(); doGetFromDb(); doPostProcess(); doSendToDownstream(); 然后类B init(); doGetFromDb(); doPostProcess(); doSendToDownstream(); 这个时候先把代码都提取到超类中,这个原创 2020-06-09 22:53:59 · 225 阅读 · 0 评论 -
【第十一章】提炼子类/超类/接口/类
前面几章都是针对重复代码,条件表达等小型的重构,直到本章才开始稍微大型的重构。 其实无外乎 提炼类 提炼子类 提炼超类 提炼接口 一、继承还是组合 这个是个分水岭,在Java编程思想中,有一句话组合优先于继承。 其实继承不是简单是代码层面,在面向对象语言中继承和其子类是一个体系。而组合更相当于你借用其他类来完成功能。 继承相对来说比较严格,有可能该类已经有子类,有超类的情况。 二、提炼子类 这个其实和前面算是重复的以子类取代类型码。这个是使用的继承。 三、提炼超类 这个一般是发现继承体系中又重复代码后采原创 2020-06-09 22:46:25 · 1222 阅读 · 0 评论 -
【第十章】引入参数对象
Introduce parameter Object 介绍 如果函数的参数基本上会同时出现,那么你应该讲这些参数封装到一个对象中。 例子 经常使用,不介绍了原创 2020-06-07 13:09:55 · 203 阅读 · 0 评论 -
【第十章】将查询函数和修改函数分离
Separate Query from Modifier 介绍 这个是非常重要的,查询就会有返回结果,你如果在查询中还有修改动作,那么这个动作就被称为副作用。这种坏处非常多 例子 不介绍了,这个使用较多原创 2020-06-07 13:03:40 · 247 阅读 · 0 评论 -
【第八章】以子类取代类型码
Replace Type Code with Subclass 介绍 这个其实是为了多态做准备的,也是为了消除if-then-else的【replace conditional with polymorphism】 例子 package com.gupao.reorganizedata_8; /** * * ENGINEER SALESMAN MANAGER都是类型码,不同的类型码会有不同的行为产生, * 比如任务的分配和薪水的计算 * * 下面是一个员工和薪水的例子,每个员工都有个类型码,.原创 2020-06-05 09:41:57 · 445 阅读 · 0 评论 -
【第九章】引入断言
Introduce Assertion 这个需要和卫语句进行区分,卫语句一般会给出一个默认值,或者直接返回,断言是不满足条件直接返回异常 所以断言适合,检查参数 例子 public static void main(String[] args) { Integer i = null; Assert.notNull(i,"param i can't be null"); //normal logic } ...原创 2020-06-05 09:17:08 · 213 阅读 · 0 评论 -
【第九章】卫语句
解释 卫语句就是可以单独检查的语句,一般这种语句都是很少执行的分支,一旦遇到这类分支应该直接返回,或者特殊处理。 在前面博客中移除控制语句中,用return来消除其实就是卫语句的应用。 条件语句 所有分支都是正常行为,那么适合if-then-else 只有一种情况是正常行为,其他都是不常见的情况,这些不常见的情况就应该用卫语句来检查 ...原创 2020-06-04 22:01:42 · 283 阅读 · 0 评论 -
【第九章】分解条件表达式
这个很简单,但是很多人却不做。 每次看到一个复杂的条件,就会很难理解这个条件表达的是什么,如果将条件换成一个函数,并且将函数起一个很好的名字,那么别人看了会很舒服 例子1 protected static final Object[] DO_NOT_PROXY = null; if (specificInterceptors != DO_NOT_PROXY) { this.advisedBeans.put(cacheKey, Boolean.TRUE); O原创 2020-06-04 21:22:53 · 236 阅读 · 0 评论 -
【第九章】移除控制标记
这个其实也很好理解,我最喜欢用return进行替换移除。至于书上说的cotinue 和break 感觉新手才会犯这种错误 public isXX(){ if(start == null){ return false; } if( start = 0){ return true } //normal logic }原创 2020-06-04 21:26:43 · 164 阅读 · 0 评论