随笔分类 -  重构

重构23-Introduce Parameter Object(参数对象)
摘要:有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包 阅读全文
posted @ 2016-08-19 09:43 jgig11 阅读(506) 评论(0) 推荐(0)
重构22-Break Method(重构方法)
摘要:这个重构是一种元重构(meta-refactoring),它只是不停地使用提取方法重构,直到将一个大的方法分解成若干个小的方法。下面的例子有点做作,AcceptPayment方法没有丰富的功能。因此为了使其更接近真实场景,我们只能假设该方法中包含了其他大量的辅助代码。 下面的AcceptPaymen 阅读全文
posted @ 2016-08-19 09:36 jgig11 阅读(318) 评论(0) 推荐(0)
重构19-Extract Factory Class(提取工厂类)
摘要:在代码中,通常需要一些复杂的对象创建工作,以使这些对象达到一种可以使用的状态。通常情况下,这种创建不过是新建对象实例,并以我们需要的方式进行工作。但是,有时候这种创建对象的需求会极具增长,并且混淆了创建对象的原始代码。这时,工厂类就派上用场了。关于工厂模式更全面的描述可以参考这里。最复杂的工厂模式是 阅读全文
posted @ 2016-08-19 09:35 jgig11 阅读(408) 评论(0) 推荐(0)
重构21-Collapse Hierarchy(去掉层级)
摘要:我们通过提取子类来下放职责。,当我们意识到不再需要某个子类时,可以使用Collapse Hierarchy重构。如果某个子类的属性(以及其他成员)可以被合并到基类中,这时再保留这个子类已经没有任何意义了。 public class Website { public String title; pub 阅读全文
posted @ 2016-08-19 09:33 jgig11 阅读(491) 评论(0) 推荐(0)
重构20-Extract Subclass(提取父类)
摘要:当一个类中的某些方法并不是面向所有的类时,可以使用该重构将其迁移到子类中。我这里举的例子十分简单,它包含一个Registration类,该类处理与学生注册课程相关的所有信息。 public class Registration { public NonRegistrationAction actio 阅读全文
posted @ 2016-08-19 09:33 jgig11 阅读(280) 评论(0) 推荐(0)
重构18-Replace exception with conditional(条件替代异常)
摘要:重构没有什么出处,是我平时经常使用而总结出来的。欢迎您发表任何改进意见或建议。我相信一定还有其他比较好的重构可以解决类似的问题。 我曾无数次面对的一个代码坏味道就是,使用异常来控制程序流程。您可能会看到类似的代码: public class Microwave { private Microwave 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(196) 评论(0) 推荐(0)
重构16-Encapsulate Conditional(封装条件)
摘要:当代码中充斥着若干条件判断时,代码的真正意图会迷失于这些条件判断之中。这时我喜欢将条件判断提取到一个易于读取的属性或方法(如果有参数)中。重构之前的代码如下: public class RemoteControl { private String[] Functions;//getter sette 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(118) 评论(0) 推荐(0)
重构15-Remove Duplication(删除重复)
摘要:这大概是处理一个方法在多处使用时最常见的重构。如果不加以注意的话,你会慢慢地养成重复的习惯。开发者常常由于懒惰或者在想要尽快生成尽可能多的代码时,向代码中添加很多重复的内容。我想也没必要过多解释了吧,直接看代码把。 我们用共享方法的方式来删除重复的代码。看!没有重复了吧?请务必在必要的时候执行这项重 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(199) 评论(0) 推荐(0)
重构17-Extract Superclass(提取父类)
摘要:当一个类有很多方法希望将它们“提拔”到基类以供同层次的其他类使用时,会经常使用该重构。下面的类包含两个方法,我们希望提取这两个方法并允许其他类使用。 public class Dog { public void eatFood() { // eat some food} public void gr 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(152) 评论(0) 推荐(0)
重构13-Extract Method Object(提取方法对象)
摘要:重构来自于Martin Fowler的重构目录。你可以在这里找到包含简介的原始文章。 在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开 阅读全文
posted @ 2016-08-19 09:31 jgig11 阅读(367) 评论(0) 推荐(0)
重构12-Break Dependencies(打破依赖)
摘要:有些单元测试需要恰当的测试“缝隙”(test seam)来模拟/隔离一些不想被测试的部分。如果你正想在代码中引入这种单元测试,那么今天介绍的重构就十分有用。在这个例子中,我们的客户端代码使用一个静态类来实现功能。但当需要单元测试时,问题就来了。我们无法在单元测试中模拟静态类。解决的方法是使用一个接口 阅读全文
posted @ 2016-08-19 09:31 jgig11 阅读(348) 评论(0) 推荐(0)
重构14-Break Responsibilities
摘要:把一个类的多个职责进行拆分,这贯彻了SOLID中的单一职责原则(SRP)。尽管对于如何划分“职责”经常存在争论,但应用这项重构还是十分简单的。我这里并不会回答划分职责的问题,只是演示一个结构清晰的示例,将类划分为多个负责具体职责的类。 public class Video { public void 阅读全文
posted @ 2016-08-19 09:31 jgig11 阅读(192) 评论(0) 推荐(0)
重构10-Extract Method(提取方法)
摘要:我们要介绍的重构是提取方法。这个重构极其简单但却大有裨益。首先,将逻辑置于命名良好的方法内有助于提高代码的可读性。当方法的名称可以很好地描述这部分代码的功能时,可以有效地减少其他开发者的研究时间。假设越少,代码中的bug也就越少。重构之前的代码如下: public class Receipt { p 阅读全文
posted @ 2016-08-19 09:30 jgig11 阅读(274) 评论(0) 推荐(0)
重构11-Switch to Strategy(Switch到策略模式)
摘要:重构没有固定的形式,多年来我使用过不同的版本,并且我敢打赌不同的人也会有不同的版本。 该重构适用于这样的场景:switch语句块很大,并且会随时引入新的判断条件。这时,最好使用策略模式将每个条件封装到单独的类中。实现策略模式的方式是很多的。我在这里介绍的策略重构使用的是字典策略,这么做的好处是调用者 阅读全文
posted @ 2016-08-19 09:30 jgig11 阅读(722) 评论(0) 推荐(0)
重构9-Extract Interface(提取接口)
摘要:我们来介绍一个常常被忽视的重构:提取接口。如果你发现多于一个类使用另外一个类的某些方法,引入接口解除这种依赖往往十分有用。该重构实现起来非常简单,并且能够享受到松耦合带来的好处。 public class ClassRegistration{ public Double Total;//getter 阅读全文
posted @ 2016-08-19 09:29 jgig11 阅读(391) 评论(0) 推荐(0)
重构8-Replace Inheritance with Delegation(委托替换继承)
摘要:继承的误用十分普遍。它只能用于逻辑环境,但却经常用于简化,这导致复杂的没有意义的继承层次。看下面的代码: public class Sanitation{ public String WashHands(){ return "Cleaned!";}} public class Child exten 阅读全文
posted @ 2016-08-19 09:28 jgig11 阅读(282) 评论(0) 推荐(0)
重构7-Rename(method,class,parameter)
摘要:这是我最常用也是最有用的重构之一。我们对方法/类/参数的命名往往不那么合适,以至于误导阅读者对于方法/类/参数功能的理解。这会造成阅读者的主观臆断,甚至引入bug。这个重构看起来简单,但却十分重要。 public class Person { public String FN{ get ; set; 阅读全文
posted @ 2016-08-18 16:59 jgig11 阅读(176) 评论(0) 推荐(0)
重构6-Push Down Field(字段下移)
摘要:与上移字段相反的重构是下移字段。同样,这也是一个无需多言的简单重构。 public abstract class Task { protected String _resolution; } public class BugTask extends Task{} public class Featu 阅读全文
posted @ 2016-08-18 16:58 jgig11 阅读(452) 评论(0) 推荐(0)
重构2-Move Method(方法移动)
摘要:重构同样非常简单,以至于人们并不认为这是一个有价值的重构。迁移方法(Move Method),顾名思义就是将方法迁移到合适的位置。在开始重构前,我们先看看一下代码: public class BankAccount { public BankAccount(int accountAge, int c 阅读全文
posted @ 2016-08-18 16:56 jgig11 阅读(368) 评论(0) 推荐(0)
重构4-Push Down Method(方法下移)
摘要:我们介绍了将方法迁移到基类以供多个子类使用的上移方法重构,今天我们来看看相反的操作。重构前的代码如下: public abstract class Animal { public void Bark() { // code to bark}}public class Dog extends Anim 阅读全文
posted @ 2016-08-18 16:56 jgig11 阅读(225) 评论(0) 推荐(0)