日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

《PHP設(shè)計模式介紹》第十四章 動態(tài)記錄模式(6)_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:《PHP設(shè)計模式介紹》第十三章 適配器模式
接口的改變,是一個需要程序員們必須(雖然很不情愿)接受和處理的普遍問題。程序提供者們修改他們的代碼;系統(tǒng)庫被修正;各種程序語言以及相關(guān)庫的發(fā)展和進化。我孩子的無數(shù)玩具中有一個簡要地描

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’];
}
}
}

書簽對象已具有了動態(tài)記錄模式的核心:save()方法知道如何處理更新與插入的SQL請求,知道對象的當前狀態(tài),并且能組裝所需的參數(shù)來代替由原由對象屬性所構(gòu)成的數(shù)組。讓我們來測試一下。

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);
}
}

現(xiàn)在,讓我們轉(zhuǎn)向如何處理刪除操作。在16章――數(shù)據(jù)地圖模式中有一個例子,但是你可以方便的從insert()和update()方法中推導出來。

總結(jié)

正如大多數(shù)初次嘗試由面向過程到面向?qū)ο缶幊趟憩F(xiàn)的那樣,動態(tài)記錄模式在概念與執(zhí)行上都較為簡單。將你所有的SQL代碼都組織在一起是非常好的,并且動態(tài)記錄模式給了你一個非常好的將業(yè)務(wù)邏輯與數(shù)據(jù)庫操作相結(jié)合來持續(xù)保存對象的方法。

本章的例子用了一個真實的數(shù)據(jù)庫來開發(fā)測試代碼。另一個測試簡單數(shù)據(jù)庫代碼的方法是使用模擬對象(參見第6章)來模擬數(shù)據(jù)庫連接。不幸的是,這個方法并是廣泛有效。SQL是一個復雜的語言,模擬的每個語句都與數(shù)據(jù)庫的細節(jié)實驗密切相關(guān)。而用新建的,實際的表進行實驗則令人覺得舒服得多,沒有模擬SQL時的副作用了。

如果動態(tài)記錄模式還有不利的方面,則是其復雜性了。一個動態(tài)記錄類可能迅速的變大,就像一個塊磁鐵。例如,書簽類現(xiàn)在只有一個findById()方法,但你很有可能想要findByDescription()方法,或是findByGroup(),findRecentlyCreated()等方法。

另一個問題是對象會變得“重復”,這在save()方法中可能會看到。例如,$link與$link2在實驗用例表示的是不同的對象,但事實上它們都是指同一個書簽ID。你可以用下面的實驗來證明。

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

如果認為解決這個問題是重要的,你有可能要增加一個內(nèi)部的注冊機制(參見第五章)確保Bookmark(1)返回的所有對象的實例應是同一個對象。因為你實際上用的是new操作來建立一個對象而不是用工廠方法,作為一種實際的Active Record類,你應該將Bookmark修改為代理(參見11章)來真正解決這個問題。

另一個方面,Active Record模式被設(shè)計成一次處理一行記錄的方式。這種模式是典型的”管理”式應用的界面,如編輯一篇文章,一個鏈接,一個注釋等。但是大數(shù)的網(wǎng)頁要處理的是多數(shù)據(jù)集或是多行數(shù)據(jù),這正是我們下一章要討論的主要內(nèi)容――表數(shù)據(jù)網(wǎng)關(guān)模式。

分享:《PHP設(shè)計模式介紹》第十二章 裝飾器模式
若你從事過面向?qū)ο蟮膒hp開發(fā),即使很短的時間或者僅僅通過本書了解了一些,你會知道,你可以 通過繼承改變或者增加一個類的功能,這是所有面向?qū)ο笳Z言的一個基本特性。如果已經(jīng)存在的一個php

共6頁上一頁123456下一頁
來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
相關(guān)PHP教程