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

談php設(shè)計模式介紹——偽對象模式_PHP教程

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

推薦:解析php字符串處理函數(shù)
addcslashes 為字符串里面的部分字符添加反斜線轉(zhuǎn)義字符 addslashes 用指定的方式對字符串里面的字符進行轉(zhuǎn)義 bin2hex 將二進制數(shù)據(jù)轉(zhuǎn)換成十六進制表示 chr 返回一個字符的ASCII碼 chunk_split 按一定的字符長度將字符串分割成小塊 convert_cyr_string 將斯

《PHP設(shè)計模式介紹》第六章 偽對象模式

面向?qū)ο蟮木幊讨载S富多彩,部分是由于對象間的相互聯(lián)系與作用。一個單一的對象就能封裝一個復(fù)雜的子系統(tǒng),使那些很復(fù)雜的操作能夠通過一些方法的調(diào)用而簡化。(無所不在的數(shù)據(jù)庫連接就是這樣的一個對象實例。)

然而經(jīng)常有這樣的情況,對象間的交互性是如此復(fù)雜以至于我們不得不面對類似“先有雞還是先有蛋”這樣傷腦筋的問題:如何創(chuàng)建并測試這樣一個對象,他要么依賴于很多已創(chuàng)建的對象,要么依賴于其他一些難以意識到的情況,如整個數(shù)據(jù)庫的創(chuàng)建和測試。

問題

如何分隔并測試一個與其他對象和資源有關(guān)的代碼段?又如何再創(chuàng)建一個或多個對象、程序來驗證你的代碼能正常運行?

解決方案

當用situ(或在一個仿真的程序環(huán)境中)測試一個對象代價不菲或困難重重時,就可用偽對象來模擬這個行為。偽對象有同真實對象一樣的接口,但卻能提供預(yù)編譯響應(yīng),能跟蹤方法調(diào)用,并驗證調(diào)用次序。

偽對象是測試的“特別力量”。他們被秘密訓(xùn)練,滲透進目標代碼,模擬并監(jiān)視通信方式,回報結(jié)果。偽對象有助于查找和消除程序漏洞并能支持更多正常調(diào)試環(huán)境下的“防危險”操作。

注:The ServerStub
偽對象模式是另一種測試模式ServerStub的擴展。ServerStub模式替代一個資源并返回其方法所調(diào)用的相應(yīng)值。當其參與指定次序的方法的調(diào)用時ServerStub就成了偽對象。

其并非是一個設(shè)計模式

本章與其他章不同,因為偽對象是一個測試模式而不是設(shè)計模式。這類似于一個附加的章節(jié),但對它的使用 確實很值得你納入到編碼進程中。另一個不同是我們不再關(guān)注這個模式如何編碼之類的基礎(chǔ)問題,而是強調(diào) 如何在SimpleTest中使用偽對象。

本章先舉一個非常簡單的例子來示范SimpleTest下偽對象的基本機制。然后向你演示如何使用偽對象幫助重構(gòu)已有代碼與如何測試新的解決方案。

樣本代碼

偽對象是對象在測試中的一個替代品,用它測試代碼更加簡便。例如,替代一個真實的數(shù)據(jù)連接——這個真實的數(shù)據(jù)連接由于一些原因而不能實際連接——你就可以創(chuàng)建一個偽對象來模擬。這意味著偽對象需要準確地回應(yīng)代碼中所調(diào)用的相同的應(yīng)用程序接口。

讓我們創(chuàng)建一個偽對象來替代一個簡單的名為Accumulator的類,這是一個求和的類。如下是最初的Accumulator類:

// PHP4

class Accumulator {

var $total=0;

function add($item) {

$this->total = $item;

}

function total() {

return $this->total;

}

}

這個類中add()函數(shù)先累加值到$total變量中,再交由total()函數(shù)返回 。 一個簡單的累加也可以如下面這樣(下面的代碼被編寫為一個函數(shù),但它也可以寫成一個類)。

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

第一個函數(shù)calc_total()用一個累加的動作求一系列值的和。下面是簡單的測試:

class MockObjectTestCase extends UnitTestCase {

function testCalcTotal() {

$sum =& new Accumulator;

calc_total(array(1,2,3), $sum);

$this->assertEqual(6, $sum->total());

}

}

讓我們關(guān)注第二個例子。假設(shè)實現(xiàn)一個真實的累加動作的代價很大。那么用一個簡單的對象來替代它并回應(yīng)相關(guān)代碼就是很好的做法了。使用SimpleTest,你可以用如下代碼創(chuàng)建一個偽累加動作:

Mock::generate(‘Accumulator’);

class MockObjectTestCase extends UnitTestCase {

// ...

function testCalcTax() {

$amount =& new MockAccumulator($this);

$amount->setReturnValue(‘total’,200);

$this->assertEqual(

14, calc_tax($amount));

}

}

為了使用偽對象,具有代表性的做法是你親自寫一個新類(并不要求馬上做)。幸運的是,SimpleTest有一種容易的手段來實現(xiàn) Mock::generate() 方法。

分享:怎樣把握技巧開發(fā)PHP網(wǎng)站
1.使用 ip2long() 和 long2ip() 函數(shù)來把 IP 地址轉(zhuǎn)化成整型存儲到數(shù)據(jù)庫里。這種方法把存儲空間降到了接近四分之一(char(15) 的 15 個字節(jié)對整形的 4 個字節(jié)),計算一個特定的地址是不是在一個區(qū)段內(nèi)頁更簡單了,而且加快了搜索和排序的速度(雖然有時僅

共7頁上一頁1234567下一頁
來源:模板無憂//所屬分類:PHP教程/更新時間:2009-06-20
相關(guān)PHP教程