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

《PHP設(shè)計(jì)模式介紹》第六章 偽對(duì)象模式(4)_PHP教程

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

推薦:《PHP設(shè)計(jì)模式介紹》第五章 注冊(cè)模式
我們通常認(rèn)為避免使用全局變量是一種好的選擇,因此,對(duì)象經(jīng)常被作為參數(shù)從一段代碼傳遞到另一段。但是傳遞實(shí)例的一個(gè)問(wèn)題就是對(duì)象有時(shí)候不知道將要傳遞給誰(shuí)——?經(jīng)過(guò)一個(gè)函數(shù)后才被傳

讓我們從注銷功能上開(kāi)始:

class PageDirectorTestCase extends UnitTestCase {
// ...
function TestClearLoginFunctionality() {
$_REQUEST[‘clear’] = null;
$session =& new MockSession($this);
$session->expectOnce(‘clear’, array(‘user_name’));
$session->setReturnValue(‘get’, null, array(‘user_name’));
$session->expectAtLeastOnce(‘get’);
$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[‘clear’]);
}
}


在這段代碼中,response是個(gè)偽對(duì)象,然而,一旦在Response::redirect()方法中調(diào)用了exit(),腳本將會(huì)停止執(zhí)行。由于偽對(duì)象的存在,你可以核實(shí)方法是否被調(diào)用和方法傳回了什么參數(shù),且不會(huì)產(chǎn)生任何負(fù)面影響——如腳本停止——或被實(shí)際執(zhí)行。

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


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

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

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


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

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

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

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


問(wèn)題

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

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

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

<form method=”post”>
Name:<input type=”text” name=”name”> Password:<input type=”password” name=”passwd”>
<input type=”submit” value=”Login”>
</form>

然后需要使用一個(gè)方法來(lái)調(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();
}
}
}

很明顯的,世上沒(méi)有最完美的模板引擎,但它確實(shí)使本章的示例代碼精簡(jiǎn)整潔了。

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

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

分享:《PHP設(shè)計(jì)模式介紹》第四章 單件模式
幾乎所有面向?qū)ο蟮某绦蛑�,總有一兩個(gè)資源被創(chuàng)建出來(lái),在程序應(yīng)用中持續(xù)被共享使用。例如,這樣的一個(gè)資源,在一個(gè)電子商務(wù)程序的數(shù)據(jù)庫(kù)連接中使用:這個(gè)連接在應(yīng)用程序啟動(dòng)時(shí)初始化,程序于是

共4頁(yè)上一頁(yè)1234下一頁(yè)
來(lái)源:模板無(wú)憂//所屬分類:PHP教程/更新時(shí)間:2008-08-22
相關(guān)PHP教程