所有這些測(cè)試Color類功能的行為都在正常和期望的環(huán)境下實(shí)現(xiàn)的。但是每一個(gè)設(shè)計(jì)精良的類都必須考慮邊界情況。例如, 被送入構(gòu)造器執(zhí)行的數(shù)值如果是負(fù)數(shù),或者大于255的數(shù)值,或者根本不是數(shù)值,結(jié)果會(huì)出現(xiàn)什么呢?一個(gè)好的類定義應(yīng)該適應(yīng)測(cè)試中的多種邊界情況。
function testColorBoundaries() { $color =& new Color(-1); $this->assertErrorPattern(‘/out.*0.*255/i’); $color =& new Color(1111); $this->assertErrorPattern(‘/out.*0.*255/i’); }
注:assertErrorPattern assertErrorPattern() 作用是:將產(chǎn)生的php錯(cuò)誤進(jìn)行正確的正則表達(dá)式匹配。如果這個(gè)錯(cuò)誤不匹配指定的模式, 將不通過(guò)測(cè)試。 在那些測(cè)試的基礎(chǔ)上,Color類將得到更進(jìn)一步改進(jìn):
class Color { var $r=0; var $g=0; var $b=0; function Color($red=0, $green=0, $blue=0) { $red = (int)$red; if ($red < 0 || $red > 255) { trigger_error(“color ‘$color’ out of bounds, “ .”please specify a number between 0 and 255”); } $this->r = $red; $green = (int)$green; if ($green < 0 || $green > 255) { trigger_error(“color ‘$color’ out of bounds, “ .”please specify a number between 0 and 255”); } $this->g = $green; $blue = (int)$blue; if ($blue < 0 || $blue > 255) { trigger_error(“color ‘$color’ out of bounds, “ .”please specify a number between 0 and 255”); } $this->b = $blue; } function getRgb() { return sprintf(‘#%02X%02X%02X’, $this->r, $this->g, $this->b); } }
這個(gè)代碼通過(guò)了測(cè)試, 但是這種 " 剪切和粘貼 " 的風(fēng)格有點(diǎn)使人厭倦。 在 TDD,一個(gè)經(jīng)驗(yàn)法則就是將編碼最簡(jiǎn)單的實(shí)現(xiàn),如果你兩次需要相同的代碼,可以將其改進(jìn),但不要復(fù)制代碼。 然而你往往需要三次或三次以上的一樣代碼。 因此我們可以提取一個(gè)方法即重構(gòu)實(shí)現(xiàn)這個(gè)工作。
注:重構(gòu) - 提取方法 當(dāng)你的代碼中有兩個(gè)或者兩個(gè)以上部分的代碼相似的時(shí)候, 可以將它們提取出來(lái)成為一個(gè)獨(dú)立的方法,并按它的用途命名。當(dāng)你的類的方法代碼中頻頻出現(xiàn)相同的成分,提取代碼作為一個(gè)方法是非常有用的。
class Color { var $r=0; var $g=0; var $b=0; function Color($red=0, $green=0, $blue=0) { $this->r = $this->validateColor($red); $this->g = $this->validateColor($green); $this->b = $this->validateColor($blue); } function validateColor($color) { $check = (int)$color; if ($check < 0 || $check > 255) { trigger_error(“color ‘$color’ out of bounds, “ .”please specify a number between 0 and 255”); } else { return $check; } } function getRgb() { return sprintf(‘#%02X%02X%02X’, $this->r, $this->g, $this->b); } }
出處:
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之工廠模式 [3] 下一頁(yè) php設(shè)計(jì)模式介紹之工廠模式 [5]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|