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

引入Null对象(Introduce Null Object)

你需要再三检查某对象是否为null;将null值替换为null对象

一、动机

1、多态最根本的好处在于:你不必在向对象询问“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用就是了,其它的一切多态机制会为你安排妥当

2、null对象一定是常量,可以使用Singleton来实现它们

3、关于Null对象模式,你可以在Woolf[Woolf]中找到更详细的介绍

二、做法

1、为源类建立一个子类,使其行为就像是源类的null版本。在源类和null子类中都加上isNull()函数

2、编译

3、找出所有“索取源对象却获得一个null”的地方。修改这些地方,使他们改而获得一个空对象

4、找出所有“将源对象和null作比较”的地方。修改这些地方,使他们调用isNull()函数

5、编译,测试

6、找出这样的程序点:如果对象不是null,做A动作,否则做B动作

7、对于每一个上述地点,在null类中覆写A动作,使其行为和B动作相同

8、使用上述被覆写的动作,然后删除掉“对象是否等于null”的条件测试

9、编译并测试

时间: 2024-09-11 14:22:34

重构——40引入Null对象(Introduce Null Object)的相关文章

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

引入参数对象(Introduce Parameter Object) Range模式:某些参数总是很自然的同时出现:以一个对象取代这些参数 一.动机 1.碰到数据泥团,我们可以运用一个对象包装这些数据,那怕只是为了把这些数据组织在一起,这样做也是值得的 2.可以把这些参数的共同处理移到新对象中,减少重复代码 二.做法 1.新建一个类,用以表现你想替换的一组参数,将这个类设为不可变的 2.编译 3.针对使用改组参数的所有函数,实施Add Parameter,传入上述新建类的实例对象,并将此参数值设

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

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

TypeError: 'bases' is null or not an object。IE8 bug 腐朽的对象

使用Webapp Builder时候发现,在IE8上很奇怪的一个现象:在ajax回调函数中引用一个闭包作用域链中的对象作为某一个Dijit的实例化参数时有问题:bases is null or not a object. 该错误发生在WidgetManager文件中的loadWidgetSettingPage和createWidget函数中. 注释掉的部分为原来代码,经过以上修改后解决.但是不知道具体原因是什么,dojo中也有类似的解决方案.dojo/request/utils文件第85行:

简单方法判断JavaScript对象为null或者属性为空

 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined". null表示一个空对象指针,typeof操作会返回"object". 一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值.   1 2 3 4 5 6 7 var bj; alert(bj); //"undefined" bj = null; aler

简单方法判断JavaScript对象为null或者属性为空_javascript技巧

首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined". null表示一个空对象指针,typeof操作会返回"object". 一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值. var bj; alert(bj); //"undefined" bj = null; alert(typeof bj); //&

javascript null对象详解

网页特效 null对象详解 null     这是一个对象,但是为空.因为是对象,所以 typeof null  返回 'object' .     null 是 JavaScript 保留关键字.     null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值: 表达式:123 + null 结果值:123 表达式:123 * null 结果值:0 以下是不正确的方法: var exp = null; if (exp == null) {     alert("

innerhtml-无法设置属性“innerHTML”的值: 对象为 null 或未定义

问题描述 无法设置属性"innerHTML"的值: 对象为 null 或未定义 function getdbxx(posturl, paramstr, spanid, inputid) { $.ajax({ type : "post", url : posturl, dataType : 'json', data : 'portletConfigJson=${portletConfigJson}&'+paramstr, success : function(

io-dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null

问题描述 dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null 一:如下是获取单例模式的document对象. private static Document returndoc(Document docuname, String xmlname) { if (docuname != null) { return docuname; } SAXReader reader = new SAXReader(); // 如果不存在就创建对象. try { docu

criptx cab-Scriptx.cab打印的时候 对象为 null 或未定义

问题描述 Scriptx.cab打印的时候 对象为 null 或未定义 在使用Scriptx.cab打印的时候,提示安装控件,点安装后感觉没有什么反应,然后点打印,就报js错误,对象为null或未定义,前提是我现的开发机现在没有连接打印机(会不会是没有连接打印机的原因?). 下面是代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> New Document var hkey_root,hkey