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

2. 内联函数(Inline Method)

2.1 动机

(1)在函数调用点插入函数本体,然后移除该函数。

(2)有时遇到某些函数,其内部代码和函数名称同样清晰易读,采用内联函数可以提供代码的执行速度(因为少掉了函数调用的开销)

(3)在Replace Method withd Method Object之前,将一些组织不合理的函数内联到一个大型函数,再从中提炼组织合理的小型函数时效果很好。

(4)使用太多的间接层时,特别是一部分函数只是对另一个函数的简单委托时,可同去掉一些无用的间接层。

2.2 做法

(1)检查函数,确定它不具有多态性。如果子类继承了这个函数,就不要将此函数内联,因为子类无法覆写一个根本不存在的函数。

(2)找出这个函数的所有被调用点。

(3)将这个函数的所有被调用点都替换为函数本体

(4)删除该函数的定义

2.3 范例

//重构前
int getRating()
{
    return moreThanFiveLateDeliveries() ? 2 : 1;
}

bool moreThanFiveLateDeliveries()
{
    return _numberOfLateDeliveries > 5;
}

//重构后
int getRating()
{
    return  (_numberOfLateDeliveries > 5) ? 2 : 1;
}

2.4 思考

(1)对于递归、多返回点不适合用内联函数来重构

(2)内联至另一个对象中,而该对象并无提供访问函数。这种情况也不适合使用这个重构手法。

3. 内联临时变量

3.1 动机

(1)内联临时变量多半是作为Replace Temp with Query的一部分使用,所以真正的动机出现在后者那儿。

(2)如果某个临时变量被赋值为某个函数的返回值。一般这个临时变量不会有任何危害,可以保留下来。但这样的变量会妨碍重构,使重构变成比较困难,所以可以将它内联化。

3.2 做法

(1)检查临时变量赋值的语句,确保等号右边的表达式没有副作用

(2)将该变量声明改为const变量,以确定该变量真的只被赋值一次。

(3)找到该临时变量的所有引用点,将它们替换为“为临时变量赋值的”表达式

(4)删除该临时变量的声明和赋值语句。

3.3 范例

//内联临时变量
//重构前
double basePrice = anOrder.basePrice(); //basePrice只被赋值一次

return (basePrice > 1000)

//重构后
return (anOrder.basePrice() > 1000);
时间: 2024-12-19 04:41:55

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

第2章 重新组织函数(4):函数对象、替换算法

8. 以函数对象取代函数(Replace Method with Method Object) 8.1 动机 (1)将一个大型的函数放进一个单独对象中,使局部变量变成对象内的字段,然后可以在同一个对象中将这个大型函数分解为多个小型函数. (2)局部变量的存在会增加函数分解的难度.如果局部变量太多,可以难以使用Replace Temp with Query来处理,这时可以用函数对象来取代 8.2 做法 (1)建立一个新类,根据待处理函数的用途,为这个类命名. (2)在新类中建一个const字段,用

Makefile所有内嵌函数

一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1       $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”. 返回值:替换后的新字符串. 示例: $(subst ee,EE,feet on the street) 替换“feet on the street”中的“ee”为“EE”,结果得到字符串“fEEt on the strEEt”.2       $(patsubst 

C++函数返回引用、非引用以及临时变量的问题

C++中新增了引用类型,所以函数的返回值可以是引用类型.那么就会有人想问 返回引用类型与返回非引用类型有区别吗? 结论是显然的,而且有明显的区别.尤其初学者会很容易绕进去.让我们先看四个函数原型.以int类型来举例 (1) int fun(...) { return ....//后面跟的是一个引用 } 例如:int fun(int &a) { return a; } (2)int fun(...) { return....//后面跟的是一个非引用 } 例如:int  fun(int a) { r

重构改善既有代码的设计--第6章--重新组织函数

第6章 重新组织函数 6.1 Extract Method Long methods,因为包含太多信息和逻辑,不容易处理和修改.所以需要进行Extract Method. (1)场景 当一个函数过长,或者一段代码需要注释才能看懂,就可以考虑将其放入独立函数中. (2)优点 每个函数粒度小,被复用的几率大,被修改的难度也会低一些:高层函数逻辑分明. (3)做法 以"做什么"命名,而不是"怎么做".比如,printDetail(). 将源函数中的某一段提取到目标函数中.

c++第十七章-(内联函数)

1.内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.编译时,类似宏替换,使用函数体替换调用处的函数名. 一般在代码中用inline修饰,但能否形成内联函数,需要看编译器对该函数定义的具体处理. such as: inline int add(int a,int b,int c) { return a+b+c; } 不管是什么模板,编译器都必须看到全部的代码才能为一种给定的类型创建出一个新的实现来. 内联方法的引入很好的解决了在创建类模板时,避免类声明和类定义相互分离. 在类里

第 5 章 内置函数

学习导航 日期时间函数 数值数组函数 判断函数 字符串函数 其他函数 5.1 VBScript 内置函数 在前面,我们介绍了函数的使用与建立方法,其实有很多函数是不用自己动手来建立的,VBScript 早就准备好了许多常用的函数来供您调用,下面就一一来说明一些常用的函数. 5.2 日期与时间函数 VBScript 提供了许多显示日期与时间的函数,如表: 函数 用途 Now 显示今天的日期与现在的时间 Date 显示今天(计算机系统)的日期 Time 显示现在(计算机系统)的时间 Year 显示本

第2章 重新组织函数(1):提炼函数

1. 提炼函数(Extract Method) 1.1 动机 (1)函数的粒度小,被复用的机会就会更大.而且细粒度的函数覆写也会更容易. (2)简短而命名良好的函数,会使高层函数读起来就像一系列注释 1.2 做法 (1)创建一个新函数,并根据函数的意图命名(以它“做什么”来命名,而不是以它“怎么做”命名) (2)将提炼出的代码从源函数复制到新建的目标函数中. (3)仔细检查提炼出的代码,看看其中是否引用了“作用域限于源函数”的变量(如即是还是使用了源函数中的局部变量或参数) (4)检查是否有“仅

python 培训第三章 ,函数,装饰器,模块,内置函数之一函数

目录: 函数示例装饰器模块内置函数一.函数示例: 1.定义函数: def fun(args): '描述信息' 函数体 return 返回值 定义函数的三种形式: 无参函数def foo():print('in the foo') foo() 有参函数: def bar(x,y): print('in the bar') bar(1,2) 空函数: def func(): pass 空函数的应用示例: def put():pass def get():pass def cd():pass def

第二十五章 面向对象------封装、内置函数、反射、动态导入

1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性的权限分为两种: 1.公开的 没有任何限制,谁都可以访问 2.私有的 只有当前类本身能狗访问 默认为公共的 为什么要封装? 1.提高安全性 封装属性 2.隔离复杂度 封装方法 一个类中分为两种数据:属性和方法 封装属性 class Student: def __init__(self,name,ag