IT技术精粹[JiShuBu.Com]-倾力打造一流IT技术平台!
  • 登录
  • 注册
  • 设为首页
  • 加入收藏
  • 网站首页
  • IT风向标
  • 网站优化
  • Html
  • CSS
  • JavaScript
  • ASP
  • Php/Mysql
  • Flash
  • Ajax
  • 源码下载
  • 精美桌面
  • 供求信息
  • 超稳定100M虚拟主机只要100元,还送50M邮箱!
  • 文字广告招商中...
  • 会员注册 | 用户登录 | 我要投稿
  • 信息订阅
 php设计模式介绍之伪对象模式 您现在正在浏览:首页 > Php/Mysql > 
 php设计模式介绍之伪对象模式

作者:wangyun522 发布时间:2008-08-24 11:18:11 来源:phpchina

上文:《PHP设计模式介绍》第五章 注册模式

《PHP设计模式介绍》第六章 伪对象模式

面向对象的编程之所以丰富多彩,部分是由于对象间的相互联系与作用。一个单一的对象就能封装一个复杂的子系统,使那些很复杂的操作能够通过一些方法的调用而简化。(无所不在的数据库连接就是这样的一个对象实例。)

然而经常有这样的情况,对象间的交互性是如此复杂以至于我们不得不面对类似“先有鸡还是先有蛋”这样伤脑筋的问题:如何创建并测试这样一个对象,他要么依赖于很多已创建的对象,要么依赖于其他一些难以意识到的情况,如整个数据库的创建和测试。

问题

如何分隔并测试一个与其他对象和资源有关的代码段?又如何再创建一个或多个对象、程序来验证你的代码能正常运行?

解决方案

当用situ(或在一个仿真的程序环境中)测试一个对象代价不菲或困难重重时,就可用伪对象来模拟这个行为。伪对象有同真实对象一样的接口,但却能提供预编译响应,能跟踪方法调用,并验证调用次序。

伪对象是测试的“特别力量”。他们被秘密训练,渗透进目标代码,模拟并监视通信方式,回报结果。伪对象有助于查找和消除程序漏洞并能支持更多正常调试环境下的“防危险”操作。

注:The ServerStub
伪对象模式是另一种测试模式ServerStub的扩展。ServerStub模式替代一个资源并返回其方法所调用的相应值。当其参与指定次序的方法的调用时ServerStub就成了伪对象。

其并非是一个设计模式

本章与其他章不同,因为伪对象是一个测试模式而不是设计模式。这类似于一个附加的章节,但对它的使用        确实很值得你纳入到编码进程中。另一个不同是我们不再关注这个模式如何编码之类的基础问题,而是强调         如何在SimpleTest中使用伪对象。

本章先举一个非常简单的例子来示范SimpleTest下伪对象的基本机制。然后向你演示如何使用伪对象帮助重构已有代码与如何测试新的解决方案。

样本代码

伪对象是对象在测试中的一个替代品,用它测试代码更加简便。例如,替代一个真实的数据连接——这个真实的数据连接由于一些原因而不能实际连接——你就可以创建一个伪对象来模拟。这意味着伪对象需要准确地回应代码中所调用的相同的应用程序接口。

让我们创建一个伪对象来替代一个简单的名为Accumulator的类,这是一个求和的类。如下是最初的Accumulator类:

// PHP4
class Accumulator {
var $total=0;
function add($item) {
$this->total += $item;
}
function total() {
return $this->total;
}
}

这个类中add()函数先累加值到$total变量中,再交由total()函数返回 。 一个简单的累加也可以如下面这样(下面的代码被编写为一个函数,但它也可以写成一个类)。

function calc_total($items, &$sum) {
foreach($items as $item) {
$sum->add($item);
}
}
function calc_tax(&$amount, $rate=0.07) {
return round($amount->total() * $rate,2);
}

第一个函数calc_total()用一个累加的动作求一系列值的和。下面是简单的测试:

class MockObjectTestCase extends UnitTestCase {
function testCalcTotal() {
$sum =& new Accumulator;
calc_total(array(1,2,3), $sum);
$this->assertEqual(6, $sum->total());
}
}

让我们关注第二个例子。假设实现一个真实的累加动作的代价很大。那么用一个简单的对象来替代它并回应相关代码就是很好的做法了。使用SimpleTest,你可以用如下代码创建一个伪累加动作:

Mock::generate(‘Accumulator’);
class MockObjectTestCase extends UnitTestCase {

// ...
function testCalcTax() {
$amount =& new MockAccumulator($this);
$amount->setReturnValue(‘total’,200);
$this->assertEqual(
14, calc_tax($amount));
}
}

为了使用伪对象,具有代表性的做法是你亲自写一个新类(并不要求马上做)。幸运的是,SimpleTest有一种容易的手段来实现 Mock::generate() 方法。

1 2 3 4 5 6 7 下一页  
【评论】【加入收藏夹】【大 中 小】【打印】【关闭】
※ 相关信息
 · php设计模式介绍之单件模式  (2008-08-24 11:18:23)

发表评论
查看评论 
用户名: 密码:
验证码: 匿名发表
[注册帐号]
[控制面板]
[用户登陆]
[修改资料]
[用户收藏]
[我的状态]
[退出登陆]
 
文章搜索
     
    [添加文章]   [管理文章]
最新技术文档
    ·十天学会PHP之基础知识
    ·十天学会PHP之流程控制
    ·十天学会PHP之构建数据库
    ·十天学会PHP之连接数据库
    ·echo和print 的区别
    ·PHP生成随机字符串
    ·PHP取得文件后缀
    ·正则表达式经验谈
    ·PHP的Cookie技术介绍
    ·PHP数组排序
技术文档排行榜
    ·天气预报小偷,根据IP自动判断地址
    ·超经典计算机使用问题105答
    ·'AjaxPro'未定义错误的原因&javascript顺
    ·[初学者必读]网页制作之HTML基础知识
    ·DIV&CSS打造自动伸展三栏复合布局
    ·CSS网页布局入门教程:下拉及多级弹出式菜单
    ·阿里妈妈广告的投放技巧
    ·谁是网页浏览器引擎速度真正王者
    ·JavaScript:世界上误解最深的语言
    ·几种常用禁止修改输入框的方法
关于站点 - 广告服务 - 联系我们 - 免责声明 - 程序支持 - 网站地图 - 留言中心 - 返回顶部

Copyright © 2007-2008 www.Jishubu.com online services. All rights reserved. Template designed by laogui.
违法不良信息举报中心 津ICP备07002356号