»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÈýÕ ¹¤³§Ä£Ê½¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÈýÕ ¹¤³§Ä£Ê½
ÔÚÃæÏò¶ÔÏó±à³ÌÖÐ, ×îͨ³£µÄ·½·¨ÊÇÒ»¸önew²Ù×÷·û²úÉúÒ»¸ö¶ÔÏóʵÀý,new²Ù×÷·û¾ÍÊÇÓÃÀ´¹¹Ôì¶ÔÏóʵÀýµÄ¡£µ«ÊÇÔÚһЩÇé¿öÏÂ, new²Ù×÷·ûÖ±½ÓÉú³É¶ÔÏó»á´øÀ´Ò»Ð©ÎÊÌâ¡£¾ÙÀýÀ´Ëµ, Ðí¶àÀàÐͶÔÏóµÄ´´ÔìÐèҪһϵÁеIJ½Öè: Äã¿ÉÄÜÐèÒª¼ÆËã»òÈ¡µÃ¶ÔÏóµÄ³õʼÉèÖÃ; Ñ¡ÔñÉú³ÉÄĸö×Ó¶ÔÏóʵÀý; »òÔÚÉú³ÉÄãÐèÒªµÄ¶ÔÏó֮ǰ±ØÐëÏÈÉú³ÉһЩ¸¨Öú¹¦ÄܵĶÔÏó¡£ ÔÚÕâЩÇé¿ö, жÔÏóµÄ½¨Á¢¾ÍÊÇÒ»¸ö “¹ý³Ì”£¬²»½öÊÇÒ»¸ö²Ù×÷£¬ÏñÒ»²¿´ó»úÆ÷ÖеÄÒ»¸ö³ÝÂÖ´«¶¯¡£
ÎÊÌâ
ÄãÈçºÎÄÜÇáËÉ·½±ãµØ½¨Á¢Õâô" ¸´ÔÓ " µÄ¶ÔÏó¼´²Ù×÷Öв»ÐèÒªÕ³Ìù¸´ÖÆÄØ?
½â¾ö·½·¨
½¨Á¢Ò»¸ö¹¤³§£¨Ò»¸öº¯Êý»òÒ»¸öÀà·½·¨£©À´ÖÆÔìеĶÔÏó¡£ÎªÁËÀí½â¹¤³§µÄÓô¦, ÊÔÏëÒÔϵIJ»Í¬Ö®´¦……
´úÂ룺
$connection=& new MySqlConnection($user, $password, $database);
……ʹÄãµÄ´úÂë¿ÉÀ©Õ¹ºÍ¸ü¼ò½à……
$connection=& create_connection();
ºóÕߵĴúÂëÆ¬¶Ï¼¯ÖÐÔÚºÍÊý¾Ý¿âÁ¬½ÓµÄcreate_connect()¹¤³§ÉÏ ,¾ÍÏñ¸Õ²Å˵µÄÒ»Ñù£¬Ê¹´´ÔìÊý¾Ý¿âÁ¬½ÓµÄ¹ý³Ì³ÉΪһ¸ö¼òµ¥µÄ²Ù×÷—¾ÍÏñnew²Ù×÷Ò»Ñù¡£¹¤³§Ä£Ê½µÄÓŵã¾ÍÔÚ´´½¨¶ÔÏóÉÏ¡£ ËüµÄÈÎÎñ¾ÍÊǰѶÔÏóµÄ´´½¨¹ý³Ì¶¼·â×°ÆðÀ´£¬È»ºó·µ»ØÒ»¸öËùÐèÒªµÄÐÂÀà¡£
Ïë¸Ä±ä¶ÔÏóµÄ½á¹¹ºÍ½¨Á¢¶ÔÏóµÄ·½Ê½Âð? ÄãÖ»ÐèÑ¡Ôñ¶ÔÏ󹤳§£¬¶Ô´úÂëµÄ¸Ä±äÖ»ÐèÒªÒ»´Î¾Í¹»ÁË¡£( ¹¤³§Ä£Ê½µÄ¹¦ÄÜÊÇÈç´ËÇ¿´ó, Ëü´¦ÓÚÊÇÓ¦Óõĵײã, ËùÒÔÔÚÐí¶àÆäÓàµÄ¸´ÔÓģʽºÍÓ¦ÓÃÖÐËü»á²»Í£µØ³öÏÖ¡£)
Ñù±¾´úÂë
¹¤³§Ä£Ê½·â×°Á˶ÔÏóµÄ½¨Á¢¹ý³Ì¡£ Äã¿ÉÒÔÔÚ¶ÔÏó±¾Éí´´½¨¶ÔÏ󹤳§»òÕßÊÇÒ»¸ö¶îÍâµÄ¹¤³§Àà——ÕâÒª¿´Äã¾ßÌåµÄÓ¦Óá£ÈÃÎÒÃÇ¿´Ò»¸ö¹¤³§¶ÔÏóµÄÀý×Ó¡£
ÎÒÃÇ·¢ÏÖÏÂÃæ´úÂëÖУ¬Êý¾Ý¿âÁ¬½ÓµÄÄDz¿·ÖÂŴγöÏÖ£º
// PHP4
class Product {
function getList() { $db=& new MysqlConnection(DB_USER, DB_PW, DB_NAME);
//...
}
function getByName($name) { $db=& new MysqlConnection(DB_USER, DB_PW, DB_NAME);
//...
}
//...
}
ΪʲôÕâÑù×ö²»ºÃ? Êý¾Ý¿âÁ¬½ÓµÄ²ÎÊý³öÏֵĵط½Ì«¶àÁË£¬µ±Äã°ÑÕâЩ²ÎÊýÉè³É³£Á¿£¬Òâζ×ÅÄãͳһ¶¨Òå²¢¶ÔËûÃǽøÐи³Öµ£¬ÏÔÈ»ÕâÖÖ×ö·¨²»ÊǺÜÍ×µ±£º
-
Äã¿ÉÒÔÇáËɵظıäÁ¬½ÓÊý¾Ý¿âµÄ²ÎÊý£¬µ«Äã²»ÄÜÔö¼Ó»ò¸Ä±äÕâЩ²ÎÊýµØË³Ðò£¬³ý·ÇÄã°ÑËùÓÐÁ¬½Ó´úÂë¶¼¸ÄÁË¡£Äã²»ÄÜÇáËɵÄʵÀý»¯Ò»¸öÐÂÀàÈ¥Á¬½ÓÁíÒ»ÖÖÊý¾Ý¿â£¬±ÈÈç˵PostgresqlConnection¡£ÕâÑùºÜÄѵ¥¶À²âÊÔºÍ֤ʵÁ¬½Ó¶ÔÏóµÄ״̬¡£
ʹÓù¤³§Éè¼ÆÄ£Ê½£¬´úÂ뽫µÃµ½ºÜ´óµÄ¸Ä½ø£º
class Product {
function getList() {
$db=& $this->_getConnection();
//...
}
function &_getConnection() {
return new MysqlConnection(DB_USER, DB_PW, DB_NAME);
}
}ÏÈǰµÄÀàÖдæÔںܶàµ÷ÓÃnew MysqlConnection(DB_USER, DB_PW, DB_NAME)µÄ·½·¨£¬ÏÖÔÚ¶¼±»¼¯Öе½µÄ_getConnection()·½·¨ÉÏ¡£
ÏÂÃæÊǹ¤³§µÄÁíÒ»Öֱ仯,Ä㾲̬µØµ÷ÓÃÁËÒ»¸ö¹¤³§Àࣺ
class Product {
function getList() {
$db=& DbConnectionBroker::getConnection();
//...
}
}
class DbConnectionBroker {
function &getConnection() {
return new MysqlConnection(DB_USER, DB_PW, DB_NAME);
}
}ÕâÀïDbConnectionBroker::getConnection()²úÉúµÄЧ¹ûºÍÇ°ÃæµÄÒ»Ñù ,µ«ÕâÑùÈ´ºÜÓкô¦: ÎÒÃDz»±ØÔÚÿ¸öÐèÒªÁ¬½ÓÊý¾Ý¿âµÄÀàÖмÓÈëµ÷ÓÃnew MysqlConnection(DB_USER £¬ DB_PW, DB_NAME)µÄ·½·¨¡£
µ±È»ÁíÒ»Öֱ仯¾ÍÊÇÒýÓÃÒ»¸öÍⲿ¹¤³§¶ÔÏóµÄ×ÊÔ´£¬ºÍÕâ¸ö¶ÔÏó¶¨ÒåÁËÊý¾Ý¿âÁ¬½ÓµÄ²ÎÊý:
×îºó£¬Ò»¸ö¹¤³§¿ÉÒÔÓÃÒ»¸öº¯ÊýºÏÀíµÄ×éÖ¯£¬È»ºóʵÏÖ:class Product {
var $_db_maker;
function setDbFactory(&$connection_factory) {
$this->_db_maker=& $connection_factory;
}
function getList() {
$db=& $this->_db_maker->getConnection();
//...
}
}
ÏÂÃæÊÇÒ»¸ö¹¤³§µÄÀíÏ뻯ִÐÐµÄ UML Ààͼ:function &make_db_conn() {
return new MysqlConnection(DB_USER, DB_PW, DB_NAME);
}
class Product {
function getList() {
$bar=& make_db_conn();
//...
}
}
Àý×Ó£ºÔö¼ÓһЩÑÕÉ«
ÈÃÎÒÃǸüÉîÈ빤³§Ä£Ê½°É¡£¼ÌÐøÈçǰ£¬ÏȽ¨Á¢Ò»¸öÄÜΪ±¾ÕÂ½ÚµÄÆäËü²¿·Ö³ÖÐø¾ÙÀý˵Ã÷µÄ¼òµ¥Àà¡£ ÕâÊÇÒ»¸öÊä³öÊ®Áù½øÖƵÄ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(‘#%02X%02X%02X’, $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()¾ßÓнøÐÐÕýÈ·µÄÕýÔò±í´ïʽƥÅäµÄ¹¦ÄÜ£¬ËùÒÔ³£±»ÓÃ×÷²âÊÔ¡£ËùÓÐÕâЩ²âÊÔColorÀ๦ÄܵÄÐÐΪ¶¼ÔÚÕý³£ºÍÆÚÍûµÄ»·¾³ÏÂʵÏֵġ£µ«ÊÇÿһ¸öÉè¼Æ¾«Á¼µÄÀà¶¼±ØÐ뿼ÂDZ߽çÇé¿ö¡£ÀýÈç, ±»ËÍÈë¹¹ÔìÆ÷Ö´ÐеÄÊýÖµÈç¹ûÊǸºÊý£¬»òÕß´óÓÚ255µÄÊýÖµ£¬»òÕ߸ù±¾²»ÊÇÊýÖµ£¬½á¹û»á³öÏÖÊ²Ã´ÄØ£¿Ò»¸öºÃµÄÀඨÒåÓ¦¸ÃÊÊÓ¦²âÊÔÖеĶàÖֱ߽çÇé¿ö¡£
function testColorBoundaries() {
$color=& new Color(-1);
$this->assertErrorPattern(‘/out.*0.*255/i’);
$color=& new Color(1111);
$this->assertErrorPattern(‘/out.*0.*255/i’);
}×¢£ºassertErrorPattern
assertErrorPattern() ×÷ÓÃÊÇ£º½«²úÉúµÄphp´íÎó½øÐÐÕýÈ·µÄÕýÔò±í´ïʽƥÅä¡£Èç¹ûÕâ¸ö´íÎ󲻯¥ÅäÖ¸¶¨µÄģʽ, ½«²»Í¨¹ý²âÊÔ¡£
ÔÚÄÇЩ²âÊԵĻù´¡ÉÏ£¬ColorÀཫµÃµ½¸ü½øÒ»²½¸Ä½ø:
Õâ¸ö´úÂëͨ¹ýÁ˲âÊÔ, µ«ÊÇÕâÖÖ " ¼ôÇкÍÕ³Ìù " µÄ·ç¸ñÓеãʹÈËÑá¾ë¡£ ÔÚ TDD,Ò»¸ö¾Ñé·¨Ôò¾ÍÊǽ«±àÂë×î¼òµ¥µÄʵÏÖ£¬Èç¹ûÄãÁ½´ÎÐèÒªÏàͬµÄ´úÂ룬¿ÉÒÔ½«Æä¸Ä½ø£¬µ«²»Òª¸´ÖÆ´úÂë¡£ È»¶øÄãÍùÍùÐèÒªÈý´Î»òÈý´ÎÒÔÉϵÄÒ»Ñù´úÂë¡£ Òò´ËÎÒÃÇ¿ÉÒÔÌáȡһ¸ö·½·¨¼´Öع¹ÊµÏÖÕâ¸ö¹¤×÷¡£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);
}
}×¢£ºÖع¹ - ÌáÈ¡·½·¨
µ±ÄãµÄ´úÂëÖÐÓÐÁ½¸ö»òÕßÁ½¸öÒÔÉϲ¿·ÖµÄ´úÂëÏàËÆµÄʱºò, ¿ÉÒÔ½«ËüÃÇÌáÈ¡³öÀ´³ÉΪһ¸ö¶ÀÁ¢µÄ·½·¨£¬²¢°´ËüµÄÓÃ;ÃüÃû¡£µ±ÄãµÄÀàµÄ·½·¨´úÂëÖÐÆµÆµ³öÏÖÏàͬµÄ³É·Ö£¬ÌáÈ¡´úÂë×÷Ϊһ¸ö·½·¨ÊǷdz£ÓÐÓõġ£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);
}
}´´½¨¹¤³§À´¼ò»¯¶ÔÏóµÄ´´½¨¹ý³Ì
ÈÃÎÒÃÇΪColorÀàÔö¼ÓÒ»¸ö¹¤³§£¬Ê¹µÃ½¨Á¢ÐµÄʵÀý¸ü¼òµ¥¡£Ôö¼ÓÒ»¸ö¿ÉÒÔÃüÃûÑÕÉ«µÄ·½·¨£¬ÕâÑù¾Í¿ÉÒÔ²»¼ÇÑÕÉ«ÊýÖµ£¬Ö»ÐèÒª¼Çס×Ô¼ºÏ²»¶µÄÑÕÉ«Ãû×Ö¡£
¹¤³§¶ÔÏó»òº¯Êý²»Ò»¶¨¶¼Òª±»ÃüÃûΪ “¹¤³§”¡£ µ±Äã¶Á´úÂëʱ£¬¹¤³§ÊÇÏÔ¶øÒ×¼ûµÄ¡£ Ïà·´µÄ£¬ËüµÄÃû×Ö×îºÃÈ¡µÃÓÐÒâÒ壬ÕâÑù¿ÉÒÔ·´Ó³³öËü½â¾öÁËʲôÎÊÌâ¡£
ÔÚÕâ¸ö´úÂëÀý×ÓÖÐ, ÎÒÒª½ÐËüCrayonBoxÑÕÉ«¹¤³§¡£¾²Ì¬µÄ·½·¨CrayonBox::getColor()ÒýÈëÃüÃûÑÕÉ«µÄ×Ö·û´®ºó£¬·µ»ØÒ»¸ö´øÓÐÏàÓ¦ÑÕÉ«ÊôÐÔµÄColorÀà¡£
ÏÂÃæµÄÀý×ӾͿÉÒÔ²âÊÔÕâÒ»µã:
function TestGetColor() {
$this->assertIsA($o=& CrayonBox::getColor(‘red’), ‘Color’);
$this->assertEqual(‘#FF0000’, $o->getRgb());
$this->assertIsA($o=& CrayonBox::getColor(‘LIME’), ‘Color’);
$this->assertEqual(‘#00FF00’, $o->getRgb());
}ͨ¹ýÕâ¸ö²âÊÔ£¬ÎÒÃÇ·¢ÏÖÿ¸ö·µ»ØµÄ¶ÔÏó¶¼ÊÇÒ»¸öʵÀý»¯µÄColorÀ࣬getRgb() ·½·¨Ò²·µ»ØÁËÕýÈ·µÄ½á¹û¡£µÚÒ»ÖÖÇé¿öÊÇÒÔ“red”¶¼ÊÇСд²âÊÔ£¬µÚ¶þÖÖÇé¿öÊÇÒÔ“LIME”¶¼ÊÇ´óд²âÊÔ£¬ÕâÑù¿ÉÒÔ²âÊÔ´úÂëµÄͨÓÃÐÔ¡£
±£ÏÕÆð¼û, ÎÒÃÇÔÙ¶ÔÆä½øÐÐÁíÍâµÄ²âÊÔ£¬Ì½¾¿ÄÇЩ²»ºÏ·¨µÄ±ß½çÇé¿ö¡£TestBadColor() ·½·¨µÄ×÷ÓÃÊÇ£ºÓÃÒ»¸ö²»´æÔÚµÄÑÕÉ«Ãû×ÖÒý·¢Ò»¸ö°üº¬Õâ¸öÑÕÉ«Ãû×ÖµÄphp´íÎ󣬲¢·µ»ØºÚÉ«¡£
function TestBadColor() {
$this->assertIsA($o=& CrayonBox::getColor(‘Lemon’), ‘Color’);
$this->assertErrorPattern(‘/lemon/i’);
// got black instead
$this->assertEqual(‘#000000’, $o->getRgb());
}ÒÔÏÂÊÇÒ»¸ö¿ÉÒÔÂú×ã²âÊÔµÄCrayonBoxÀࣺ
ÕâÏÔÈ»µØÊÇÒ»¸ö·Ç³£¼òµ¥µÄ¹¤³§, ËüÈ·ÊµÖÆÔìÁ˵¥Ò»»¯µÄ¶ÔÏó(ʹÓÃÁËÑÕÉ«Ãû×Ö£¬¶ø²»ÊÇRGBÊýÖµ) £¬ËüչʾÁËÔÚеĶÔÏó±»µ÷ÓÃ֮ǰ£¬ÊÇÈçºÎ½¨Á¢Ò»¸öÄÚ²¿¶ÔÏóµÄ¡£class CrayonBox {
function colorList() {
return array(
‘black’=> array(0, 0, 0)
,’green’=> array(0, 128, 0)
// the rest of the colors ...
,’aqua’=> array(0, 255, 255)
);
}
function &getColor($color_name) {
$color_name=strtolower($color_name);
if (array_key_exists($color_name,
$colors=CrayonBox::colorList())) {
$color=$colors[$color_name];
return new Color($color[0], $color[1], $color[2]);
}
trigger_error(“No color ‘$color_name’ available”);
// default to black
return new Color;
}“¹¤³§”´Ù½ø¶à̬
¿ØÖƱ»ËͻضÔÏóµÄÄÚÔÚ״̬¹ÌÈ»ÖØÒª, µ«ÊÇÈç¹û´Ù½ø¶à̬¼´·µ»ØÏàͬµÄ½Ó¿Ú¶àÖÖÀàµÄ¶ÔÏ󣬿ÉÒÔʹµÃ¹¤³§Ä£Ê½µÄ¹¦ÄܸüΪǿ´ó¡£
ÈÃÎÒÃÇÔٴο´Ò»ÏÂMonopolyµÄÀý×Ó£¬È»ºóÖ´ÐйºÂòÓÎÏ·ÖеĵÀ¾ßµÄÐÐΪ¡£ÔÚÓÎÏ·ÖУ¬ÄãµÄÈÎÎñ¾ÍÊÇÂòµÀ¾ß£¬°üÀ¨Ò»Ð©»ù±¾¶¯×÷¡£¸ü½øÒ»²½Ëµ, ÓÐÈýÖÖ²»Í¬µÄµÀ¾ß: Street£¬RailRoadºÍUtility¡£ËùÓÐÈý¸öÀàÐ͵ĵÀ¾ßÓÐһЩ¹²Í¬µã: ÿ¸öµÀ¾ß¶¼±»Ò»¸öÍæ¼ÒÓµÓÐ; ÿ¸ö¶¼Óм۸ñ;¶øÇÒÿ¸ö¶¼ÄÜΪËüµÄÓµÓÐÕß²úÉú×â½ðÖ»ÒªÆäËûµÄÍæ¼ÒÔÚËüÉÏÃæµÇ½¡£µ«µÀ¾ßÖ®¼ä»¹ÊÇ´æÔÚ²îÒìµÄ£¬¾ÙÀýÀ´Ëµ, ¼ÆËã×â½ðµÄ¶àÉÙ¾ÍÈ¡¾öÓÚµÀ¾ßµÄÀàÐÍ¡£
ÏÂÁеĴúÂëչʾÁËÒ»¸öPropertyµÄ»ù±¾Àà:
ÕâÀï, PropertyÀàºÍCalcRent() ·½·¨¶¼±»ÉùÃ÷Ϊ»ùÀà¡£// PHP5
abstract class Property {
protected $name;
protected $price;
protected $game;
function __construct($game, $name, $price) {
$this->game=$game;
$this->name=$name;
$this->price=new Dollar($price);
}
abstract protected function calcRent();
public function purchase($player) {
$player->pay($this->price);
$this->owner=$player;
}
public function rent($player) {
if ($this->owner
&& $this->owner !=$player
$player($this->calcRent())
);
}
}
}×¢£ºÊõÓï – »ùÀà
Ò»¸ö»ùÀà¾ÍÊDz»Äܱ»Ö±½ÓʵÀý»¯µÄÀà¡£ Ò»¸ö»ù´¡µÄÀà°üº¬Ò»¸ö»ò¸ü¶àµÄ»ù´¡·½·¨£¬ÕâЩ·½·¨±ØÐëÔÚ×ÓÀà±»¸²¸Ç¡£Ò»µ©ËùÓеijéÏó·½·¨±»¸²¸ÇÁË, ×ÓÀàÒ²¾Í²úÉúÁË¡£
»ùÀàΪÐí¶àÏàËÆµÄÀà´´ÔìÁ˺õÄÔÐÍ¡£
CalcRent() ·½·¨±ØÐëÔÚ×ÓÀà±»¸²¸Ç£¬´Ó¶øÐγÉÒ»¸ö¾ßÌåµÄÀà¡£Òò´Ë, ÿ¸ö×ÓÀà°üÀ¨£ºStreet£¬RailRoadºÍUtility£¬ºÍ±ØÐ붨ÒåµÄcalcRent() ·½·¨¡£ÎªÊµÏÖÒÔÉϵÄÇé¿ö£¬ÕâÈý¸öÀà¿ÉÒÔ¶¨ÒåΪ:
class Street extends Property {
protected $base_rent;
public $color;
public function setRent($rent) {
$this->base_rent=new Dollar($rent);
}
protected function calcRent() {
if ($this->game->hasMonopoly($this->owner, $this->color)) {
return $this->base_rent->add($this->base_rent);
}
return $this->base_rent;
}
}
class RailRoad extends Property {
protected function calcRent() {
switch($this->game->railRoadCount($this->owner)) {
case 1: return new Dollar(25);
case 2: return new Dollar(50);
case 3: return new Dollar(100);
case 4: return new Dollar(200);
default: return new Dollar;
}
}
}
class Utility extends Property {
protected function calcRent() {
switch ($this->game->utilityCount($this->owner)) {
case 1: return new Dollar(4*$this->game->lastRoll());
case 2: return new Dollar(10*$this->game->lastRoll());
default: return new Dollar;
}
}
}ÿ¸ö×ÓÀà¶¼¼Ì³ÐÁËPropertyÀ࣬¶øÇÒ°üÀ¨Ëü×Ô¼ºµÄprotected ClacRent() ·½·¨¡£Ëæ×ÅËùÓеĻù´¡·½·¨¶¼±»¶¨Òå, ÿ¸ö×ÓÀà¶¼±»ÊµÀý»¯ÁË¡£
ΪÁË¿ªÊ¼ÓÎÏ·, ËùÓеÄMonopolyµÀ¾ß±ØÐë±»´´½¨ÆðÀ´¡£ÒòΪÕâÕÂÊǽéÉܹ¤³§Ä£Ê½µÄ£¬ËùÓÐPropertyµÄÀàÐÍ´æÔںܶ๲ÐÔ£¬ÄãÓ¦¸ÃÏëµ½¶à̬ÐÔ£¬´Ó¶ø½¨Á¢ËùÓÐÐèÒªµÄ¶ÔÏó¡£
ÎÒÃÇ»¹ÊÇÒÔµÀ¾ß¹¤³§À࿪ʼ¡£ ÔÚÎÒסµÄµØ·½,Õþ¸®µÄAssessor£¨¶¨Ë°ÈË£©ÕÆÎÕÁË˰ÎñºÍÆõÔ¼£¬ Òò´ËÎÒÃüÃûËüΪµÄµÀ¾ß¶¨Ë°¹¤³§¡£ÏÂÒ»²½£¬Õâ¸ö¹¤³§½«ÖÆÔìÈ«²¿µÄרÓеÀ¾ß¡£ÔÚÕæÕýÓ¦ÓÃʱ£¬ËùÓеÄMonopolyµÀ¾ßµÄÊýÖµ¿ÉÄܶ¼È¡×ÔÓÚÒ»¸öÊý¾Ý¿â»òÕßÒ»¸öÎı¾, µ«ÊǶÔÓÚÕâÒ»¸öÀý×ÓÀ´Ëµ, ¿ÉÒÔ½ö½öÓÃÒ»¸öÊý×éÀ´´úÌæ:
class Assessor {
protected $prop_info=array(
// streets
‘Mediterranean Ave.’=> array(‘Street’, 60, ‘Purple’, 2)
,’Baltic Ave.’=> array(‘Street’, 60, ‘Purple’, 2)
//more of the streets...
,’Boardwalk’=> array(‘Street’, 400, ‘Blue’, 50)
// railroads
,’Short Line R.R.’=> array(‘RailRoad’, 200)
//the rest of the railroads...
// utilities
,’Electric Company’=> array(‘Utility’, 150)
,’Water Works’=> array(‘Utility’, 150)
);
}Property×ÓÀàÐèҪʵÀý»¯MonopolyµÀ¾ß¡£ÏÖÔÚ,ÎÒÃÇÖ»ÊǼòµ¥µÄÓÃÒ»¸öº¯Êý¶¨ÒåʵÀý»¯±äÁ¿$game£¬ÄÇôÔÙ°ÑËü¼ÓÈëAssessorÀàºÃÁË¡£
class Assessor {
protected $game;
public function setGame($game) { $this->game=$game; }
protected $prop_info=array();
}Ò²ÐíÄã»áÆ«ÏòÓÚÑ¡ÔñʹÓÃÊý¾Ý¿â¼Ç¼Êý¾Ý£¬²»»áÓÃÊý×é, ÒòΪÓÐÒ»´ó¶ÑµÄ²ÎÊý²»¿É±ÜÃâµØÒª±»ÂÞÁС£Èç¹ûÊÇÕâÑùµÄ»°£¬¿ÉÒÔ¿¼ÂÇʹÓÃ" ÒýÈëÈþÊý¶ÔÏó " ½øÐÐÖØ¹¹¡£
×¢£ºÖع¹£ÒýÈëÈþÊý¶ÔÏó
·½·¨ÖÐÈç¹ûÓкܶà²ÎÊý£¬³£³£±äµÃºÜ¸´ÔÓ£¬¶øÇÒÈÝÒ×µ¼Ö´íÎó¡£Äã¿ÉÒÔÒýÈëÒ»¸ö·â×°²ÎÊýµÄ¶ÔÏóÀ´Ìæ´úÒ»´ó¶ÑµÄ²ÎÊý¡£¾ÙÀýÀ´Ëµ,“start date” and “end date” ÈþÊý¿ÉÒÔÓÃÒ»¸ö DateRange ¶ÔÏóÒ»Æð´úÌæ¡£ÔÚMonopolyÕâ¸öÀý×ÓÖУ¬Õâ¸ö²ÎÊý¶ÔÏóÓ¦¸ÃÊÇÊ²Ã´ÄØ£¿PropertyInfo£¬ÔõÑù£¿ËüµÄÄ¿µÄÊÇʹÿ¸öµÀ¾ß²ÎÊýÊý×éÒýÈë PropertyInfo ÀàµÄ¹¹ÔìÆ÷ÖУ¬È»ºó·µ»ØÒ»¸öжÔÏó¡£Ä¿µÄ¾ÍÒâζ×ÅÉè¼Æ, ÒÀÕÕ TDD, ÄÇÒâζ×ÅÒ»¸ö²âÊÔÇéÐΡ£
ÏÂÃæÒ»¸ö²âÊÔ´úÂë¾ÍÊDzâÊÔ PropertyInfo ÀàµÄ:
function testPropertyInfo() {
$list=array(‘type’,’price’,’color’,’rent’);
$this->assertIsA(
$testprop=new PropertyInfo($list), ‘PropertyInfo’);
foreach($list as $prop) {
$this->assertEqual($prop, $testprop->$prop);
}
}Õâ¸ö²âÊÔÖ¤Ã÷£ºÃ¿¸öPropertyInfoÀà¶¼ÓÐËĸö¹«¹²ÊôÐÔ£¬¶øÇÒ¾ßÓа´¾«È·´ÎÐòÅÅÁеÄÈþÊý¡£
µ«ÊÇÒòΪʵÀýÖÐ RailRoad ºÍ Utility Àಢ²»ÐèÒªÑÕÉ«»òÕß×âÓÃÊý¾Ý, ËùÒÔÎÒÃÇÐèÒª²âÊÔPropertyInfo Ò²ÄÜÒýÈëÉÙÁ¿µÄ²ÎÊý¶øÊµÀý»¯ÎªRailRoad ºÍ Utility Àà¶ÔÏó£ºfunction testPropertyInfoMissingColorRent() {
$list=array(‘type’,’price’);
$this->assertIsA(
$testprop=new PropertyInfo($list), ‘PropertyInfo’);
$this->assertNoErrors();
foreach($list as $prop) {
$this->assertEqual($prop, $testprop->$prop);
}
$this->assertNull($testprop->color);
$this->assertNull($testprop->rent);
}×¢£ºassertNoErrors()
assertNoErrors() ·½·¨µÄ×÷ÓÃÊÇ£ºÖ¤ÊµÃ»ÓÐPHP ´íÎó·¢Éú¡£Èç¹ûÓдíÎó, ½«²»Í¨¹ý²âÊÔ¡£
assertNull()
assertNull()·½·¨µÄ×÷ÓÃÊÇ£º²âÊÔµÚÒ»¸ö²ÎÊýÊÇ·ñΪ¿Õ¡£ Èç¹ûµÚÒ»¸ö²ÎÊý²»Îª¿Õ, ½«²»Í¨¹ý²âÊÔ¡£Ïñ´ó¶àÊýÆäËû²âÊÔ·½·¨Ò»Ñù£¬, Äã¿ÉÒÔÑ¡ÔñÊÇ·ñʹÓõڶþ¸öÈþÊý¶¨Òåʧ°ÜÐÅÏ¢¡£ÎªÁËÂú×ãÇ°ÃæµÄ²âÊÔ£¬PropertyInfo ÀඨÒåΪ:
ÏÖÔÚPropertyInfo Àà¿ÉÒÔ¹¹Ôì¸÷ÖÖ²»Í¬µÄProperty²ÎÊýÁË¡£Í¬Ê±AssessorÀà¿ÉÒÔÌṩÊý¾ÝÀ´½¨Á¢ÕýÈ·µÄPropertyInfo¶ÔÏó¡£class PropertyInfo {
const TYPE_KEY=0;
const PRICE_KEY=1;
const COLOR_KEY=2;
const RENT_KEY=3;
public $type;
public $price;
public $color;
public $rent;
public function __construct($props) {
$this->type=
$this->propValue($props, ‘type’, self::TYPE_KEY);
$this->price=
$this->propValue($props, ‘price’, self::PRICE_KEY);
$this->color=
$this->propValue($props, ‘color’, self::COLOR_KEY);
$this->rent=
$this->propValue($props, ‘rent’, self::RENT_KEY);
}
protected function propValue($props, $prop, $key) {
if (array_key_exists($key, $props)) {
return $this->$prop=$props[$key];
}
}
}
ÏÖÔÚÒÔAssessor->$prop_infoÊý×éÌṩµÄÊý¾ÝΪ»ù´¡£¬Ð½¨Ò»¸öʵÀý»¯ PropertyInfo µÄÀà¡£
ÕâÑùµÄ´úÂë¿ÉÒÔÊÇ:
Õâ¶Î´úÂëʵÏÖÁËÉÏÊö¹¦ÄÜ, µ«È´·Ç³£´àÈõ¡£Èç¹û´úÈëµÄÖµÊÇ$this->prop_infoÊý×éÖÐûÓеÄÖµ£¬½á¹û»áÔõÑùÄØ£¿ÒòΪ PropertyInfo ÒѾ±»ÊµÀý»¯²¢±»¼ÓÈëµ½Assessor´úÂëÖÐ, ûÓÐÓÐЧµÄ·½·¨²âÊÔ±»²úÉúµÄ¶ÔÏ󡣱ȽϺõĽâ¾ö¾ÍÊÇ£º²úÉúÒ»¸ö¹¤³§·½·¨Ê¹ PropertyInfo ¶ÔÏó¸üÈÝÒ×½¨Á¢¡£ Òò´Ë, ÏÂÒ»²½½«ÊÇдһ¸ö²âÊÔÀ´ÊµÏÖAssessorÀàÖеÄPropertyInfo·½·¨¡£class Assessor {
protected $game;
public function setGame($game) { $this->game=$game; }
public function getProperty($name) {
$prop_info=new PropertyInfo($this->prop_info[$name]);
switch($prop_info->type) {
case ‘Street’:
$prop=new Street($this->game, $name, $prop_info->price);
$prop->color=$prop_info->color;
$prop->setRent($prop_info->rent);
return $prop;
case ‘RailRoad’:
return new RailRoad($this->game, $name, $prop_info->price);
break;
case ‘Utility’:
return new Utility($this->game, $name, $prop_info->price);
break;
default: //should not be able to get here
}
}
protected $prop_info=array();
}µ«ÊÇ,ÓÐÒ»¸öÎÊÌâ: Õâ¸ö·½·¨²»Ó¦¸ÃÊÇAssessorÀàµÄ¹«¹²½Ó¿Ú£¨API£©µÄÒ»¸ö²¿·Ý¡£ËüÄܱ»²âÊÔÂð?
ÕâÀïÓÐÁ½¸ö·½·¨, ¿ÉÒÔ̽¾¿ÈκÎÒªÇóµÄºÏÀíÊýÁ¿µÄ²âÊÔ¡£¼òµ¥µÄ˵, Äã¿ÉÒÔÔËÐкÚÏ»×Ó²âÊÔ»ò°×Ï»×Ó²âÊÔ¡£
×¢£ººÚÏ»×Ó²âÊÔ£¨Black Box Testing£©
ºÚÏ»×Ó²âÊÔ¾ÍÊÇ£º°Ñ±»²âÊԵĶÔÏóµ±³É" ºÚÏ»×Ó " £¬ÎÒÃÇÖ»ÖªµÀËüÌṩµÄÓ¦Óýӿڣ¨API£©£¬µ«²»ÖªµÀÆäµ½µ×Ö´ÐÐÁËʲô¡£ËüÖ÷Òª²âÊÔ¶ÔÏ󹫹²·½·¨µÄÊäÈëºÍÊä³ö¡£
°×Ï»×Ó²âÊÔ£¨White Box Testing£©
°×Ï»×Ó²âÊԺͺÚÏ»×Ó²âÊÔǡǡÏà·´, Ëü¼Ù¶¨ÖªµÀ²âÊÔ¶ÔÏóÖеÄËùÓдúÂëÐÅÏ¢¡£ÕâÖÖÐÎʽµÄ²âÊÔÊÇΪÁËÍêÉÆ´úÂëºÍ¼õÉÙ´íÎó¡£
¹ØÓÚ°×Ï»×Ó²âÊÔµÄÏêϸ˵Ã÷Çë¼û£ºhttp:// c 2.com/cgi/wiki?WhiteBoxTesting ¡£±ð°Ñ»°Ìâ³¶Ô¶ÁË¡£ÄÇôÈçºÎ²ÅÔÚºÚÏ»×ӺͰ×Ï»×ÓÖ®¼äÕÒµ½ÕÛÖа취À´ÊµÏÖTDDÄØÄØ£¿Ò»ÖÖÑ¡Ôñ¾ÍÊÇʹÔÀ´µÄÀàÖеÄ˽Óз½·¨±äΪ¹«ÓУ¬²¢ÇÒÔÚ·¢²¼µÄʱºò±ä»ØË½ÓС£µ«Õâ²¢²»ÊÇÊ®·ÖÁîÈËÂúÒâµÄ·½Ê½,ËùÒÔÎÒÃǽ¨Á¢Ò»¸ö×ÓÀ࣬ͬʱʹ×ÓÀàÖеķ½·¨¿ÉÒÔ´ÓÍⲿ·ÃÎÊ:
ÏÂÃæ¾ÍÊÇÒ»¸ö×ÓÀàµÄÀý×Ó£º
class TestableAssessor extends Assessor {
public function getPropInfo($name) {
return Assessor::getPropInfo($name);
}
}ÕâÑù×öµÄºÃ´¦ÊÇÄã¿ÉÒԵõ½ÕýÈ·µÄAssessor¹«Óнӿڣ¨API£©, µ«Í¨¹ý TestableAssessor ÀàÎÒÃǾͿÉÒÔÀ´²âÊÔAssessorÀàÁË¡£ÁíÍâ, ÄãÓÃÓÚ²âÊԵĴúÂëÒ²²»»áÓ°Ïìµ½AssessorÀà¡£
ȱµãÊÇ£ºÍâ¼ÓµÄÀà»á´øÀ´¸ü¶àµÄÎÊÌ⣬´Ó¶øÊ¹²âÊÔ±äµÃ¸ü¸´ÔÓ¡£¶øÇÒÈç¹ûÄãÔÚ¶ÔÏóÖеÄһЩÄÚ²¿½Ó¿Ú×÷³öһЩ¸Ä¶¯, ÄãµÄ²âÊÔ½«Ëæ×ÅÄãµÄÖØ¹¹¶øÔÙ´ÎʧЧ¡£
±È½ÏÁËËüµÄÓŵãºÍȱµã£¬ÈÃÎÒÃÇÀ´¿´¿´ËüµÄ²âÊÔ·½·¨£º
function testGetPropInfoReturn() {
$assessor=new TestableAssessor;
$this->assertIsA(
$assessor->getPropInfo(‘Boardwalk’), ‘PropertyInfo’);
}ΪÁËÒª±£Ö¤ËùÓдúÂëµÄÕýÈ·Ö´ÐÐ, ÎÒÃÇ¿ÉÒÔʹÓÃÒì³£´¦Àí¡£ SimpleTestµÄĿǰÊÇ»ùÓÚPHP4 ´î½¨µÄ²âÊԵĽṹ£¬ËùÒÔ²»¾ß±¸Òì³£´¦ÀíÄÜÁ¦¡£µ«ÊÇÄ㻹ÊÇ¿ÉÒÔÔÚ²âÊÔÖÐʹÓÃÈçÏ¡£
×îºó, AssessorÀàµÄÖ´Ðв¿·ÖÍê³ÉÁË:function testBadPropNameReturnsException() {
$assessor=new TestableAssessor;
$exception_caught=false;
try { $assessor->getPropInfo(‘Main Street’); }
catch (InvalidPropertyNameException $e) {
$exception_caught=true;
}
$this->assertTrue($exception_caught);
Assessor::getPropInfo()·½·¨´ÓÂß¼ÉÏ˵Ã÷ PropertyInfo¹¤³§ÀàÊÇ×÷ΪÁËAssessorÀàµÄÒ»¸ö˽Óеķ½·¨¡£¶øAssessor::getProperty() ·½·¨ÊÇÓÃÀ´·µ»ØÈý¸öProperty×ÓÀàµÄÒ»¸ö£¬ÖÁÓÚ·µ»ØÄÄÒ»¸ö×ÓÀàÕâÒª¿´propertyµÄÃû×Ö¡£class Assessor {
protected $game;
public function setGame($game) { $this->game=$game; }
public function getProperty($name) {
$prop_info=$this->getPropInfo($name);
switch($prop_info->type) {
case ‘Street’:
$prop=new Street($this->game, $name, $prop_info->price);
$prop->color=$prop_info->color;
$prop->setRent($prop_info->rent);
return $prop;
case ‘RailRoad’:
return new RailRoad($this->game, $name, $prop_info->price);
break;
case ‘Utility’:
return new Utility($this->game, $name, $prop_info->price);
break;
default: //should not be able to get here
}
}
protected $prop_info=array();
protected function getPropInfo($name) {
if (!array_key_exists($name, $this->prop_info)) {
throw new InvalidPropertyNameException($name);
}
return new PropertyInfo($this->prop_info[$name]);
}
}³Ù¼ÓÔØ£¨Lazy Loading£©µÄ¹¤³§
ʹÓù¤³§µÄÁíÒ»¸öºÃ´¦¾ÍÊÇËü¾ßÓгټÓÔØµÄÄÜÁ¦¡£ÕâÖÖÇé¿ö³£±»ÓÃÔÚ£ºÒ»¸ö¹¤³§ÖаüÀ¨ºÜ¶à×ÓÀ࣬ÕâЩ×ÓÀà±»¶¨ÒåÔÚµ¥¶ÀµÄPHPÎļþÄÚ¡£
×¢£ºÊõÓï - ³Ù¼ÓÔØ
ÔÚ³Ù¼ÓÔØÄ£Ê½ÖÐÊDz»Ô¤¼ÓÔØËùÓеIJÙ×÷£¨Ïñ°üº¬PHPÎļþ»òÕßÖ´ÐÐÊý¾Ý¿â²éѯÓï¾ä£©£¬³ý·Ç½Å±¾ÖÐÉùÃ÷Òª¼ÓÔØ¡£ÓÃÒ»¸ö½Å±¾¿ÉÒÔÓÐЧµØ¿ØÖƶà¸öÍøÒ³µÄÊä³ö£¬ÕâÊÇWeb³£Óõķ½·¨ÁË¡£±ÈÈçÒ»¸ö²©¿Í³ÌÐò£¬Ò»Ð©Èë¿Ú¾ÍÓв»Í¬µÄÒ³ÃæÀ´ÊµÏÖ£¬Ò»¸ö¼òµ¥µÄÆÀÂÛÈë¿Ú¾ÍÓУº·¢²¼ÆÀÂÛµÄÒ³Ãæ£¬Ò»¸öµ¼º½µÄÒ³Ãæ£¬Ò»¸ö¹ÜÀíÔ±±à¼µÄÒ³ÃæµÈ¡£ Äã¿ÉÒÔ°ÑËùÓеŦÄÜ·ÅÈëÒ»¸öµ¥¶ÀµÄÀàÖÐ,ʹÓù¤³§À´¼ÓÔØËûÃÇ¡£Ã¿Ò»¸ö¹¦ÄÜÀà¿ÉÒÔµ¥¶À·ÅÔÚÒ»¸öÎļþÀÔÙ°ÑÕâЩÎļþ¶¼·ÅÔÚ“pages”Õâ¸ö×ÓÎļþ¼ÐÀÕâÑù¿ÉÒÔ·½±ãµ÷Óá£
ʵÏÖ³Ù¼ÓÔØµÄÒ³Ãæ¹¤³§£¨page factory£©µÄ´úÂë¿ÉÒÔд×÷:
Äã¿ÉÒÔÀûÓà PHP µÄ¶¯Ì¬¼ÓÔØÐÔÖÊ£¬È»ºóʹÓÃʵʱµÄÔËÐÐÐèÇó£¨run-time£©À´¸øÄãÒª½¨Á¢µÄÀàÃüÃû¡£ÔÚÕâÇé¿öÏÂ, ¸ù¾ÝÒ»¸ö HTTP ÇëÇóÈþÊý¾ÍÄÜÈ·¶¨ÄĸöÒ³Ãæ±»¼ÓÔØ¡£Äã¿ÉÒÔʹÓóټÓÔØ£¬ÕâÑùÖ»Òªµ±ÄãÐèÒª½¨Á¢Ð¶ÔÏóʱ²ÅÔØÈëÏàÓ¦µÄÀ࣬²»ÐèÒªÄãÔØÈëËùÓпÉÄÜÓõ½µÄ“page”Àà¡£ÔÚÉÏÊöÀý×ÓÖоÍÓÃÁË require_onceÀ´ÊµÏÖÕâÒ»µã¡£Õâ¸ö¼¼Êõ¶ÔÓÚÒ»¸ö×°ÓÐPHP¼ÓËÙÆ÷µÄϵͳÀ´Ëµ²¢²»ÖØÒª£¬ÒòΪ°üº¬Ò»¸öÍâ¼ÓµÄÎļþʹÓõÄʱ¼ä¶ÔËüÀ´Ëµ¿ÉÒÔºöÂÔ¡£ µ«¶ÔÓÚ´ó¶àÊýµäÐ͵ÄPHP·þÎñÆ÷À´Ëµ£¬ÕâÑù×öÊǺÜÓкô¦µÄ¡£class PageFactory {
function &getPage() {
$page=(array_key_exists(‘page’, $_REQUEST))
? strtolower($_REQUEST[‘page’])
: ‘’;
switch ($page) {
case ‘entry’: $pageclass=‘Detail’; break;
case ‘edit’: $pageclass=‘Edit’; break;
case ‘comment’: $pageclass=‘Comment’; break;
default:
$pageclass=‘Index’;
}
if (!class_exists($pageclass)) {
require_once ‘pages/’.$pageclass.’.php’;
}
return new $pageclass;
}
}ÒªÏëÁ˽â¸ü¶àµÄ¹ØÓÚ³Ù¼ÓÔØµÄ֪ʶ£¬Çë¿´µÚ 11 ÕÂ-´úÀíģʽ¡£
С½Ú
¹¤³§Ä£Ê½ÊǷdz£¼òµ¥¶øÇҷdz£ÓÐÓá£Èç¹ûÄãÒѾÓÐºÜ¶à¹ØÓÚ¹¤³§Ä£Ê½µÄÀý×Ó´úÂ룬Äã»á·¢ÏÖ¸ü¶àµÄ¶«Î÷¡£¡¶GoF¡·Õâ±¾Êé¾Í½éÉÜÁËһЩ¹ØÓÚ¹¹½¨µÄģʽ:AbstractFactory and Builder¡£ AbstractFactoryÓÃÀ´´¦ÀíһЩÏà¹Ø×é¼þ£¬BuilderģʽÔòÊÇʹ½¨Á¢¸´ÔÓ¶ÔÏó¸üΪÈÝÒס£
ÔÚÕâÕµĶàÊýÀý×ÓÀï, ²ÎÊýÊÇͨ¹ý¹¤³§·½·¨ÒýÈëµÄ(ÀýÈç CrayonBox::getColor(‘ºìÉ«’);)¡£¡¶GoF¡·ÖÐÔò³ÆÎª“²ÎÊý»¯¹¤³§”£¨parameterized factory£©£¬ËüÊÇPHPÍøÒ³Éè¼ÆÖеäÐ͵Ť³§·½·¨¡£
ÄãÏÖÔÚÒѾÁ˽⹤³§Ä£Ê½ÁË, ËüÊÇÒ»ÖÖ´úÂëÖн¨Á¢Ð¶ÔÏóµÄ¹ÜÀí¼¼Êõ¡£ Äã¿ÉÒÔ¿´µ½¹¤³§Ä£Ê½ÊÇ¿ÉÒ԰Ѹ´ÔÓ¶ÔÏóµÄ½¨Á¢¼¯ÖÐÆðÀ´£¬ÉõÖÁÓò»Í¬µÄÀà´úÌæ²»Í¬µÄ¶ÔÏó¡£×îºó£¬¹¤³§Ä£Ê½Ö§³ÖOOP¼¼ÊõÖеĶà̬ҲÊǺÜÖØÒªµÄ¡£
function TestGetRgbRed() {
$red=& new Color(255,0,0);
$this->assertEqual(‘#FF0000’, $red->getRgb());
}ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÈýÕ ¹¤³§Ä£Ê½£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺Éè¼ÆÄ£Ê½£¬Ç󹤳§Ä£Ê½ÔÀí¡£
¡¡¡¡´ð£º¹¤³§Ä£Ê½°üÀ¨¼òµ¥¹¤³§Ä£Ê½¡¢¹¤³§·½·¨Ä£Ê½ºÍ³éÏ󹤳§Ä£Ê½¡£ÎÞÂÛÊÇÄÄÖÖ¹¤³§Ä£Ê½Êµ¼ÊÉ϶¼ÊÇOCP£¨Open-Closed Principle£©ÔÀíµÄ¾ßÌåÓ¦Óá£OCP¼´¶ÔÀ©Õ¹¿ª·Å£¬¶ÔÐ޸Ĺرա£ËùÒÔÒªÀí½âºÍÔËÓù¤³§Ä£Ê½×îÖØÒªµÄÊÇŪÇå³þOCPÔÔò¡£µ±È»¸ü׼ȷµØËµ£¬¼òµ¥¹¤... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺¹¤³§Éè¼ÆÄ£Ê½µÄ×÷ÓÃÊÇʲô
¡¡¡¡´ð£ºÔÚÃæÏò¶ÔÏó±à³ÌÖÐ, ×îͨ³£µÄ·½·¨ÊÇÒ»¸önew²Ù×÷·û²úÉúÒ»¸ö¶ÔÏóʵÀý,new²Ù×÷·û¾ÍÊÇÓÃÀ´¹¹Ôì¶ÔÏóʵÀýµÄ¡£µ«ÊÇÔÚһЩÇé¿öÏÂ, new²Ù×÷·ûÖ±½ÓÉú³É¶ÔÏó»á´øÀ´Ò»Ð©ÎÊÌâ¡£¾ÙÀýÀ´Ëµ, Ðí¶àÀàÐͶÔÏóµÄ´´ÔìÐèҪһϵÁеIJ½Öè: Äã¿ÉÄÜÐèÒª¼ÆËã»òÈ¡µÃ¶ÔÏóµÄ³õʼ... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺ģʽÉè¼Æ£¬Äú¶Ô¹¤³§Ä£Ê½ÓÐÄÄЩÀí½âÄØ£¿
¡¡¡¡´ð£º¸öÈËÀí½â£¬¹¤³§Ä£Ê½¾ÍÊǼõÉÙ´úÂëñîºÏµÄÒ»ÖÖÉè¼Æ·½Ê½£¬¸üÒ×ÓÚά»¤£¬ ÀýÈç: public class person{ person(int i){ if(i==1) return new chinese (); if(i==2) return new chinese (); } } class chinese extends person{ } class american extends... >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
