《PHP設計模式介紹》第三章 工廠模式(3)_PHP教程
推薦:《PHP設計模式介紹》第二章 值對象模式在所有的最簡單的程序中,大多數對象都有一個標識,一個重要的商業應用對象,例如一個Customer或者一個SKU,有一個或者更多的屬性---id,name,email地址,這樣可以把它從同一個類的其他實例區分開
例子:增加一些顏色
讓我們更深入工廠模式吧。繼續如前,先建立一個能為本章節的其它部分持續舉例說明的簡單類。 這是一個輸出十六進制的HTML RGB Color類,包括了R, G, 和 B三個屬性(在構造對象的時候引入)和 getRgb()方法,getRgb()的作用是返回一個十六進制顏色的字符串。
和以前一樣,我們按照測試驅動開發(TDD)的方法:寫一個測試,再寫一段代碼滿足該測試,如果需要,反復下去。
下面是一個非常簡單的起始測試:
function TestInstantiate() {
$this->assertIsA($color = new Color, ‘Color’);
$this->assertTrue(method_exists($color, ‘getRgb’));
}
為了滿足這個測試,你可以設計這樣一個類。測試看起來有點像偽代碼:
class Color {
function getRgb() {}
}
( 這個Color類也許看起來像處于娃娃階段, 但是 TDD是一個反復的過程。 代碼非常少,當需要的時候:你開始有了新的想法或者想精確的執行代碼時,可以增加的。)
接下來, 當顏色對象被建立時,getRgb() 方法應該返回以紅色,綠色,和藍色的十六進制字符串。 用一個測試說明一下:
function TestGetRgbWhite() {
$white =& new Color(255,255,255);
$this->assertEqual(‘#FFFFFF’, $white->getRgb());
}
每個 TDD, 你寫最簡單的可行的代碼來滿足測試, 并不需要滿足人的審美觀或者代碼的正確執行。
下面是最簡單的,能夠通過測試的代碼:
class Color {
function getRgb() { return ‘#FFFFFF’; }
}
這個Color類不是令人十分滿意, 但是它確實表現了逐漸增加的過程。
下一步,讓我們增加一個額外的測試使這個Color類的的確確地執行并返回正確的信息:
這個Color類必須改變什么呢? 首先必須把紅色,綠色,和藍色的值儲存在三個變量里,然后在調用一個方法把十進制數轉化為十六進制數。按照這個要求執行的代碼可以寫作:
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);
}
}
這個構造非常簡單: 先收集紅色,綠色,和藍色的數值,然后儲存在變量中, getRgb() 方法使用 sprintf() 函數將十進制數轉換成十六進制數。
為了對代碼充滿更多的信心, 你可以用較多的數值來測試它。 這一個測試可以用以下代碼實現:
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() 作用是:使它的第二個叁數匹配第一個參數,第一個參數是正則表達式。如果匹配,這個測試就通過; 否則不通過。
由于assertWantedPattern()具有進行正確的正則表達式匹配的功能,所以常被用作測試。
分享:《PHP設計模式介紹》第一章 編程慣用法學習一門新的語言意味著要采用新的慣用法。這章將介紹或者可能重新強調一些慣用法。你會發現這些慣用法在你要在代碼中實現設計模式時候是非常有用的。 在這里總結的許多編程慣用法都是很值得
- 相關鏈接:
- 教程說明:
PHP教程-《PHP設計模式介紹》第三章 工廠模式(3)。