重构——50引入参数对象(Introduce Parameter Object)

引入参数对象(Introduce Parameter Object)

Range模式;某些参数总是很自然的同时出现;以一个对象取代这些参数

一、动机

1、碰到数据泥团,我们可以运用一个对象包装这些数据,那怕只是为了把这些数据组织在一起,这样做也是值得的

2、可以把这些参数的共同处理移到新对象中,减少重复代码

二、做法

1、新建一个类,用以表现你想替换的一组参数,将这个类设为不可变的

2、编译

3、针对使用改组参数的所有函数,实施Add Parameter,传入上述新建类的实例对象,并将此参数值设值为null

4、对于Data Clumps中的每一项(在此均为参数),从函数签名中移除之,并修改调用端和函数本体,令它们都改而通过新的参数对象取得该值

5、每去除一个参数,编译并测试

6、将原先的参数全部去除之后,观察有无适当函数可以运用Move Method搬移到参数对象之中

时间: 2024-09-20 20:35:32

重构——50引入参数对象(Introduce Parameter Object)的相关文章

重构——40引入Null对象(Introduce Null Object)

引入Null对象(Introduce Null Object) 你需要再三检查某对象是否为null:将null值替换为null对象 一.动机 1.多态最根本的好处在于:你不必在向对象询问"你是什么类型"而后根据得到的答案调用对象的某个行为--你只管调用就是了,其它的一切多态机制会为你安排妥当 2.null对象一定是常量,可以使用Singleton来实现它们 3.关于Null对象模式,你可以在Woolf[Woolf]中找到更详细的介绍 二.做法 1.为源类建立一个子类,使其行为就像是源类

重构——43添加参数(Add Parameter)

添加参数(Add Parameter) 某个函数需要从调用端得到更多信息:为此函数添加一个对象,让该对象带进函数所需信息 一.动机 你必须修改一个函数,而修改后的函数需要一些过去没有的信息,因此你要给函数添加一个参数 二.做法 1.检查函数签名是否被超类或者子类实现,如果是,则需要针对每份实现分别进行下列步骤 2.声明一个新函数,名称与原函数相同,只是加上新添参数.将旧函数代码复制到新函数中 3.编译 4.修改旧函数,令它调用新函数 5.编译,测试 6.找出旧函数所有的引用点,将它们全部修改为对

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

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

Javascript中判断变量是数组还是对象(array还是object)_javascript技巧

怎样判断一个JavaScript变量是array还是obiect? 答案: 1.如果你只是用typeof来检查该变量,不论是array还是object,都将返回'objec'. 此问题的一个可行的答案是是检查该变量是不是object,并且检查该变量是否有数字长度(当为空array时长度也可能为0). 然而,参数对象[arguments object](传给制定函数的所有参数),也可能会适用于上述方法,技术上来说,参数对象并不是一个array. 此外,当一个对象有a.length属性的时候,这个方

重构——47以明确函数取代参数(Replace Parameter with Explicit Methods)

以明确函数取代参数(Replace Parameter with Explicit Methods) 你有一个函数,其中完全取决于参数值而采取不同的行为:针对该参数的每一个可用值,建立一个独立函数 一.动机 1.根据不同参数值作出不同的行为,那么就应该使用本项重构 2.接口更加清楚 二.做法 1.针对参数的每一种可能性,新建一个明确函数 2.修改表达式的每个分支,使其调用合适的新函数 3.修改每个分支后,编译并测试 4.修改原函数的每一个被调用点,改而调用上述的某个合适的新函数 5.编译,测试

重构——49以函数取代参数(Replace Parameter with Methods)

以函数取代参数(Replace Parameter with Methods) 对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数:让参数接受者去除该项参数,并直接调用前一个参数 一.动机 如果函数可以通过其他途径获得参数值,那么它就不应该通过参数取得该值 二.做法 1.如果有必要,将参数的计算过程提炼到一个独立的函数中 2.将函数本体内引用该参数的地方改为调用新建的函数 3.每次替换后,编译并测试 4.全部替换完成后,使用Remove Parame

重构——44移除参数(Remove Parameter)

移除参数(Remove Parameter) 函数本体不再需要某个函数:将该参数去除 一.动机 不去掉多余的参数,就让用户多费一份心 二.做法 1.检查函数签名是否被超类或者子类实现,如果是,则需要针对每份实现分别进行下列步骤 2.声明一个新函数,名称与原函数相同,只是去除不必要的参数.将旧函数代码复制到新函数中 3.编译 4.修改旧函数,令它调用新函数 5.编译,测试 6.找出旧函数所有的引用点,将它们全部修改为对新函数的引用.每次修改后,编译并测试删除旧函数,或者deprecated 7.编

对象初始化器(Object Initializers)

对象初始化器(object initializers) 定义如下类   public class myclass  {    public int x;    public int y;    public myclass()    {    }    public myclass(int a, int b)    {      x = a;      y = b;    }  }对象初始化器object initializers 创建对象的时候可以使用如下语法: myclass mc = ne

Js 获取当前函数参数对象的实现代码_javascript技巧

有时候在封装控件的时候在很多 Js 函数中需要获取传入的直接参数或者对象参数,那么我们就需要每次都去判断第一个对象,所以为了方便在此封装一个函数,来获取当前函数中的参数值: /*------------------------------------------ * 清除字符串两端空格,包含换行符.制表符 *------------------------------------------*/ String.prototype.Trim = function () { return this.