例子:增加一些顏色
讓我們更深入工廠模式吧。繼續(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í)行并返回正確的信息:
function TestGetRgbRed() { $red =& new Color(255,0,0); $this->assertEqual(‘#FF0000’, $red->getRgb()); }
這個(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(‘#%02X%02X%02X’, $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á)式匹配的功能,所以常被用作測試。
出處:
責(zé)任編輯:bluehearts
上一頁 php設(shè)計(jì)模式介紹之工廠模式 [2] 下一頁 php設(shè)計(jì)模式介紹之工廠模式 [4]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|