Inline Class(将类内联化)

你的某个class没有做太多事情(没有承担足够责任)。

 

将class的所有特性搬移到另一个class中,然后移除原class。

 

class Person...
 private string _name;
 public string getTelephoneNumber();
 private TelephoneNumber _officeTelephone;

class TelephoneNumber...
 private string _areaCode;
 private string _number;
 public string getTelephoneNumber();

==>

class Person...
 private string _name;
 private string _officeAreaCode;
 private string _officeNumber;
 public string getTelephoneNumber();

 

动机

Inline Class(154)正好与Extract Class(149)相反。如果一个class不再承担足够责任、不再有单独存在的理由(这通常是因为此前的重构动作移走了这个class的责任),我就会挑选这一[萎缩class]的最频繁用户(也是个class),以Inline Class(154)手法将[萎缩class]塞进去。

 

作法

1. 在absorbing class(合并端的那个class)身上声明source class的public协议,并将其中所有函数委托(delegate)至source class。

如果[以一个独立接口表示source class函数]更合适的话,就应该在inlining之前先使用Extract Interface(341)。

2. 修改所有source class引用点,改而引用absorbing class。

将source class声明为private,以斩断package之外的所有引用可能。

同时并修改source class的名称,这便可使编译器帮助你捕捉到所有对于source class的“dangling references”(虚悬引用点)。

3. 编译,测试。

4. 运用Move Method(142)和Move Field(146),将source class的特性全部搬移到absorbing class。

5. 为source class举行一个简单的葬礼。


 先前(上个重构项)我从TelephoneNumber提炼出另一个class,现在我要将它inlining塞回到Person去。一开始这两个classes是分离的:

class Person...
    public String getName() {
       return _name;
    }
    public String getTelephoneNumber() {
       return _officeTelephone.getTelephoneNumber();
    }
    TelephoneNumber getOfficeTelephone() {
       return _officeTelephone;
    }

    private String _name;
    private TelephoneNumber _officeTelephone = new TelephoneNumber();


class TelephoneNumber...
    public String getTelephoneNumber() {
       return ("(" + _areaCode + ")" + _number);
    String getAreaCode() {
       return _areaCode;
    }
    void setAreaCode(String arg) {
       _areaCode = arg;
    }
    String getNumber() {
       return _number;
    }
    void setNumber(String arg) {
       _number = arg;
    }
    private String _number;
    private String _areaCode;
首先我在Person中声明TelephoneNumber的所有[可见](public)函数:

class Person...
    String getAreaCode() {
       return _officeTelephone.getAreaCode();
    }
    void setAreaCode(String arg) {
       _officeTelephone.setAreaCode(arg);
    }
    String getNumber() {
       return _officeTelephone.getNumber();
    }
    void setNumber(String arg) {
       _officeTelephone.setNumber(arg);
    }

现在,我要找出TelephoneNumber的所有用户,让它们转而使用Person接口。于是下列代码:
    Person martin = new Person();
    martin.getOfficeTelephone().setAreaCode("781");

就变成了:

    Person martin = new Person();
    martin.setAreaCode("781");

现在,我可以持续使用Move Method(142)和Move Field(146),直到TelephoneNumber不复存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值