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

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

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

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

下面是是一些幫助你認(rèn)識測試功能的代碼:

class PageDirector {

// ...

function run() {

$this->processLogin();

if ($this->isLoggedIn()) {

$this->showPage(

new UserLogin($this->session->get(‘user_name’)));

} else {

$this->showLogin();

}

$this->response->display();

}

function processLogin() {

if (array_key_exists(‘clear’, $_REQUEST)) {

$this->session->clear(‘user_name’);

$this->response->redirect(SELF);

}

}

}

最后是對登錄表單的處理進(jìn)行的測試。

class PageDirectorTestCase extends UnitTestCase {

// ...

function TestLoginFromRequest() {

$_REQUEST[‘name’] = ‘admin’;

$_REQUEST[‘passwd’] = ‘secret’;

$session =& new MockSession($this);

$session->expectOnce(‘set’, array(‘user_name’,’admin’));

$response = new MockResponse($this);

$response->expectOnce(‘redirect’, array(SELF));

$page =& new PageDirector($session, $response);

$this->assertEqual(‘’, $this->runPage($page));

$response->tally();

$session->tally();

unset($_REQUEST[‘name’]);

unset($_REQUEST[‘passwd’]);

}

}

如下是實現(xiàn)上面測試所要求特性的代碼:


class PageDirector {

// ...

function processLogin() {

if (array_key_exists(‘clear’, $_REQUEST)) {

$this->session->clear(‘user_name’);

$this->response->redirect(SELF);

}

if (array_key_exists(‘name’, $_REQUEST)

&& array_key_exists(‘passwd’, $_REQUEST)

&& UserLogin::validate(

$_REQUEST[‘name’], $_REQUEST[‘passwd’])) {

$this->session->set(‘user_name’, $_REQUEST[‘name’]);

$this->response->redirect(SELF);

}

}

}

這段程序已經(jīng)重構(gòu)而且也有充分的測試,因此可以對其進(jìn)行一些附加的重構(gòu)來清除像主腳本訪問Session類,查詢不經(jīng)UserLogin類認(rèn)可的字段而去訪問‘user_name’字段,及session被當(dāng)成資源調(diào)用等的小毛病。

當(dāng)$_REQUEST這個超級變量被封裝為一個類似Session類的資源以便與偽對象的創(chuàng)建時,為何讓代碼訪問它?這段 代碼有很多問題:但它畢竟是某種人為的用來逐漸了解這些概念的例子,它是為此而被創(chuàng)造的所以你不必深究。

更為重要的是,你已經(jīng)學(xué)會利用偽對象測試模式來分離代碼,以及在測試中分離$_SESSION之類的資源和避免相互關(guān)聯(lián)的對象(如包含在Response類中的exit())產(chǎn)生不希望的結(jié)果。

問題

使用偽對象來測試代碼可以讓你分離所開發(fā)的代碼。你可以消除負(fù)面影響和潛在的問題,極大地減少你在整個測試工作中所花的時間。這是一個好消息,因為如果你花在測試上的時間越多,以后就會越省事,并且你也會希望測試不是只做一次,應(yīng)該能夠被重復(fù)進(jìn)行。(譯注:這句直譯太別扭,所以加了些使其通順的內(nèi)容。)

在新重構(gòu)的程序中仍然會有許多漏洞。比如$_REQUEST變量應(yīng)該由一個類來封裝以便于使用偽對象測試。又如 showLogin()方法的重新調(diào)用。再如所有那些addBody()方法的調(diào)用看起來是如此混亂。

這種編程風(fēng)格的另一個缺點是你將無法使用任何所見即所得的HTML編輯工具,這是因為所有HTML代碼都被包含在PHP的方法調(diào)用中了。為了避免這些限制,你可以加入一個簡單的基于PHP的模板機制。你可以這樣引入模板文件:

<form method=”post”>

Name:<input type=”text” name=”name”> Password:<input type=”password” name=”passwd”>

<input type=”submit” value=”Login”>

</form>

然后需要使用一個方法來調(diào)用它:

class Response {

// ...

/**

* adds a simple template mechanism to the response class

* @param string $template the path and name of the template file

* @return void

*/

function addBodyTemplate($template, $vars=array()) {

if (file_exists($template)) {

extract($vars);

ob_start();

include $template;

$this->_body .= ob_get_clean();

}

}

}

很明顯的,世上沒有最完美的模板引擎,但它確實使本章的示例代碼精簡整潔了。

在GoF中這種按任務(wù)進(jìn)行分隔的概念是被鼓勵的:

“分隔設(shè)計模式下對象被創(chuàng)建后,其子類的創(chuàng)建過程就可以不再關(guān)注了。”

如果你忠實地在測試中運用它的話,這句話能讓你獲益良多:你可以用內(nèi)部Factory方法來代替?zhèn)螌ο笏淼念惖膶嵗鹘y(tǒng)的測試模式所遵循的是子類化你的代碼,然后重寫對象的方法。Marcus Baker,SimpleTest的作者,為PHP創(chuàng)立了PartialMock技術(shù),那是一種測試模式的捷徑。 在其他的偽對象創(chuàng)建時你可以插入PartialMock。

如果你對理解如何在編程中使用偽對象有困難,請參見附錄B關(guān)于Partial MockObject——SimpleTest Testing Practices的一節(jié)。

資源

有一些對你更好地了解PHP下偽對象模式有幫助的資源。你可以查看關(guān)于SimpleTest下偽對象的文檔(參見http://simpletest.sf.net/SimpleTest/tutorial_MockObjects.pkg.html)。另外,Marcus Baker在2004年1月版的php|architect寫了一篇文章題為“Testing Made Easy with Mock Objects”的文章。

分享:怎樣把握技巧開發(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教程