在对象之间搬移特性之四 :Inline Class(将类内联化)

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

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

动机(Motivation)

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

作法(Mechanics)

·在absorbing class(合并端的那个class)身上声明source class的public协议, 并将其中所有函数委托(delegate)至source class。
Ø如果「以一个独立接口表示source class函数」更合适的话,就应该在inlining之前先使用Extract Interface。

·修改所有source class引用点,改而引用absorbing class。
Ø将source class声明为private,以斩断package之外的所有引用可能。 同时并修改source class的名称,这便可使编译器帮助你捕捉到所有对于source class的"dangling references "(虚悬引用点)。

·编译,测试。

·运用Move Method 和 Move Field ,将source class的特性全部搬移至absorbing class。

·为source class举行一个简单的丧礼。

范例(Examples)

先前(上个重构项〉我从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 和 Move Field ,直到TelephoneNumber不复存在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值