2016年8月19日
摘要: 多态(Polymorphism)是面向对象编程的基本概念之一。在这里,是指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象。 public class OrderProcessor { public Double ProcessOrder(Customer customer, List products) { // d... 阅读全文
posted @ 2016-08-19 10:10 jgig11 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 你也可以说这并不是一个真正的重构,因为方法实际上改变了,但这是一个灰色地带,可以开放讨论。一个拥有大量布尔类型参数的方法将很快变得无法控制,产生难以预期的行为。参数的数量将决定分解的方法的数量。来看看该重构是如何开始的: public class BankAccount { public void CreateAccount(Customer customer, boolean wit... 阅读全文
posted @ 2016-08-19 10:09 jgig11 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 有时你的代码里可能会存在一些“Phantom”或“Ghost”类,Fowler称之为“中间人(Middle Man)”。这些中间人类仅仅简单地将调用委托给其他组件,除此之外没有任何功能。 这一层是完全没有必要的,我们可以不费吹灰之力将其完全移除。 public class Consumer { public AccountManager AccountManager;//getter ... 阅读全文
posted @ 2016-08-19 10:09 jgig11 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 该话题实际上是诞生于移除箭头反模式重构之中。在移除箭头时,它被认为是重构产生的副作用。为了消除箭头,你需要尽快地return。 public class Order { public Customer Customer;//getter setter public Double CalculateOrder(Customer customer, List products, Do... 阅读全文
posted @ 2016-08-19 10:09 jgig11 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 尽管我在很多代码中发现了这种严重降低可读性并往往传达错误意图的坏味道,但这种重构本身还是很容易实现的。这种毁灭性的代码所基于的假设导致了错误的代码编写习惯,并最终导致bug。如下例所示: public class Order { public void Checkout(List products, Customer customer) { if (!customer.g... 阅读全文
posted @ 2016-08-19 09:58 jgig11 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 在传统的代码库中,我们常常会看到一些违反了SRP原则的类。这些类通常以Utils或Manager结尾,有时也没有这么明显的特征而仅仅是普通的包含多个功能的类。这种God类还有一个特征,使用语句或注释将代码分隔为多个不同角色的分组,而这些角色正是这一个类所扮演的。 久而久之,这些类成为了那些没有时间放置到恰当类中的方法的垃圾桶。这时的重构需要将方法分解成多个负责单一职责的类。public class... 阅读全文
posted @ 2016-08-19 09:58 jgig11 阅读(1246) 评论(0) 推荐(0) 编辑
摘要: 契约式设计(DBC,Design By Contract)定义了方法应该包含输入和输出验证。因此,可以确保所有的工作都是基于可用的数据,并且所有的行为都是可预料的。否则,将返回异常或错误并在方法中进行处理。要了解更多关于DBC的内容,可以访问wikipedia。 在我们的示例中,输入参数很可能为null。由于没有进行验证,该方法最终会抛出NullReferenceException。在方法最后,我... 阅读全文
posted @ 2016-08-19 09:45 jgig11 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 基于c2的wiki条目。Los Techies的Chris Missal同样也些了一篇关于反模式的post。 简单地说,当你使用大量的嵌套条件判断时,形成了箭头型的代码,这就是箭头反模式(arrowhead antipattern)。我经常在不同的代码库中看到这种现象,这提高了代码的圈复杂度(cyclomatic complexity)。 下面的例子演示了箭头反模式public class Sec... 阅读全文
posted @ 2016-08-19 09:44 jgig11 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包 阅读全文
posted @ 2016-08-19 09:43 jgig11 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 这个重构是一种元重构(meta-refactoring),它只是不停地使用提取方法重构,直到将一个大的方法分解成若干个小的方法。下面的例子有点做作,AcceptPayment方法没有丰富的功能。因此为了使其更接近真实场景,我们只能假设该方法中包含了其他大量的辅助代码。 下面的AcceptPaymen 阅读全文
posted @ 2016-08-19 09:36 jgig11 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 在代码中,通常需要一些复杂的对象创建工作,以使这些对象达到一种可以使用的状态。通常情况下,这种创建不过是新建对象实例,并以我们需要的方式进行工作。但是,有时候这种创建对象的需求会极具增长,并且混淆了创建对象的原始代码。这时,工厂类就派上用场了。关于工厂模式更全面的描述可以参考这里。最复杂的工厂模式是 阅读全文
posted @ 2016-08-19 09:35 jgig11 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 当一个类中的某些方法并不是面向所有的类时,可以使用该重构将其迁移到子类中。我这里举的例子十分简单,它包含一个Registration类,该类处理与学生注册课程相关的所有信息。 public class Registration { public NonRegistrationAction actio 阅读全文
posted @ 2016-08-19 09:33 jgig11 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 我们通过提取子类来下放职责。,当我们意识到不再需要某个子类时,可以使用Collapse Hierarchy重构。如果某个子类的属性(以及其他成员)可以被合并到基类中,这时再保留这个子类已经没有任何意义了。 public class Website { public String title; pub 阅读全文
posted @ 2016-08-19 09:33 jgig11 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 当代码中充斥着若干条件判断时,代码的真正意图会迷失于这些条件判断之中。这时我喜欢将条件判断提取到一个易于读取的属性或方法(如果有参数)中。重构之前的代码如下: public class RemoteControl { private String[] Functions;//getter sette 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 当一个类有很多方法希望将它们“提拔”到基类以供同层次的其他类使用时,会经常使用该重构。下面的类包含两个方法,我们希望提取这两个方法并允许其他类使用。 public class Dog { public void eatFood() { // eat some food} public void gr 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 重构没有什么出处,是我平时经常使用而总结出来的。欢迎您发表任何改进意见或建议。我相信一定还有其他比较好的重构可以解决类似的问题。 我曾无数次面对的一个代码坏味道就是,使用异常来控制程序流程。您可能会看到类似的代码: public class Microwave { private Microwave 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 这大概是处理一个方法在多处使用时最常见的重构。如果不加以注意的话,你会慢慢地养成重复的习惯。开发者常常由于懒惰或者在想要尽快生成尽可能多的代码时,向代码中添加很多重复的内容。我想也没必要过多解释了吧,直接看代码把。 我们用共享方法的方式来删除重复的代码。看!没有重复了吧?请务必在必要的时候执行这项重 阅读全文
posted @ 2016-08-19 09:32 jgig11 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 把一个类的多个职责进行拆分,这贯彻了SOLID中的单一职责原则(SRP)。尽管对于如何划分“职责”经常存在争论,但应用这项重构还是十分简单的。我这里并不会回答划分职责的问题,只是演示一个结构清晰的示例,将类划分为多个负责具体职责的类。 public class Video { public void 阅读全文
posted @ 2016-08-19 09:31 jgig11 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 重构来自于Martin Fowler的重构目录。你可以在这里找到包含简介的原始文章。 在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开 阅读全文
posted @ 2016-08-19 09:31 jgig11 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 有些单元测试需要恰当的测试“缝隙”(test seam)来模拟/隔离一些不想被测试的部分。如果你正想在代码中引入这种单元测试,那么今天介绍的重构就十分有用。在这个例子中,我们的客户端代码使用一个静态类来实现功能。但当需要单元测试时,问题就来了。我们无法在单元测试中模拟静态类。解决的方法是使用一个接口 阅读全文
posted @ 2016-08-19 09:31 jgig11 阅读(336) 评论(0) 推荐(0) 编辑