描述:有两个类,学生类和导师类,学生的导师类可能不存在,因此在获取学生导师名字等信息时都要先判断导师名字是否为空。重构后通过一个空导师类来处理导师为空的相应逻辑。

Before

 # introduce null object

 class Master:
def __init__(self):
pass def setValue(self, name, major, age):
self.name = name
self.major = major
self.age = age def getName(self):
return self.name def getMajor(self):
return self.major def getAge(self):
return str(self.age) class Student:
def __init__(self, name):
self.master = None def setMaster(self, masterName):
self.master = masterName def getMaster(self):
return self.master def getMasterNameByStudent(student):
master = student.getMaster()
if master is not None:
print master.getName()
else:
print "Not exist" def getMasterMajorByStudent(student):
master = student.getMaster()
if master is not None:
print master.getMajor()
else:
print "Not exist" def getMasterAgeByStudent(student):
master = student.getMaster()
if master is not None:
print master.getAge()
else:
print "Not exist"

After

 # introduce null object

 class Master:
def __init__(self):
pass def setValue(self, name, major, age):
self.name = name
self.major = major
self.age = age def isNull(self):
return False def getName(self):
return self.name def getMajor(self):
return self.major def getAge(self):
return str(self.age) class NoneMaster(Master):
def isNull(self):
return True def getName(self):
return "Not exist" def getMajor(self):
return "Not exist" def getAge(self):
return "Not exist" class Student:
def __init__(self, name):
self.master = None def setMaster(self, master):
self.master = master def getMaster(self):
if self.master is None:
return NoneMaster()
else:
return self.master def getMasterNameByStudent(student):
master = student.getMaster()
print master.getName() def getMasterMajorByStudent(student):
master = student.getMaster()
print master.getMajor() def getMasterAgeByStudent(student):
master = student.getMaster()
print master.getAge()

测试:

 master_1 = Master()
master_1.setValue("zhang liang", "computer", 40) foo_1 = Student("wang gang")
foo_1.setMaster(master_1) foo_2 = Student("li ming") getMasterNameByStudent(foo_1)
getMasterNameByStudent(foo_2)
print getMasterMajorByStudent(foo_1)
getMasterMajorByStudent(foo_2)
print getMasterAgeByStudent(foo_1)
getMasterAgeByStudent(foo_2)

参考:重构 Martin Fowler 人民邮电出版社

重构技巧 引入Null对象的更多相关文章

  1. 4.7 引入NULL对象

    [1]引入NULL对象范例 Book.h #ifndef _BOOK_H #define _BOOK_H #include <string> using namespace std; cl ...

  2. 重构指南 - 引入参数对象(Introduce Parameter Object)

    当一个方法的参数超过3个以上,就可以考虑将参数封装成一个对象.将参数封装成对象后提高了代码的可读性,并且该参数对象也可以供多个方法调用,以后如果增加删除参数,方法本身不需要修改,只需要修改参数对象就可 ...

  3. Java常见重构技巧 - 去除不必要的!=null判断空的5种方式,很少有人知道后两种

    常见重构技巧 - 去除不必要的!= 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?@pdai 常见重构技巧 - 去除不必要的!= 场景一:null无意义之常规判断空 ...

  4. RefactoringGuru 代码异味和重构技巧总结

    整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子...但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加 ...

  5. 常见重构技巧 - 5种方式去除多余的if else

    常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...

  6. IntelliJ IDEA 复杂的重构技巧

    IntelliJ IDEA 复杂的重构技巧(二) 转载 上次我说了一些 "复杂的重构技巧" ,讲的是一些使用 IntelliJ 的简单功能实现复杂的重构需求的技巧. 看到大家的反响 ...

  7. Java String 对 null 对象的容错处理

    前言 最近在读<Thinking in Java>,看到这样一段话: Primitives that are fields in a class are automatically ini ...

  8. Groovy 设计模式 -- null对象模式

    Null Object Pattern http://groovy-lang.org/design-patterns.html#_loan_my_resource_pattern 对于一些场景获得的对 ...

  9. 前端页面重构技巧总结TIP【持续更新...】

    本文均为项目实战经验,要求兼容至IE8,所以以下内容均为兼容代码,欢迎各位小伙伴批评指教.其实重构页面是一门学问,看似简单,却暗藏很多学问.实际项目中页面的重构有以下几点最基本需求: 1.需要使用合理 ...

随机推荐

  1. os4开始CLLocationManager类中不支持locationServicesEnabled属性了

    locationServicesEnabled改为类方法 //判断定位服务是否开启 if ([CLLocationManager locationServicesEnabled]) { }

  2. 亿级数据时,内存性能低于IO性能

    最近因项目需要,需要生成有0到99999999共1亿的不重复数,于是想着直接将这些数据生成为一个文件就可以了,代码如. private void generate(string savePath) { ...

  3. [Javascript] Immute Object

    Three ways to make object immutable: 1. Use JSON.parse(JSON.stringify(obj)): this approach is little ...

  4. PullToRefreshScrollView 修改下拉刷新图标

    我的修改比较简单暴力.网上查了一番,貌似大家都没有改,无奈,查了一下源码.发现如下资源目录: 在看看我们的布局文件,此三个图片就是下拉刷新的三种图标 好吧,flip就是我目前的下拉刷新图片,对应的也就 ...

  5. 整理 iOS 9 适配中出现的坑

    本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级 ...

  6. [转]Form Builder:app_field.clear_dependent_fields和APP_FIELD.set_dependent_field的用法

    转自:http://www.cnblogs.com/toowang/p/3668070.html 可以调用APP_FIELD.clear_dependent_fields和APP_FIELD.set_ ...

  7. day-4

    /* 早上黑板上的倒计时变成了120小时 嗯 很快就要结束了 上午考试 据老师说很简单 老师 :"我就说说~"..... 下午改题 T3好辣脑子 感觉智商不够了 T2dp写丑了 然 ...

  8. JQuery对象与DOM对象分析

    一.定义: DOM对象(文档对象模型):暂时这么理解:通过JavaScript获取的HTML元素,称为DOM对象.如:var domID=document.getElementById("i ...

  9. UpdateProgress使用

    UpdateProgress是一个进度显示条,加在AJAX里能显得更加的人性化(个人认为).现在我们就开始吧: 第一.新建一个AJAX项目.在页面上加上ScriptManager,UpdatePane ...

  10. 20160331javaweb之JSP 标签技术

    jsp的标签技术:在jsp页面中最好不要出现java代码,这时我们可以使用标签技术将java代码替换成标签来表示 1.jsp标签:sun原生提供的标签直接在jsp页面中就可以使用 <jsp:in ...