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

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. C++ 实现按随意键继续~~~

    近期让学生敲代码交作业的时候要求他们仅仅给我交个cpp文件和一个exe文件,这样交上来的东西不至于太多,不占我的地方,可是有一个问题是exe它总是执行完后就直接关闭界面了,看不到执行结果的界面. 然后 ...

  2. 【02】尽量以const,enum,inline替换#define

    1.考虑为什么? 首先,#define不是语言的一部分,而是预编译过程.也就是在编译器编译之前,进行文本替换.考虑#define Pi 3.1425:在编译之前,Pi都会被文本替换为3.1415,因此 ...

  3. sql 生成excel

    1创建存储过程 create PROCEDURE [dbo].[UP_Export_Data_To_CSV] @Table NVARCHAR(), @Path NVARCHAR(), @Subfix ...

  4. 如何实现windows和linux之间的文件传输

    2010-04-25 18:10 如何实现windows和linux之间的文件传输 如果想从windows中传送大量文件到Linux中,想必会难倒部分Linux初学者,尤其是文件很大时.我曾试过在li ...

  5. [转]VS2010 (C#)winform程序打包发布图解

    1.新建一个Windows窗体应用程序,例如项目名为monitor,功能略.新建的时候不要忘了创建解决方案. 2.在monitor解决方案上“右击”—— “添加”——“新建项目”,选择“其他类型项目” ...

  6. Linux 释放cached内存

    使用free -m 查看系统使用的内存情况: # free -m             total      used      free      shared      buffers     ...

  7. css图片垂直居中

    css图片垂直居中一.style代码 .case-pic{ height: 125px; position: relative; text-align: center } .case-pic span ...

  8. mysql内存使用情况

    可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...

  9. oracle EBS中使用PLSQL提交"关闭离散"并发请求

    declare l_request_id number; l_return_flag boolean; l_num_user_id number; l_num_resp_id number; l_nu ...

  10. YII中的session和cookie

    session的使用 存储数据 Yii::app()->session["名"] = 值; 取数据 $变量 = Yii::app()->session["名& ...