《PHP設(shè)計(jì)模式介紹》第三章 工廠模式(3)_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第二章 值對(duì)象模式在所有的最簡單的程序中,大多數(shù)對(duì)象都有一個(gè)標(biāo)識(shí),一個(gè)重要的商業(yè)應(yīng)用對(duì)象,例如一個(gè)Customer或者一個(gè)SKU,有一個(gè)或者更多的屬性---id,name,email地址,這樣可以把它從同一個(gè)類的其他實(shí)例區(qū)分開
例子:增加一些顏色
讓我們更深入工廠模式吧。繼續(xù)如前,先建立一個(gè)能為本章節(jié)的其它部分持續(xù)舉例說明的簡單類。 這是一個(gè)輸出十六進(jìn)制的HTML RGB Color類,包括了R, G, 和 B三個(gè)屬性(在構(gòu)造對(duì)象的時(shí)候引入)和 getRgb()方法,getRgb()的作用是返回一個(gè)十六進(jìn)制顏色的字符串。
和以前一樣,我們按照測試驅(qū)動(dòng)開發(fā)(TDD)的方法:寫一個(gè)測試,再寫一段代碼滿足該測試,如果需要,反復(fù)下去。
下面是一個(gè)非常簡單的起始測試:
function TestInstantiate() {
$this->assertIsA($color = new Color, ‘Color’);
$this->assertTrue(method_exists($color, ‘getRgb’));
}
為了滿足這個(gè)測試,你可以設(shè)計(jì)這樣一個(gè)類。測試看起來有點(diǎn)像偽代碼:
class Color {
function getRgb() {}
}
( 這個(gè)Color類也許看起來像處于娃娃階段, 但是 TDD是一個(gè)反復(fù)的過程。 代碼非常少,當(dāng)需要的時(shí)候:你開始有了新的想法或者想精確的執(zhí)行代碼時(shí),可以增加的。)
接下來, 當(dāng)顏色對(duì)象被建立時(shí),getRgb() 方法應(yīng)該返回以紅色,綠色,和藍(lán)色的十六進(jìn)制字符串。 用一個(gè)測試說明一下:
function TestGetRgbWhite() {
$white =& new Color(255,255,255);
$this->assertEqual(‘#FFFFFF’, $white->getRgb());
}
每個(gè) TDD, 你寫最簡單的可行的代碼來滿足測試, 并不需要滿足人的審美觀或者代碼的正確執(zhí)行。
下面是最簡單的,能夠通過測試的代碼:
class Color {
function getRgb() { return ‘#FFFFFF’; }
}
這個(gè)Color類不是令人十分滿意, 但是它確實(shí)表現(xiàn)了逐漸增加的過程。
下一步,讓我們增加一個(gè)額外的測試使這個(gè)Color類的的確確地執(zhí)行并返回正確的信息:
這個(gè)Color類必須改變什么呢? 首先必須把紅色,綠色,和藍(lán)色的值儲(chǔ)存在三個(gè)變量里,然后在調(diào)用一個(gè)方法把十進(jìn)制數(shù)轉(zhuǎn)化為十六進(jìn)制數(shù)。按照這個(gè)要求執(zhí)行的代碼可以寫作:
class Color {
var $r=0;
var $g=0;
var $b=0;
function Color($red=0, $green=0, $blue=0)
{
$this->r =$red;
$this->g = $green;
$this->b = $blue;
}
function getRgb() {
return sprintf(‘#XXX’, $this->r, $this->g, $this->b);
}
}
這個(gè)構(gòu)造非常簡單: 先收集紅色,綠色,和藍(lán)色的數(shù)值,然后儲(chǔ)存在變量中, getRgb() 方法使用 sprintf() 函數(shù)將十進(jìn)制數(shù)轉(zhuǎn)換成十六進(jìn)制數(shù)。
為了對(duì)代碼充滿更多的信心, 你可以用較多的數(shù)值來測試它。 這一個(gè)測試可以用以下代碼實(shí)現(xiàn):
function TestGetRgbRandom() {
$color =& new Color(rand(0,255), rand(0,255), rand(0,255));
$this->assertWantedPattern(
‘/^#[0-9A-F]{6}$/’,
$color->getRgb());
$color2 =& new Color($t = rand(0,255), $t, $t);
$this->assertWantedPattern(
‘/^#([0-9A-F]{2})\1\1$/’,
$color2->getRgb());
}
注:assertWantedPattern
assertWantedPattern() 作用是:使它的第二個(gè)叁數(shù)匹配第一個(gè)參數(shù),第一個(gè)參數(shù)是正則表達(dá)式。如果匹配,這個(gè)測試就通過; 否則不通過。
由于assertWantedPattern()具有進(jìn)行正確的正則表達(dá)式匹配的功能,所以常被用作測試。
分享:《PHP設(shè)計(jì)模式介紹》第一章 編程慣用法學(xué)習(xí)一門新的語言意味著要采用新的慣用法。這章將介紹或者可能重新強(qiáng)調(diào)一些慣用法。你會(huì)發(fā)現(xiàn)這些慣用法在你要在代碼中實(shí)現(xiàn)設(shè)計(jì)模式時(shí)候是非常有用的。 在這里總結(jié)的許多編程慣用法都是很值得
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第三章 工廠模式(3)
。