『重构--改善既有代码的设计』读书笔记----Inline Class
如果某个类没有做太多的事情,你可以将这个类的所有特性搬移到另外一个类中,然后删除原类。可以看到,Inline Class正好和Extract Class相反,后者是将一个巨类分解成多个小类从而来分担责任。这里是一个类如果不再承担足够多的责任,不再有单独存在的理由(通常是因为重构动作移除了这个类的责任),我们就会挑选这种类使用最频繁的用户(类),以Inline Class把这个类塞到这个用户类中去。
- 做法:
- 寻找源类的所有public接口,然后在你目标类上对这些public接口进行声明,并将其中的函数内容全部作为委托函数委托至源类。如果以一个独立接口表示源类更适合的话,就应该在内联之前先使用Extract Class.
- 修改所有源类引用点,改而引用目标类。在Java中你更可以将源类声明为private以此来斩断包外所有引用的可能。同时你也可以修改源类的名称,你可以利用这个技巧让编译器帮助你寻找针对源类的所有引用点。
- 编译,测试。
- 利用Move Field和Move 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的更多相关文章
- 『重构--改善既有代码的设计』读书笔记----Inline Temp
与Inline Method相同,有时候犹豫需要Extract Method,需要对一些临时变量进行内联,而这个往往是Replace Temp with Query的一部分.简单来说,当你看到这种 d ...
- 『重构--改善既有代码的设计』读书笔记----Inline Method
加入间接层确实是可以带来便利,但过多的间接层有时候会让我自己都觉得有点恐怖,有些时候,语句本身已经够清晰的同时就没必要再嵌一个函数来调用了,这样只会适得其反.比如 void test() { if ( ...
- 『重构--改善既有代码的设计』读书笔记----Extract Method
在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query
Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...
- 『重构--改善既有代码的设计』读书笔记----Change Value to Reference
有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...
- 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object
有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...
- 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data
当MVC出现的时候,极大的推动了Model与View分离的潮流.然而对于一些已存在的老系统或者没有维护好的系统,你都会看到当前存在大把的巨大类----将Model,View,Controller都写在 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Array with Object
如果你有一个数组,其中的元素各自代表不同东西,比如你有一个 QList<QString> strList; 其中strList[0]代表选手姓名,strList[1]代表选手家庭住址,很显 ...
- 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field
如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...
随机推荐
- TFS 2012使用简介(一)
最近,一直想让团队加入敏捷开发,但TFS2010用下来,并不是令人满意,还好,TFS2012横空出世了.相比TFS2010,TFS2012改进太多了,主要体现在以下方面: Team Web Acces ...
- 【转】265行JavaScript代码的第一人称3D H5游戏Demo
译文:http://blog.jobbole.com/70956/ 原文:http://www.playfuljs.com/a-first-person-engine-in-265-lines/ 这是 ...
- Java第一次写的流布局图形界面,留个纪念
package jisuanqi; import java.awt.*; public class MyFrame extends Frame{ //继承Frame类 public MyFrame() ...
- JavaScript高级程序设计19.pdf
注册处理程序 navigator.registerContentHandler("applicat/rss+xml","http://www.somereader.com ...
- poj 1011 搜索减枝
题目链接:http://poj.org/problem?id=1011 #include<cstdio> #include<cstring> #include<algor ...
- CPP变量参数别名
1,变量起"绰号"的操作称为引用(reference),"绰号"称为引用名,申明引用的语法格式; 变量数据类型 &引用名 = 已申明的变量名; 和C中的 ...
- Uncode-Schedule首页、文档和下载 - 分布式任务调度组件 - 开源中国社区
Uncode-Schedule首页.文档和下载 - 分布式任务调度组件 - 开源中国社区 分布式任务调度组件 Uncode-Schedule
- ELK Packetbeat 部署指南(15th)
原文链接:http://www.ttlsa.com/elk/elk-packetbeat-deployment-guide/ Packetbeat 是一个实时网络数据包分析工具,与elasticsea ...
- MySQL 面试基础
相关:http://blog.csdn.net/u013252072/article/details/52912385 http://blog.csdn.net/zhangliang ...
- Hibernate自定义数据库查询(排序、输出条数)
Hibernate数据库操作类(eg:TexDAO.java) /* * queryString HQL语句,first开始条数, max输出条数 ,norder排序 * 例: List lis = ...