4.7 引入NULL对象
【1】引入NULL对象范例
Book.h
#ifndef _BOOK_H
#define _BOOK_H #include <string>
using namespace std; class INULLOperator
{
public:
virtual bool isNull() = ;
}; class Book : public INULLOperator
{
public:
Book();
Book(int id, string name, double dprice); bool isNull();
string getName();
double getPrice();
static Book* createNullBook(); private:
int m_nID;
string m_strName;
double m_dPrice;
}; class NullBook : public Book
{
public:
bool isNull();
};
Book.cpp
#include "Book.h" Book::Book()
{} Book::Book(int id, string name, double dprice)
: m_nID(id)
, m_strName(name)
, m_dPrice(dprice)
{} bool Book::isNull()
{
return false;
} string Book::getName()
{
return m_strName;
} double Book::getPrice()
{
return m_dPrice;
} Book* Book::createNullBook()
{
return (new NullBook());
} bool NullBook::isNull()
{
return true;
}
main.cpp
#include "Book.h"
#include <iostream>
using namespace std; class BookService
{
public:
Book* getBook(int nId)
{
if (nId < )
{
return Book::createNullBook();
}
return (new Book(nId, "Design Pattern", ));
}
}; void main()
{
BookService *pBService = new BookService();
Book *pBook = pBService->getBook(-);
if (pBook->isNull())
{
cout << "not found. " << endl;
}
else
{
cout << "name :: " << pBook->getName() << endl;
cout << "price :: " << pBook->getPrice() << endl;
}
}
【2】总结
当你需要再三检查某个对象是否为NULL。将NULL值替换为NULL对象。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
4.7 引入NULL对象的更多相关文章
- 重构技巧 引入Null对象
描述:有两个类,学生类和导师类,学生的导师类可能不存在,因此在获取学生导师名字等信息时都要先判断导师名字是否为空.重构后通过一个空导师类来处理导师为空的相应逻辑. Before # introduce ...
- 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 对于一些场景获得的对 ...
- “equals”有值 与 “==”存在 “equals”只是比较值是否相同,值传递,==地址传递,null==a,避免引发空指针异常,STRING是一个对象==null,对象不存在,str.equals("")对象存在但是包含字符‘''
原文链接:http://www.cnblogs.com/lezhou2014/p/3955536.html "equals" 与 "==" "equa ...
- 重构指南 - 引入参数对象(Introduce Parameter Object)
当一个方法的参数超过3个以上,就可以考虑将参数封装成一个对象.将参数封装成对象后提高了代码的可读性,并且该参数对象也可以供多个方法调用,以后如果增加删除参数,方法本身不需要修改,只需要修改参数对象就可 ...
- 代码的坏味道(7)——临时字段(Temporary Field)
坏味道--临时字段(Temporary Field) 特征 临时字段的值只在特定环境下有意义,离开这个环境,它们就什么也不是了. 问题原因 有时你会看到这样的对象:其内某个实例变量仅为某种特定情况而设 ...
- 代码的坏味道(6)——Switch声明(Switch Statements)
坏味道--Switch声明(Switch Statements) 特征 你有一个复杂的 switch 语句或 if 序列语句. 问题原因 面向对象程序的一个最明显特征就是:少用 switch 和 c ...
- [转] Agile Software Development 敏捷软件开发
原文作者:kkun 原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷是什么 ...
- C#重构之道
定义 重构的定义:在不改变软件可观察行为的前提下,改善其内部结构. 其中,不改变软件行为,是重构最基本的要求.要想真正发挥威力,就必须做到“不需了解软件行为”. 如果一段代码能让你容易了解其行为,说明 ...
随机推荐
- python摸爬滚打之day02----while循环,运算符,格式化输出
1.while循环 1.1 结构:while +条件判断: while 循环体 else: 条件不成立时语句块 while...else...是一个循环整体,当循环条件成立时执行while循环体内容 ...
- js数组方法汇总
下面主要汇总一下数组的方法 数组方法: 1.检测是否为数组的方法:Array.isArrray(); var arr=[1,2,3,4,5]; var str='string'; console.lo ...
- html简单网页1
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- UIImage常用封装
根据颜色返回图片,根据str返回颜色,压缩UIImage不大于300k .h代码: #import <Foundation/Foundation.h> @interface ImageSe ...
- Java基础知识(重载和覆盖)
重载(overload): 在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了. 即当函数同名时,只看参数列表.和返回值类型没关系. 重 ...
- GUI库之Tkinter组件(二)
一.Lable组件 Lable组件是用于在界面上输出描述的标签: 1.举个例子. # Lable组件 from tkinter import * root = Tk() root.title(&quo ...
- SQL——查询一段时间内每天的数据,按天将数据封装进行封存
DROP TABLE IF EXISTS `T_ROTA_RECORD`; CREATE TABLE `T_ROTA_RECORD` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- Spark之数据倾斜 --采样分而治之解决方案
1 采样算法解决数据倾斜的思想 2 采样算法在spark数据倾斜中的具体操作
- 微信小程序中this使用
微信小程序中,在wx.request({});方法调用成功或者失败之后,有时候会需要获取页面初始化数据data的情况,这个时候,如果使用,this.data来获取,会出现获取不到的情况,调试页面也会报 ...
- vue弹窗组件
文件结构 component.vue <template> <div class="_vuedals" v-show="show"> & ...