重构-改善既有代码的设计(三)--代码的坏味道

坏味道的代码

重复代码

idea会自动标注重复的代码。通常重复代码就是能够重构的点。ide

  1. 同一个类的两个函数还有相同的表达式,这时须要提炼出重复代码。
  2. 两个互为兄弟的子类内含有相同的表达式,能够提炼相同代码,并放到父类中。
  3. 若是两个绝不相关的类中出现重复代码,则能够将重复代码提炼成一个函数放到一个独立类中或者只放在某一个类中(总之要放在合适的地方),而后其余类都去调用这个函数。

过长函数

过长的函数。每每表明着功能复杂。可读性差。复用概率低
遵循一个原则,一个函数要尽可能短。并以做用命名函数

过大的类

保证每一个类都只作一件事测试

过长参数列:用对象作参数来减小参数个数

这个我以为不须要提出来。由于公司一直都是用对象来做为参数的。编码

发散式变化:添加或修改功能都只改一个类

能够将这个类分为多个类。可是这个状况不容易发现。通常都是遇到真实状况后才考虑获得idea

霰弹式修改:添加或修改一个功能引起多个类相应修改

遇到这种状况能够移动代码,将须要修改的代码都放在同一个类下。假如没有这样的类,能够建立一个code

依恋情节:一个方法可能会调用多个类的多个数据或方法。而不多调用本类的数据或方法

若是该方法只调用了一个类的多个方法。将该方法移到调用类里。
若是该方法调用了多个类的多个方法。将该方法拆解。而后分离到调用类里。对象

数据泥团:老是绑在一块儿的数据应该拥有属于它们本身的对象

对于老是成堆出现的数据应该封装成一个对象。好比方法参数,就能够封装成对象继承

switch语句

看到switch语句直接就用多态替换。switch原本就是一种重复的语句开发

冗赘类

若是项目中有没用的类get

夸夸其谈将来性

咱们将来必定会作这件事。可是如今用不上。就不必如今就加上各类特殊状况考虑。作到留有余地就好
好比一个类或方法的惟一服务对象是是测试用例。能够将测试用例和类一并删掉。若是是帮助测试用例获得正确的结果。则能够保留

使人迷惑的临时字段

类中的某个变量可能只针对某种特殊状况。但阅读该代码你会认为这是一般使用的变量。因此额外建立一个类存放该变量

过分耦合的消息链

消息链的定义:a对象调用b对象,b对象调用c对象,。。。。这样就造成了消息链
假如a对象发生了变化。
注:不是全部的消息链都是很差的。具体状况具体分析
解决方法:

class Person {
    Department _department;

    public Department getDepartment(){
        return _department;
    }

    public void setDepartment (Department arg){
        _department = arg;
    }
    
}

class Department{
    private String _chargeCode;
    private Person _manager;

    public Department (Person manager){
        _manager = manager;
    }

    public Person getManager{
        return _manager;
    }

}

若是客户但愿知道某人的经历是谁, 他必须先得到Department对象:

manager = john.getDepartment().getManager();

这样的编码就对客户端揭露了Department的工做原理, 因而客户知道:Department用以追踪"经理" 这条信息. 若是对客户端隐藏Department, 能够减小耦合. 为了这一目的, 我在Person中创建一个简单的委托函数:

public Person getManager(){
    return _department.getManager();
}

如今,我须要修改Person的全部客户, 让它们改用新函数:

manager = john.getManager();

只要完成了对Department全部函数的委托关系, 并相应修改了Person的全部客户, 我就能够移除Person中的访问函数getDepartment()函数了

中间人

狎昵关系

殊途同归的类

若是两个方法作着同一件事,但方法名不同。就要考虑从新更名字了

不完美的类库

若是底层的类库不能知足开发的须要。就用外部方法封装该方法,并添加相关逻辑

纯稚的数据类

纯稚的数据类(model)是指:它们拥有一些字段,以及用于访问(读写)这些字段的函数,除此以外一无长物。
这种类若是get/set方法均是public的,则须要引发注意,应该进行适当的封装,而不是所有公有化。

被拒绝的遗赠

子类应该继承超类的函数和数据。但若是他们不想或不须要继承全部的函数和数据,则应该为这个子类新建一个兄弟类,把全部用不到的函数和数据放到兄弟类中,他们共享的数据和函数则放到共同的超类中。

过多的注释

当你感受须要撰写注释时,请先尝试重构,试着让全部注释都变得多余

相关文章
相关标签/搜索