重构技巧 引入Null对象
描述:有两个类,学生类和导师类,学生的导师类可能不存在,因此在获取学生导师名字等信息时都要先判断导师名字是否为空。重构后通过一个空导师类来处理导师为空的相应逻辑。
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对象的更多相关文章
- 4.7 引入NULL对象
[1]引入NULL对象范例 Book.h #ifndef _BOOK_H #define _BOOK_H #include <string> using namespace std; cl ...
- 重构指南 - 引入参数对象(Introduce Parameter Object)
当一个方法的参数超过3个以上,就可以考虑将参数封装成一个对象.将参数封装成对象后提高了代码的可读性,并且该参数对象也可以供多个方法调用,以后如果增加删除参数,方法本身不需要修改,只需要修改参数对象就可 ...
- Java常见重构技巧 - 去除不必要的!=null判断空的5种方式,很少有人知道后两种
常见重构技巧 - 去除不必要的!= 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?@pdai 常见重构技巧 - 去除不必要的!= 场景一:null无意义之常规判断空 ...
- RefactoringGuru 代码异味和重构技巧总结
整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子...但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加 ...
- 常见重构技巧 - 5种方式去除多余的if else
常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...
- IntelliJ IDEA 复杂的重构技巧
IntelliJ IDEA 复杂的重构技巧(二) 转载 上次我说了一些 "复杂的重构技巧" ,讲的是一些使用 IntelliJ 的简单功能实现复杂的重构需求的技巧. 看到大家的反响 ...
- Java String 对 null 对象的容错处理
前言 最近在读<Thinking in Java>,看到这样一段话: Primitives that are fields in a class are automatically ini ...
- Groovy 设计模式 -- null对象模式
Null Object Pattern http://groovy-lang.org/design-patterns.html#_loan_my_resource_pattern 对于一些场景获得的对 ...
- 前端页面重构技巧总结TIP【持续更新...】
本文均为项目实战经验,要求兼容至IE8,所以以下内容均为兼容代码,欢迎各位小伙伴批评指教.其实重构页面是一门学问,看似简单,却暗藏很多学问.实际项目中页面的重构有以下几点最基本需求: 1.需要使用合理 ...
随机推荐
- linux下.run文件的安装与卸载
linux下.run文件的安装与卸载 .run文件的安装很简单,只需要为该文件增加可执行属性,即可执行安装 以 virtualbox 的安装文件 virtualbox-3.1.6-59338-Li ...
- SensorThread线程
SensorThread && createEventQueue http://www.csdn.com/html/itweb/20131101/200375.htm_123 htt ...
- dmesg 程序崩溃调试2
dmesg命令基于缓冲区打印信息dmesg -c可以清除该内存信息清除后demsg 命令不显示任何信息,但可以到/var/log/dmesg查看信息 dmesg |tail 20dmesg |head ...
- 5 Things They Never Tell You About Making iPhone Apps
http://blog.teamtreehouse.com/5-things-they-never-tell-you-about-making-iphone-apps So, you've decid ...
- Android(java)学习笔记142:使用Sqlite基本流程
- Flume简介与使用(一)——Flume安装与配置
Flume简介与使用(一)——Flume安装与配置 Flume简介 Flume是一个分布式的.可靠的.实用的服务——从不同的数据源高效的采集.整合.移动海量数据. 分布式:可以多台机器同时运行采集数据 ...
- (转)Ilist 和list的区别归纳总结
常见问题: Ilist <> 本身只是一个泛型接口, 既然是接口当然不能实例化,只能用如下方法 IList <Class1> IList11 =new List <Cla ...
- C#如何配置应用程序域
转载:http://www.csharpwin.com/csharpspace/9175r9023.shtml 您可以使用 AppDomainSetup 类,为新应用程序域提供带有配置信息的公共语言运 ...
- Android 讯飞语音之语音合成(在线有声朗读)
原文:http://www.cnblogs.com/scetopcsa/p/3845427.html 在线语音合成的使用方法: 首先下载相关的sdk,这个网址里有多种版本,我选择的Android. h ...
- StringToInt
public class Stringtoint { public static void stringtoint(String s){ //判断字符串是否为null和是否为空 ...