重构-类

163 阅读2分钟

提炼类/融合类

提炼类动机:一个类的行为过多;一个类与另一个类合作太多,高度耦合。

通过提炼,搬移函数,能划分清楚类的职责,减少类的耦合。

import lombok.Data;

@Data
public class Person {
    private String name;

    private int age;

    private int id;

    /**
     * 这还有20个字段
     */
    private int phoneNumber;

    private int VChat;

    private int QQ;

    public void setCommunication(int phoneNumber,int VChat,int QQ){
        this.phoneNumber = phoneNumber;
        this.QQ = QQ;
        this.VChat = VChat;
    }

    public Person getCommunication(int id){
        Person person = new Person();
        person.setId(1);
        person.setAge(10);
        person.setName("张三");
        person.setCommunication(123,456,789);
        return person;
    }
}
import lombok.Data;

@Data
public class Person {
    private String name;

    private int age;

    private int id;

    /**
     * 这还有20个字段
     */
    private Communication communication;

    public void setCommunication(int phoneNumber,int VChat,int QQ){
        communication = new Communication(phoneNumber,VChat,QQ);
    }

    public Person getCommunication(int id){
        Person person = new Person();
        person.setId(1);
        person.setAge(10);
        person.setName("张三");
        person.setCommunication(123,456,789);
        return person;
    }
}
import lombok.AllArgsConstructor;
import lombok.Data;

@AllArgsConstructor
@Data
public class Communication {

    private int phoneNumber;

    private int VChat;

    private int QQ;
}

融合类动机:当一个类承担的责任不够多,就通过提炼类的相反操作,把责任较少的类融合进另一个类。

增加/删除委托关系

增加委托关系动机:封装使对象尽可能少的了解系统的其他部分,当需求发生变化时,更容易拓展,通过增加委托关系,可以使封装更彻底。

还是上边的例子,当客户端要知道某个Person的phoneNumber时,需要通过Communication类,才能拿到phoneNumber,这样客户端就知道了拿到phoneNumber的细节,先拿到Communication类,才能进一步拿到phoneNumber。

public static void main(String[] args) {
    new Person().getCommunication().getPhoneNumber();
}
//通过在Person类增加一层委托,可以隐藏拿到phoneNumber的细节。
public int getPhoneNumber(){
    return getCommunication().getPhoneNumber();        
}

public static void main(String[] args) {
    new Person().getPhoneNumber();
}

删除委托关系动机:当被委托类的功能越来越多,委托类完全成为了转发人,每当被委托类提供了新功能,委托类就得提供一个委托函数,很麻烦,此时通过删除委托方法,让客户直接访问被委托类。

public static void main(String[] args) {
    new Person().getCommunication().getPhoneNumber();
}