重构——16引入外加函数(Introduce Foreign Method)

引入外加函数(Introduce Foreign Method)

你需要为提供服务的类增加一个函数,但你无法修改这个类;在客户端建立一个函数,并以第一参数形式传入一个服务类实例

一、动机

1、服务类不能提供一项新服务,你又不能修改源码

2、如果需要大量的外加函数,就Introduce Local Extension

3、外加函数是权宜之计

二、做法

1、在客户端类建立一个函数,用来提供你需要的功能,这个函数不应该调用客户端类的任何特性。如果他需要一个值,把该值当做参数传给它

2、以服务类实例作为该函数的第一个参数

3、将该函数注释为:外加函数,应该在服务类实现

时间: 2024-07-30 12:17:43

重构——16引入外加函数(Introduce Foreign Method)的相关文章

重构——2内联函数(Inline Method)

内联函数(Inline Method) 一个函数本体与名称同样清楚易懂,在函数调用点插入函数本体,然后移除该函数. 一.动机 1.非必要的间接性总让人不舒服 2.把组织不合理的一群函数重新组织 3.并不是所有的间接层都有价值,委托太多,会让人晕头转向 二.做法 1.检查函数,确定它不具多态性 2.找出这个函数所有的被调用点 3.将这个函数所有的调用点都替换为函数本体 4.编译,测试 5.删除该函数的定义

重构——10搬移函数(Move Method)

搬移函数(Move Method) 你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或者被后者调用.在该函数最常引用的类中建立一个有着类似行为的新函数.将就函数变成一个单纯的委托函数,或是将旧函数完全移除 一.动机 减少类之间的耦合,是系统中的类更简单,更干净利落的完成系统交付的任务 二.做法 1.检查源类中被原函数所使用的一切特性,考虑它们是否也应该被搬移.考虑是否要将使用相同特性的函数一并搬移 2.检查源类的超类和子类,看看是否有该函数的其他声明 3.在目标类中声明这个

重构——41引入断言(Introduce Assertion)

引入断言(Introduce Assertion) 某一段代码需要对程序状态作出某种假设:以断言明确表现这种假设 一.动机 断言是一个条件表达式,应该总是为真.如果它失败了,表示程序员犯了错误.因此断言的失败应该导致一个非受控异常.断言绝对不能被系统的其它部分使用.实际上,程序最后成品往往将断言统统删除,因此,标记"某些东西是个断言"是很重要的 二.做法 1.如果你发现代码假设某个条件始终为真,就加入一个断言说明这种情况 2.简化函数调用

重构——17引入本地扩展(Introduce Local Extension)

引入本地扩展(Introduce Local Extension) 你需要为服务类提供一些额外函数,但你无法修改这个类:建立一个新类,使它包含这些额外函数,让这个类扩展成为源类的子类或者包装类 一.动机 1.需要的额外函数超过俩,Introduce Foreign Method Hold不住了 2.包装类和子类怎么选择? 二.做法 1.建立一个扩展类,将它作为原始类的子类或者包装类 2.在扩展类中加入转型构造函数 3.在扩展类中加入新特性 4.根据需要,将源对象替换为扩展对象 5.将针对原始类定

重构——1提炼函数(Extract Method)

提炼函数(Extract Method) 你有一段代码可以被组织在一起并独立出来,将这段代码放进一个独立的函数中,并让函数名称解释该函数的用途. 一.动机 1.每个函数的粒度都小,那么被复用的几率就大 2.函数的长度不是问题,关键在于函数名称和函数本体之间的语义距离 3.使高层函数读起来向一系列注释 4.如果函数都是细粒度,那么函数覆盖也会更容易些 二.做法 1.创建函数,名字要起好 2.转移代码 3.检查提炼出的代码是否引用了作用域限于原函数的变量(临时变量和源函数参数) 4.检查是否有任何的

重构——8以函数对象取代函数(Replace Method with Method Object)

以函数对象取代函数(Replace Method with Method Object) 有一个大型函数,其中对局部变量的使用使你无法采用Extract Method.将这个函数放进一个单独的对象里中,如此一来局部变量就成了对象内的字段,然后你就可以在同一个对象中将这个大型函数分解为多个小型函数 一.动机 1.小函数优美动人,只要将相对独立的代码从大型函数中提炼出来,就可以大大提高代码的可读性 2.局部变量的存在会增加函数分解难度.如果一个函数之中局部变量泛滥成灾,那么想分解这个函数是非常困难的

重构——52隐藏函数(Hide Method)

隐藏函数(Hide Method) 有一个函数,从来没有被其它任何类用到:将这个函数改为private 一.动机 提高函数可见度容易,降低稍微困难一些 二.做法 1.经常检查有没有可能降低某个函数的可见度 2.尽可能降低所有函数的可见度 3.没完成一组函数的隐藏之后,编译并测试

16个Excel函数公式你都懂吗?

  为了方便日常工作,收集了以下常用的16个Excel函数公式. 1.查找重复内容公式: =IF(COUNTIF (A:A,A2)>1,"重复","") 2.查找重复身份证号码公式: =IF(COUNTIF(A:A,A2&"*")>1,"重复","") 3.用出生年月来计算年龄公式: =DATEDIF(A2,TODAY(),"y") 4.根据身份证号计算出生年月公式:

C++程序设计:原理与实践(进阶篇)16.4 函数对象

16.4 函数对象 因此,我们希望向f?ind_if()传递断言,同时希望断言能够将元素与以参数形式传递的值进行比较.特别地,我们希望能编写如下形式的代码:   显然,Larger_than必须满足如下条件: 能作为断言被调用,例如,pred(*f?irst): 能够存储一个数值,例如31或x,以备调用时使用. 为了满足这些条件,我们需要"函数对象",即一种能够实现函数行为的对象.我们需要对象的原因是对象能够存储数据,例如待比较的值.举例来说:   有趣的是,此定义就能使前面的例子正常