《PHP設(shè)計模式介紹》第六章 偽對象模式(4)_PHP教程
推薦:《PHP設(shè)計模式介紹》第五章 注冊模式我們通常認(rèn)為避免使用全局變量是一種好的選擇,因此,對象經(jīng)常被作為參數(shù)從一段代碼傳遞到另一段。但是傳遞實例的一個問題就是對象有時候不知道將要傳遞給誰——?經(jīng)過一個函數(shù)后才被傳
讓我們從注銷功能上開始:
|
class PageDirectorTestCase extends UnitTestCase { |
在這段代碼中,response是個偽對象,然而,一旦在Response::redirect()方法中調(diào)用了exit(),腳本將會停止執(zhí)行。由于偽對象的存在,你可以核實方法是否被調(diào)用和方法傳回了什么參數(shù),且不會產(chǎn)生任何負(fù)面影響——如腳本停止——或被實際執(zhí)行。
下面是是一些幫助你認(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 { |
如下是實現(xiàn)上面測試所要求特性的代碼:
|
class PageDirector { |
這段程序已經(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的模板機(jī)制。你可以這樣引入模板文件:
| <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)注了。”
分享:《PHP設(shè)計模式介紹》第四章 單件模式幾乎所有面向?qū)ο蟮某绦蛑校傆幸粌蓚資源被創(chuàng)建出來,在程序應(yīng)用中持續(xù)被共享使用。例如,這樣的一個資源,在一個電子商務(wù)程序的數(shù)據(jù)庫連接中使用:這個連接在應(yīng)用程序啟動時初始化,程序于是
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-《PHP設(shè)計模式介紹》第六章 偽對象模式(4)
。