如果某个类没有做太多的事情,你可以将这个类的所有特性搬移到另外一个类中,然后删除原类。可以看到,Inline Class正好和Extract Class相反,后者是将一个巨类分解成多个小类从而来分担责任。这里是一个类如果不再承担足够多的责任,不再有单独存在的理由(通常是因为重构动作移除了这个类的责任),我们就会挑选这种类使用最频繁的用户(类),以Inline Class把这个类塞到这个用户类中去。

  • 做法:
  • 寻找源类的所有public接口,然后在你目标类上对这些public接口进行声明,并将其中的函数内容全部作为委托函数委托至源类。如果以一个独立接口表示源类更适合的话,就应该在内联之前先使用Extract Class.
  • 修改所有源类引用点,改而引用目标类。在Java中你更可以将源类声明为private以此来斩断包外所有引用的可能。同时你也可以修改源类的名称,你可以利用这个技巧让编译器帮助你寻找针对源类的所有引用点。
  • 编译,测试。
  • 利用Move FieldMove Method把源类的特性全部搬移到目标类中去。
  • 删除源类。

例子:

class Person
{
public:
QString name()
{
return m_name;
}
QString telephoneNumber()
{
return m_telephoneNumber.telephoneNumber();
}
TelephoneNumber telephoneClass()
{
return m_telephoneNumber;
}
private:
TelephoneNumber m_telephoneNumber;
QString m_name;
}; class TelephoneNumber
{
QString telephoneNumber()
{
return m_officeAreaCode + m_officeNumber;
} QString officeAreaCode()
{
return m_officeAreaCode;
} void setOfficeAreaCode(const QString &value)
{
m_officeAreaCode = value;
} QString officeNumber()
{
return m_officeNumber;
} void setOfficeNumber(const QString &value)
{
m_officeNumber = value;
}
private:
QString m_officeAreaCode;
QString m_officeNumber;
};

我们还是使用上篇的例子,一开始这两个类都是分离的,首先我在Person类中声明所有TelephoneNumber的public接口,在这里分别添加officeAreaCode()和officeNumber()给Person,并且函数全部为委托函数。

class Person
{
public:
QString name()
{
return m_name;
}
QString telephoneNumber()
{
return m_telephoneNumber.telephoneNumber();
}
TelephoneNumber telephoneClass()
{
return m_telephoneNumber;
}
QString officeAreaCode()
{
return m_telephoneNumber.officeAreaCode();
} void setOfficeAreaCode(const QString &value)
{
m_telephoneNumber.setOfficeAreaCode(value);
} QString officeNumber()
{
return m_telephoneNumber.officeNumber();
} void setOfficeNumber(const QString &value)
{
m_telephoneNumber.setOfficeNumber(value);
}
private:
TelephoneNumber m_telephoneNumber;
QString m_name;
};

现在,我们要转出所有针对TelephoneNumber的用户,让他们使用Person的接口。

Person rickyk;
ricky.telphoneNumberClass().setAreaCode("");

我们发现了TelephoneNumber的接口,将他们改为

Person rickyk;
rickyk.setAreaCode("");

之后,我们反复使用Move Field和Move Method直到TelephoneNumber不复存在。

『重构--改善既有代码的设计』读书笔记----Inline Class的更多相关文章

  1. 『重构--改善既有代码的设计』读书笔记----Inline Temp

    与Inline Method相同,有时候犹豫需要Extract Method,需要对一些临时变量进行内联,而这个往往是Replace Temp with Query的一部分.简单来说,当你看到这种 d ...

  2. 『重构--改善既有代码的设计』读书笔记----Inline Method

    加入间接层确实是可以带来便利,但过多的间接层有时候会让我自己都觉得有点恐怖,有些时候,语句本身已经够清晰的同时就没必要再嵌一个函数来调用了,这样只会适得其反.比如 void test() { if ( ...

  3. 『重构--改善既有代码的设计』读书笔记----Extract Method

    在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...

  4. 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query

    Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...

  5. 『重构--改善既有代码的设计』读书笔记----Change Value to Reference

    有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...

  6. 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object

    有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...

  7. 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data

    当MVC出现的时候,极大的推动了Model与View分离的潮流.然而对于一些已存在的老系统或者没有维护好的系统,你都会看到当前存在大把的巨大类----将Model,View,Controller都写在 ...

  8. 『重构--改善既有代码的设计』读书笔记----Replace Array with Object

    如果你有一个数组,其中的元素各自代表不同东西,比如你有一个 QList<QString> strList; 其中strList[0]代表选手姓名,strList[1]代表选手家庭住址,很显 ...

  9. 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field

    如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...

随机推荐

  1. 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)

    积累提供所有操作(的实现)来定义子类的行为用一个最简单的例子来讲解这个模式玩家操纵的英雄也就是这个游戏的主角会有许多技能,我们想定义许多不同的技能,来让玩家使用.首 先我们定义一个skillBase类 ...

  2. Eclipse下安装及配置maven项目管理工具

    ①eclipse下maven插件安装. 本地maven安装.环境变量配置完成后,打开eclipse,点击eclipse菜单栏Help->Eclipse Marketplace搜索关键字maven ...

  3. Java---网络编程(3)-TCP-互传文件和图片

    ☆ TCP 建立连接,形成传输数据的通道. 在连接中进行大数据量传输 通过三次握手完成连接,是可靠协议 必须建立连接,效率会稍低 Socket 和 ServerSocket类 TCP传输 TCP So ...

  4. Postman用法简介-Http请求模拟工具

    在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,现在流行的这种工具也挺多的,像火狐浏览器插件 ...

  5. SonarQube4.4+Jenkins进行代码检查实例之二

    SonarQube4.4+Jenkins进行代码检查实例之二 SonarQube4.4+Jenkins进行代码检查实例之二

  6. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...

  7. Mysql性能优化那些事

    ​    ​对于全栈而言,数据库技能不可或缺,关系型数据库或者nosql,内存型数据库或者偏磁盘存储的数据库,对象存储的数据库或者图数据库--林林总总,但是第一必备技能还应该是MySQL.从LAMP的 ...

  8. (三)phpcms之文件目录

    刚刚接触phpcms,先从它的目录结构说起. 如下图所示,是phpcms的主目录结构: 其中api是接口目录,这个接口不是很明白.大概其是把别的内容加入进来,比如论坛啊什么的. caches是缓存文件 ...

  9. shell从函数文件里调用函数

    碰到一个shell中函数调用的小问题,记录一下. shell中函数有三种调用方式,一种是在文件前面定义函数,然后在以下直接调用:一种是通过加载shell,在shell中直接调用:第三种是将函数写入文件 ...

  10. spring 自定义schema

    扩展schema,定义自己的bean属性..不错! 主要: 1,定义META-INF下.xsd文件,这里是people.xsd;定义spring.handlers;定义spring.schemas 2 ...