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