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

来源:互联网 发布:cda数据分析师有什么用 编辑:程序博客网 时间:2024/05/29 13:11

你的某个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不复存在。

原创粉丝点击