多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### Inline Class(将类内联化) 你的某个class没有做太多事情(没有承担足够责任)。 将class的所有特性搬移到另一个class中,然后移除原class。 ![](https://box.kancloud.cn/2016-08-15_57b1b56c51e5c.gif) **动机(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不复存在。