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

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. The TCP three-way handshake (connect)/four wave (closed)

    TCP, relative to the SOCKET developers create process and link remove process consists of the TCP/IP ...

  2. ARR状态监控脚本

    ##################################################################################### # THIS IS SAMP ...

  3. Linux新手入门:通过chmod改变文件权限--转

    前面介绍过在Linux中如何查看文件的属性,在Linux文件权限详解中我们介绍了Linux文件的三种身份和四种权限,三种身份分别为: u:文件的拥有者 g:文件所属的群组 o:其他用户 对于每个身份, ...

  4. 从源码角度深入理解LayoutInflater

    关于LayoutInflater,在开发中经常会遇到,特别是在使用ListView的时候,这个几乎是必不可少.今天我们就一起来探讨LayoutInflater的工作原理. 一般情况下,有两种方式获得一 ...

  5. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  6. Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量

    为什么匿名内部类参数必须为final类型: 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...

  7. virtualization-vs-containerization

    http://containerz.blogspot.com/2015/03/virtualization-vs-containerization.html Virtualization vs. Co ...

  8. NSObject中的isa到底是个什么?

    首先看一下NSObject的定义: @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } 官方解释:Eve ...

  9. .NET 统一用户管理 -- 统一鉴权

    统一鉴权 目的 为什么要统一鉴权了,每一个业务系统几乎都离不开,用户,角色,权限 这个 3个基础功能,为了避免各个系统各自去开发一套权限管理等基础功能,也同时轻松管理每个用户的全部权限. 怎么做   ...

  10. Unity 3D 文件导入出错误解决方法以及unity圣典离线版下载地址

    1.安装unity 时我选择了free版的,打开已有项目时出现如下错误提示. 解决方法:先把要导入的文件先拷贝到unity3d安装目录下对应的文件夹内,之后再返回unity3d软件,右键选择“导入”. ...