PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 高级应用 >> 

PHP设计模式介绍 第十四章 动态记录模式

PHP设计模式介绍 第十四章 动态记录模式

来源:互联网  作者:  发布时间:2010-05-22
到目前为止,您所看到的这些设计模式大大提高了代码的可读性与

class  Bookmark  {
//  ...
public  function  save()  {
if  ($this->id  ==  self::NEW_BOOKMARK)  {
$this->insert();
}  else  {
$this->update();
}
$this->setTimeStamps();
}
protected  function  setTimeStamps()  {
$rs  =  $this->conn->execute(
self::SELECT_BY_ID
,array($this->id));
if  ($rs)  {
$row  =  $rs->fetchRow();
$this->created  =  $row[‘created’];
$this->updated  =  $row[‘updated’];


}
}
}

书签对象已具有了动态记录模式的核心:save()方法知道如何处理更新与插入的SQL请求,知道对象的当前状态,并且能组装所需的参数来代替由原由对象属性所构成的数组。让我们来测试一下。

class  ActiveRecordTestCase  extends  UnitTestCase  {
//  ...
function  testSave()  {
$link  =  Bookmark::add(
‘http://blog.casey-sweat.us/’,
‘My  Blog’,
‘Where  I  write  about  stuff’,
‘php’);
$link->description  =
‘Where  I  write  about  PHP,  Linux  and  other  stuff’;
$link->save();
$link2  =  Bookmark($link->getId());
$this->assertEqual($link->getId(),  $link2->getId());
$this->assertEqual($link->created,  $link2->updated);

}
}

现在,让我们转向如何处理删除操作。在16章――数据地图模式中有一个例子,但是你可以方便的从insert()和update()方法中推导出来。

总结

正如大多数初次尝试由面向过程到面向对象编程所表现的那样,动态记录模式在概念与执行上都较为简单。将你所有的SQL代码都组织在一起是非常好的,并且动态记录模式给了你一个非常好的将业务逻辑与数据库操作相结合来持续保存对象的方法。

本章的例子用了一个真实的数据库来开发测试代码。另一个测试简单数据库代码的方法是使用模拟对象(参见第6章)来模拟数据库连接。不幸的是,这个方法并是广泛有效。SQL是一个复杂的语言,模拟的每个语句都与数据库的细节实验密切相关。而用新建的,实际的表进行实验则令人觉得舒服得多,没有模拟SQL时的副作用了。

如果动态记录模式还有不利的方面,则是其复杂性了。一个动态记录类可能迅速的变大,就像一个块磁铁。例如,书签类现在只有一个findById()方法,但你很有可能想要findByDescription()方法,或是findByGroup(),findRecentlyCreated()等方法。

另一个问题是对象会变得“重复”,这在save()方法中可能会看到。例如,$link与$link2在实验用例表示的是不同的对象,但事实上它们都是指同一个书签ID。你可以用下面的实验来证明。

class  ActiveRecordTestCase  extends  UnitTestCase  {
//  ...
function  testSave()  {
//  ...
$this->assertNotIdentical($link,  $link2);
}
}

如果认为解决这个问题是重要的,你有可能要增加一个内部的注册机制(参见第五章)确保Bookmark(1)返回的所有对象的实例应是同一个对象。因为你实际上用的是new操作来建立一个对象而不是用工厂方法,作为一种实际的Active Record类,你应该将Bookmark修改为代理(参见11章)来真正解决这个问题。

另一个方面,Active Record模式被设计成一次处理一行记录的方式。这种模式是典型的”管理”式应用的界面,如编辑一篇文章,一个链接,一个注释等。但是大数的网页要处理的是多数据集或是多行数据,这正是我们下一章要讨论的主要内容――表数据网关模式。


延伸阅读:
从魔兽看PHP设计模式
《PHP设计模式介绍》导言
PHP设计模式介绍 第一章 编程惯用法
PHP设计模式介绍 第二章 值对象模式
PHP设计模式介绍 第三章 工厂模式
PHP设计模式介绍 第四章 单件模式
PHP设计模式介绍 第五章 注册模式
PHP设计模式介绍 第六章 伪对象模式
PHP设计模式介绍 第七章 策略模式
PHP设计模式介绍 第八章 迭代器模式
PHP设计模式介绍 第九章 观测模式
PHP设计模式介绍 第十章 规范模式
PHP设计模式介绍 第十一章 代理模式
PHP设计模式介绍 第十二章 装饰器模式
PHP设计模式介绍 第十三章 适配器模式
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号