WebjxCom提示:在面向对象
编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的
。但是在一些情况下,new操作符直接生成对象会带来一些问题
。举例来说,许多类型对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置;选择生成哪个子对象
所有这些测试Color类功能的行为都在正常和期望的环境下实现的。但是每一个设计精良的类都必须考虑边界情况。例如,被送入构造器执行的数值如果是负数
,或者大于255的数值
,或者根本不是数值,结果会出现什么呢?一个好的类定义应该适应测试中的多种边界情况。
functiontestColorBoundaries(){
$color=&newColor(-1);
$this->assertErrorPattern(‘/out.*0.*255/i’);
$color=&newColor(1111);
$this->assertErrorPattern(‘/out.*0.*255/i’);
}
注:assertErrorPattern
assertErrorPattern()作用是:将产生的php错误进行正确的正则表达式匹配。如果这个错误不匹配指定的模式,将不通过测试。
在那些测试的基础上,Color类将得到更进一步改进:
classColor{
var$r=0;
var$g=0;
var$b=0;
functionColor($red=0,$green=0,$blue=0){
$red=(int)$red;
if($red<0||$red>255){
trigger_error(“color‘$color’outofbounds,“
.”pleasespecifyanumberbetween0and255”);
}
$this->r=$red;
$green=(int)$green;
if($green<0||$green>255){
trigger_error(“color‘$color’outofbounds,“
.”pleasespecifyanumberbetween0and255”);
}
$this->g=$green;
$blue=(int)$blue;
if($blue<0||$blue>255){
trigger_error(“color‘$color’outofbounds,“
.”pleasespecifyanumberbetween0and255”);
}
$this->b=$blue;
}
functiongetRgb(){
returnsprintf(‘#%02X%02X%02X’,$this->r,$this->g,$this->b);
}
}
这个代码通过了测试,但是这种"剪切和粘贴"的风格有点使人厌倦。在TDD,一个经验法则就是将编码最简单的实现,如果你两次需要相同的代码,可以将其改进,但不要复制代码。然而你往往需要三次或三次以上的一样代码。因此我们可以提取一个方法即重构实现这个工作。
注:重构-提取方法
当你的代码中有两个或者两个以上部分的代码相似的时候,可以将它们提取出来成为一个独立的方法,并按它的用途命名。当你的类的方法代码中频频出现相同的成分,提取代码作为一个方法是非常有用的。
classColor{
var$r=0;
var$g=0;
var$b=0;
functionColor($red=0,$green=0,$blue=0){
$this->r=$this->validateColor($red);
$this->g=$this->validateColor($green);
$this->b=$this->validateColor($blue);
}
functionvalidateColor($color){
$check=(int)$color;
if($check<0||$check>255){
trigger_error(“color‘$color’outofbounds,“
.”pleasespecifyanumberbetween0and255”);
}else{
return$check;
}
}
functiongetRgb(){
returnsprintf(‘#%02X%02X%02X’,$this->r,$this->g,$this->b);
}
}