重构笔记——将类内联化

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43159817

        在上一篇文章中介绍了“提炼类”。本文将介绍“将类内联化”这种重构手法。

        下面让我们来学习这种重构手法吧。

开门见山

        发现:某个类并没有做太多的事情。

解决:将这个类的所有特性搬移到另一个类中,然后移除原类。

动机

“将类内联化”正好与”提炼函数“相反。如果一个类并没有做太多的事,不再承担足够的责任,不再有单独存在的理由。这通常是由于在之前的重构动作中移走了对这个类的责任。挑选这一”萎缩类“的最频繁的用户(另一个类),以”将类内联化“手法将该”萎缩类“塞进另一个类。

做法

(1)在目标类中声明原类的public协议,并将其中所有函数委托至原类。(如果以一个独立的接口来标识原类函数更为合适,就应该在内联函之前先使用”提炼接口“手法)

(2)修改所有原类引用点,该而引用目标类。(将原类声明为private,以断绝包之外的所用引用可能。同时修改原类的名称,这便可使编译器帮助捕捉到所有对于原类的隐藏引用点)

(3)编译,测试。

(4)运用”搬移函数“和”搬移字段“手法,将原类的特性全部搬移到目标类。

(5)编译,测试。

示例

在上一篇重构手法中从TelephoneNumber提炼出另一个了类,现在要将它塞回到Person去。一开始这个两个了类是彼此分离的:

// 将类内联化
class Person {
	//.....
	private TelephoneNumber _officeTelephone = new TelephoneNumber();
	private String _name;

	public String get_name() {
		return _name;
	}

	public String getTelephoneNumber() {
		return _officeTelephone.getTelephoneNumber();
	}

	public TelephoneNumber getOfficeTelephone() {
		return _officeTelephone;
	}
}

class TelephoneNumber {
	//.....
	private String _areaCode;
	private String _number;

	public String get_AreaCode() {
		return _areaCode;
	}

	public String getTelephoneNumber() {
		return ("(" + _areaCode + ")" + _number);
	}

	public void set_AreaCode(String areaCode) {
		_areaCode = areaCode;
	}

	public String getNumber() {
		return _number;
	}

	public void setNumber(String number) {
		_number = number;
	}
}

首先,在Person中声明TelephoneNumber的所有“可见(public)”函数:

class Person
	//.....
	private TelephoneNumber _officeTelephone = new TelephoneNumber();
	private String _name;

	public String get_AreaCode() {
		return _officeTelephone.get_AreaCode();
	}

	public void set_AreaCode(String areaCode) {
		_officeTelephone.set_AreaCode(areaCode);
	}

	public String getNumber() {
		return _officeTelephone.getNumber();
	}

	public void setNumber(String number) {
		_officeTelephone.setNumber(number);
	}

现在,找出TelephoneNumber的所有用户,让它们转而使用Person的接口。有下面代码:

	 Person person = new Person();
	 person.getOfficeTelephone().setAreaCode("789");

就变为了:

	Person person = new Person();
	person.set_AreaCode("789");

现在,可以反复地使用“搬移函数”和“搬移字段”,直到TelephoneNumber不复存在。

本文主要介绍了重构手法——将类内联化。该手法和“提炼类”手法正好相反,虽然看起来是冲突的,但是如果将两种手法混合使用,在合适的情况下使用某一种手法,能够产生不一样的效果。这些都视具体情况而定,灵活使用。

最后,希望本文对你有所帮助。有问题可以留言,谢谢。(PS:下一篇将介绍重构笔记——隐藏委托关系)

重构笔记文章

重构笔记——入门篇

重构笔记——代码的坏味道(上

重构笔记——代码的坏味道(下)

重构笔记——构筑测试体

重构笔记——提炼函数

重构笔记——内联函数

重构笔记——内联临时变量

重构笔记——以查询取代临时变量

重构笔记——引入解释性变量

重构笔记——分解临时变量

重构笔记——移除对参数的赋值

重构笔记——以函数对象取代函数

重构笔记——替换算法

重构笔记——搬移函数

重构笔记——搬移字段

重构笔记——提炼类

重构笔记——将类内联化

时间: 2024-10-22 08:11:07

重构笔记——将类内联化的相关文章

重构笔记——提炼类

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43059759         在上一篇文章中介绍了"搬移字段".本文将介绍"提炼类"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类做了应该由两个类做的事. 解决:建立一个新类,将相关的字段和函数从旧类搬移到新类. 动机 我们或多或少听过这样的教诲:一个类应该是一个清楚的

第3章 在对象之间搬移特性(2):提炼类、类的内联化

3. 提炼类(Extract Class) 3.1 动机 (1)某个类做了应该由两个类做的事,可以将相关字段和函数从旧类搬移到新类. (2)当某些特性需要以一种方式来子类化,另外一些特性则需要以另一种方式子类化,这就意味着需要分解原来的类. 3.2 做法 (1)决定如何分解类所负的责任. (2)建立一个新类,用以表现从旧类中分离出来的责任.如果旧剩下的责任与旧类名称不符,也可以为旧类更名. (3)建立“从旧类访问新类”的连接关系.有时可能需要一个双向连接,但是在真正需要它之前,不要建新“从新类通

1.3 将临时变量内联化

[1]源代码 1 bool moreThanOneThousand() 2 { 3 int nResult = 10 * 10 * 10; 4 return (nResult > 1000); 5 } [2]将临时变量内联化 1 bool moreThanOneThousand() 2 { 3 return ((10 * 10 * 10) > 1000); 4 } [3]总结 有一个临时变量,只被一个简单表达式赋值一次,而它妨碍了其他重构手法.将所有对该变量的引用动作,替换为对它赋值的那个表达

重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929         在上一篇文章中介绍了"将类内联化".本文将介绍"隐藏委托关系"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:客户通过一个委托关系来调用另一个对象. 解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机 我们都知道,"封装&q

重构笔记——引入本地扩展

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/44958839         在上一篇文章中介绍了"引入外加函数".本文将介绍"引入本地扩展"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:你需要为服务类提供一些额外函数,但你无法修改这个类. 解决:建立一个新类,使它包含这些额外函数.让这个扩展品成为源类的子类或者包装类.

重构笔记——搬移字段

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42780243         在上一篇文章中介绍了"搬移函数".本文将介绍"搬移字段"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:程序中某个字段被其所驻类之外的另一个类更多地用到. 解决:在目标类新建一个字段,修改原字段的所有用户,令它们改用新字段. 动机 在类之间移动状态

代码重构(二):类重构规则(Swift版)

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

C++ 内联函数

1.定义: 被调用函数的函数体代码直接插入到该函数被调用处, 而不是通过call语句进行. 2.方式: (1).类的定义体外: 当在类的定义体外时,需要在该成员函数的定义前面加“inline”关键字,显式地告诉编译器该函数在调用时需要“内联”处理,如: class Person { public: string GetName(); private:   string  name; }; inline string GetName() {         return name; } (2).类

第2章 重新组织函数(2):内联函数和内联临时变量

2. 内联函数(Inline Method) 2.1 动机 (1)在函数调用点插入函数本体,然后移除该函数. (2)有时遇到某些函数,其内部代码和函数名称同样清晰易读,采用内联函数可以提供代码的执行速度(因为少掉了函数调用的开销) (3)在Replace Method withd Method Object之前,将一些组织不合理的函数内联到一个大型函数,再从中提炼组织合理的小型函数时效果很好. (4)使用太多的间接层时,特别是一部分函数只是对另一个函数的简单委托时,可同去掉一些无用的间接层. 2