08 2016 档案
重构31-Replace conditional with Polymorphism(多态代替条件)
摘要:多态(Polymorphism)是面向对象编程的基本概念之一。在这里,是指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象。 public class OrderProcessor { public Double ProcessOrder(Customer customer, List products) { // d...
阅读全文
重构29-Remove Middle Man(去掉中间人)
摘要:有时你的代码里可能会存在一些“Phantom”或“Ghost”类,Fowler称之为“中间人(Middle Man)”。这些中间人类仅仅简单地将调用委托给其他组件,除此之外没有任何功能。 这一层是完全没有必要的,我们可以不费吹灰之力将其完全移除。 public class Consumer { public AccountManager AccountManager;//getter ...
阅读全文
重构30-Return ASAP(尽快返回)
摘要:该话题实际上是诞生于移除箭头反模式重构之中。在移除箭头时,它被认为是重构产生的副作用。为了消除箭头,你需要尽快地return。 public class Order { public Customer Customer;//getter setter public Double CalculateOrder(Customer customer, List products, Do...
阅读全文
重构28-Rename boolean method(重命名布尔方法)
摘要:你也可以说这并不是一个真正的重构,因为方法实际上改变了,但这是一个灰色地带,可以开放讨论。一个拥有大量布尔类型参数的方法将很快变得无法控制,产生难以预期的行为。参数的数量将决定分解的方法的数量。来看看该重构是如何开始的: public class BankAccount { public void CreateAccount(Customer customer, boolean wit...
阅读全文
重构26-Remove Double Negative(去掉双重否定)
摘要:尽管我在很多代码中发现了这种严重降低可读性并往往传达错误意图的坏味道,但这种重构本身还是很容易实现的。这种毁灭性的代码所基于的假设导致了错误的代码编写习惯,并最终导致bug。如下例所示: public class Order { public void Checkout(List products, Customer customer) { if (!customer.g...
阅读全文
重构27-Remove God Classes(去掉神类)
摘要:在传统的代码库中,我们常常会看到一些违反了SRP原则的类。这些类通常以Utils或Manager结尾,有时也没有这么明显的特征而仅仅是普通的包含多个功能的类。这种God类还有一个特征,使用语句或注释将代码分隔为多个不同角色的分组,而这些角色正是这一个类所扮演的。 久而久之,这些类成为了那些没有时间放置到恰当类中的方法的垃圾桶。这时的重构需要将方法分解成多个负责单一职责的类。public class...
阅读全文
重构25-Introduce Design By Contract checks(契约式设计)
摘要:契约式设计(DBC,Design By Contract)定义了方法应该包含输入和输出验证。因此,可以确保所有的工作都是基于可用的数据,并且所有的行为都是可预料的。否则,将返回异常或错误并在方法中进行处理。要了解更多关于DBC的内容,可以访问wikipedia。 在我们的示例中,输入参数很可能为null。由于没有进行验证,该方法最终会抛出NullReferenceException。在方法最后,我...
阅读全文
重构24-Remove Arrowhead Antipattern(去掉箭头反模式)
摘要:基于c2的wiki条目。Los Techies的Chris Missal同样也些了一篇关于反模式的post。 简单地说,当你使用大量的嵌套条件判断时,形成了箭头型的代码,这就是箭头反模式(arrowhead antipattern)。我经常在不同的代码库中看到这种现象,这提高了代码的圈复杂度(cyclomatic complexity)。 下面的例子演示了箭头反模式public class Sec...
阅读全文
重构23-Introduce Parameter Object(参数对象)
摘要:有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包含 多 个 参 数 的 方 法 时 , 由 于参 数 过 多 会 导 致 可 读 性 严 重 下 降 , 如 : 有 时当 使用 一个 包
阅读全文
重构22-Break Method(重构方法)
摘要:这个重构是一种元重构(meta-refactoring),它只是不停地使用提取方法重构,直到将一个大的方法分解成若干个小的方法。下面的例子有点做作,AcceptPayment方法没有丰富的功能。因此为了使其更接近真实场景,我们只能假设该方法中包含了其他大量的辅助代码。 下面的AcceptPaymen
阅读全文
重构19-Extract Factory Class(提取工厂类)
摘要:在代码中,通常需要一些复杂的对象创建工作,以使这些对象达到一种可以使用的状态。通常情况下,这种创建不过是新建对象实例,并以我们需要的方式进行工作。但是,有时候这种创建对象的需求会极具增长,并且混淆了创建对象的原始代码。这时,工厂类就派上用场了。关于工厂模式更全面的描述可以参考这里。最复杂的工厂模式是
阅读全文
重构20-Extract Subclass(提取父类)
摘要:当一个类中的某些方法并不是面向所有的类时,可以使用该重构将其迁移到子类中。我这里举的例子十分简单,它包含一个Registration类,该类处理与学生注册课程相关的所有信息。 public class Registration { public NonRegistrationAction actio
阅读全文
重构21-Collapse Hierarchy(去掉层级)
摘要:我们通过提取子类来下放职责。,当我们意识到不再需要某个子类时,可以使用Collapse Hierarchy重构。如果某个子类的属性(以及其他成员)可以被合并到基类中,这时再保留这个子类已经没有任何意义了。 public class Website { public String title; pub
阅读全文
重构15-Remove Duplication(删除重复)
摘要:这大概是处理一个方法在多处使用时最常见的重构。如果不加以注意的话,你会慢慢地养成重复的习惯。开发者常常由于懒惰或者在想要尽快生成尽可能多的代码时,向代码中添加很多重复的内容。我想也没必要过多解释了吧,直接看代码把。 我们用共享方法的方式来删除重复的代码。看!没有重复了吧?请务必在必要的时候执行这项重
阅读全文
重构16-Encapsulate Conditional(封装条件)
摘要:当代码中充斥着若干条件判断时,代码的真正意图会迷失于这些条件判断之中。这时我喜欢将条件判断提取到一个易于读取的属性或方法(如果有参数)中。重构之前的代码如下: public class RemoteControl { private String[] Functions;//getter sette
阅读全文
重构17-Extract Superclass(提取父类)
摘要:当一个类有很多方法希望将它们“提拔”到基类以供同层次的其他类使用时,会经常使用该重构。下面的类包含两个方法,我们希望提取这两个方法并允许其他类使用。 public class Dog { public void eatFood() { // eat some food} public void gr
阅读全文
重构18-Replace exception with conditional(条件替代异常)
摘要:重构没有什么出处,是我平时经常使用而总结出来的。欢迎您发表任何改进意见或建议。我相信一定还有其他比较好的重构可以解决类似的问题。 我曾无数次面对的一个代码坏味道就是,使用异常来控制程序流程。您可能会看到类似的代码: public class Microwave { private Microwave
阅读全文
重构12-Break Dependencies(打破依赖)
摘要:有些单元测试需要恰当的测试“缝隙”(test seam)来模拟/隔离一些不想被测试的部分。如果你正想在代码中引入这种单元测试,那么今天介绍的重构就十分有用。在这个例子中,我们的客户端代码使用一个静态类来实现功能。但当需要单元测试时,问题就来了。我们无法在单元测试中模拟静态类。解决的方法是使用一个接口
阅读全文
重构13-Extract Method Object(提取方法对象)
摘要:重构来自于Martin Fowler的重构目录。你可以在这里找到包含简介的原始文章。 在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开
阅读全文
重构14-Break Responsibilities
摘要:把一个类的多个职责进行拆分,这贯彻了SOLID中的单一职责原则(SRP)。尽管对于如何划分“职责”经常存在争论,但应用这项重构还是十分简单的。我这里并不会回答划分职责的问题,只是演示一个结构清晰的示例,将类划分为多个负责具体职责的类。 public class Video { public void
阅读全文
重构10-Extract Method(提取方法)
摘要:我们要介绍的重构是提取方法。这个重构极其简单但却大有裨益。首先,将逻辑置于命名良好的方法内有助于提高代码的可读性。当方法的名称可以很好地描述这部分代码的功能时,可以有效地减少其他开发者的研究时间。假设越少,代码中的bug也就越少。重构之前的代码如下: public class Receipt { p
阅读全文
重构11-Switch to Strategy(Switch到策略模式)
摘要:重构没有固定的形式,多年来我使用过不同的版本,并且我敢打赌不同的人也会有不同的版本。 该重构适用于这样的场景:switch语句块很大,并且会随时引入新的判断条件。这时,最好使用策略模式将每个条件封装到单独的类中。实现策略模式的方式是很多的。我在这里介绍的策略重构使用的是字典策略,这么做的好处是调用者
阅读全文
重构9-Extract Interface(提取接口)
摘要:我们来介绍一个常常被忽视的重构:提取接口。如果你发现多于一个类使用另外一个类的某些方法,引入接口解除这种依赖往往十分有用。该重构实现起来非常简单,并且能够享受到松耦合带来的好处。 public class ClassRegistration{ public Double Total;//getter
阅读全文
重构8-Replace Inheritance with Delegation(委托替换继承)
摘要:继承的误用十分普遍。它只能用于逻辑环境,但却经常用于简化,这导致复杂的没有意义的继承层次。看下面的代码: public class Sanitation{ public String WashHands(){ return "Cleaned!";}} public class Child exten
阅读全文
重构7-Rename(method,class,parameter)
摘要:这是我最常用也是最有用的重构之一。我们对方法/类/参数的命名往往不那么合适,以至于误导阅读者对于方法/类/参数功能的理解。这会造成阅读者的主观臆断,甚至引入bug。这个重构看起来简单,但却十分重要。 public class Person { public String FN{ get ; set;
阅读全文
重构6-Push Down Field(字段下移)
摘要:与上移字段相反的重构是下移字段。同样,这也是一个无需多言的简单重构。 public abstract class Task { protected String _resolution; } public class BugTask extends Task{} public class Featu
阅读全文
重构2-Move Method(方法移动)
摘要:重构同样非常简单,以至于人们并不认为这是一个有价值的重构。迁移方法(Move Method),顾名思义就是将方法迁移到合适的位置。在开始重构前,我们先看看一下代码: public class BankAccount { public BankAccount(int accountAge, int c
阅读全文
重构3-Pull Up Method(方法上移)
摘要:上移方法(Pull Up Method)重构是将方法向继承链上层迁移的过程。用于一个方法被多个实现者使用时 public abstract class Vehicle { // other methods}public class Car extends Vehicle{ public void T
阅读全文
重构4-Push Down Method(方法下移)
摘要:我们介绍了将方法迁移到基类以供多个子类使用的上移方法重构,今天我们来看看相反的操作。重构前的代码如下: public abstract class Animal { public void Bark() { // code to bark}}public class Dog extends Anim
阅读全文
重构5-Pull Up Field(字段上移)
摘要:我们来看看一个和上移方法十分类似的重构。我们处理的不是方法,而是字段。 public abstract class Account{}public class CheckingAccount extends Account{ private Double _minimumCheckingBalanc
阅读全文
重构的时机
摘要:在当前业务不紧急,或者时间相对宽松情况下: 1.发现代码中存在重复的代码 2.有过大的类或者过长的方法 3.代码中存在强依赖或者是紧耦合的结构 4.代码的运算逻辑难以理解(可读性差) 5.代码中存在不清晰的描述对象特征、行为以及对象间的关系 重构可以在以后的代码维护和开发中带来意想不到好处,大家多试
阅读全文
一些关注,去学习一下
摘要:MongoDB—— 一种流行的,跨平台的面向文档的数据库。Elasticsearch——为云构建的分布式REST内置搜索引擎。Cassandra——开源的分布式数据库管理系统,最初在Facebook开发和设计,用来处理横跨多个商用服务器的海量数据,提供了无单点故障的高度可用性。Redis—— 开源的(BSD许可),内存数据结构存储,作为数据库、缓存和消息代理使用。Hazelcast——开源,基于J...
阅读全文
emoji表情符处理替换成空格
摘要:/** * 用filterOffUtf8Mb4 * Description: 过滤率四个字节的utf-8字符(emoji表情符),替换成四个空格。 * 四字节utf-8字符mysql存储报错 * @Version1.0 * @param s * @return * @throws UnsupportedEncodingException * @t...
阅读全文
java 动态代理范例 InvocationHandler与Proxy
摘要:java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档)java.lang.reflect.InvocationHandler,Invocati...
阅读全文
获取JDK动态代理/CGLIB代理对象代理的目标对象。
摘要:问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super c...
阅读全文
Communications link failure的解决办法
摘要:使用Connector/J连接MySQL数据库,程序运行较长时间后就会报以下错误:Communications link failure,The last packet successfully received from the server was *** millisecond ago.The last packet successfully sent to the server was *...
阅读全文
多参数
摘要:多参数测试 输出结果源码public class VarargsTest { void varargs(Object... args){ for (int i = 0; i map=new ConcurrentHashMap(); map.put("111","adas"); varargs("11", "222", null,map); ...
阅读全文
Java中Integer的最大值和最小值
摘要:从JDK1.0开始,Integer中就定义了MIN_VALUE和MAX-VALUE两个常量:/** * A constant holding the minimum value an {@code int} can * have, -231. */public static final int MIN_VALUE = 0x80000000; /** * A constant hold...
阅读全文
redis存储对象,实体类新加字段空指针问题处理
摘要:redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交
阅读全文
浙公网安备 33010602011771号