»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÒ»Õ ±à³Ì¹ßÓ÷¨¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÒ»Õ ±à³Ì¹ßÓ÷¨
ѧϰһÃÅеÄÓïÑÔÒâζ×ÅÒª²ÉÓÃеĹßÓ÷¨¡£ÕâÕ½«½éÉÜ»òÕß¿ÉÄÜÖØÐÂÇ¿µ÷һЩ¹ßÓ÷¨¡£Äã»á·¢ÏÖÕâЩ¹ßÓ÷¨ÔÚÄãÒªÔÚ´úÂëÖÐʵÏÖÉè¼ÆÄ£Ê½Ê±ºòÊǷdz£ÓÐÓõġ£
ÔÚÕâÀï×ܽáµÄÐí¶à±à³Ì¹ßÓ÷¨¶¼ÊǺÜÖµµÃ×öΪµ¥¶ÀÒ»¸öÕ½ڵģ¬ÉõÖÁÒ»±¾ÊéµÄ¡£ÄãÓ¦¸Ã°ÑÕâÕÂ×öΪPHPģʽÉè¼ÆÊ¹ÓùßÓ÷¨µÄÏà¹Ø½éÉÜ£¬¶øÇҲ鿴һЩÁгöµÄ²Î¿¼ÊéÀ´½øÐиüÉîÈëµÄѧϰ¡£
²âÊÔÄãµÄ´úÂë
¿ÉÄÜûÓÐʲô´úÂë¹ßÓ÷¨±È²âÊÔ´úÂë¸ü¼ÓÖØÒªÁË¡£ºÃµÄ²âÊÔ¿ÉÒÔÌá¸ß¿ª·¢ËÙ¶È¡£
¿ÉÄÜÒ»¿ªÊ¼£¬Õâ¾ä¸ñÑÔ»áºÍÄãµÄÖ±¾õÏàì¶Ü¡£Äã¿ÉÄÜ»á¶ÏÑÔ£¬²âÊÔÊÇ×ÔÓɵÄÕϰÎï¡£ÊÂʵÉÏǡǡÏà·´£¬Èç¹ûÄãÊ®·ÖÍêÕûµÄÔËÐÐÄÇЩ²âÊÔÀ´¼ì²éÄãµÄÈí¼þµÄ¹«¹²½Ó¿Ú£¬Äã¾Í¿ÉÄÜÔÚ²»¸Ä±ä£¨»òÕ߸ü¼ÓÔã¸â£¬ÆÆ»µ£©ÔÀ´µÄÓ¦ÓÃÈí¼þµÄǰÌáϸıä×Ô¼ºÏµÍ³ÄÚÔÚµÄÖ´ÐС£²âÊÔ²¢¼ìÑéÄãµÄ¹«¹²½Ó¿ÚµÄ¾«È·ÐÔºÍÕýÈ·ÐÔ£¬²¢ÇÒÈÃ×Ô¼ºËæÒâ¸Ä±äһЩ´úÂëµÄÄÚÔÚ¹¤×÷À´È·±£ÄãµÄÈí¼þÊÇÕýÈ·¶øÇÒûÓÐbug£¨´íÎ󣩡£
ÔÚÌÖÂÛ¸ü¶à¹ØÓÚ²âÊԵĺô¦Ö®Ç°£¬ÏÈÈÃÎÒÃÇ¿´Ò»¸öʾÀý¡£Õâ±¾ÊéÀïÃæËùÓеIJâÊÔʵÀý¶¼Ê¹ÓÃÁËPHP²âÊÔ¿ò¼Ü——SimpleTest ¡£Õâ¸ö²âÊÔ¿ò¼Ü¿ÉÒÔÔÚ http://simpletest.org »ñÈ¡µ½¡£
¿¼ÂÇÏÂÃæµÄ´úÂë
ÉÏÃæµÄ´úÂëÊ×Ïȶ¨ÒåÁËÒ»¸ö³£Á¿——TAX_RATE£¬ºÍÒ»¸ö¼ÆËãÏúÊÛ˰µÄº¯Êý¡£½Ó×Å£¬´úÂë°üº¬ÁËʹÓÃSimpleTest¿ò¼ÜµÄ±Ø±¸×é¼þ£ºµ¥Ìå²âÊÔ±¾ÉíºÍÒ»¸öÓÃÀ´ÏÔʾ²âÊÔ½á¹ûµÄ“reporter”Ä£¿é¡£
ÀàTestingTestCase¼Ì³ÐÓÚSimpleTest¿ò¼ÜµÄUnitTestCaseÀࡣͨ¹ýÀ©Õ¹UnitTestCase£¬ÀàTestingTestCaseÀïÃæËùÓÐʹÓÃTest¿ªÍ·µÄ·½·¨¶¼½«±»ÈÏΪÊDzâÊÔʵÀý——´´ÔìÌõ¼þÀ´µ÷ÊÔÄãµÄ´úÂë²¢¶ÏÑÔ½á¹û¡£
TestingTestCase¶¨ÒåÁËÒ»¸ö²âÊÔ£¬TestSalesTax()£¬Ëü°üº¬ÁËÒ»¸ö¶ÏÑÔº¯ÊýAssertEqual()¡£Èç¹ûËüµÄǰÁ½¸öÊäÈë²ÎÊýÊÇÏàµÈµÄ£¬Ëü½«·µ»Øtrue£¬·ñÔò·µ»Øfalse¡££¨Èç¹ûÄãÏëÏÔʾassertEqual()ʧ°ÜµÄÐÅÏ¢£¬Äã¿ÉÒÔ´«ÈëÈý¸ö²ÎÊý¾ÍÏñÕâÑù$this->assertEqual(7,calculate_sales_tax(100), “The sales tax calculation failed”)£©¡£
´úÂëµÄ×îºóÁ½Ðд´½¨ÁËÕâ¸ö²âÊÔʵÀýµÄʵÌå²¢ÇÒʹÓÃÒ»¸öHtmlReporterÔËÐÐÁËËü¡£Äã¿ÉÒÔ·ÃÎÊÕâ¸öwebÒ³ÃæÀ´ÔËÐÐÕâ¸ö¼òµ¥µÄ²âÊÔ¡£
ÔËÐÐÕâ¸ö²âÊÔ½«ÏÔʾ²âÊÔÃû³Æ£¬Ê§°Ü¶ÏÑÔµÄÏêϸÇé¿öºÍÒ»¸ö×ܽáÌõ¡££¨ÂÌÉ«µÄÒâζ×ųɹ¦£¨ËùÓеĶÏÑÔ¶¼Í¨¹ýÁË£©£¬¶øºìÉ«µÄ°µÊ¾×Åʧ°Ü£¨ÖÁÉÙÓÐÒ»¸ö¶ÏÑÔûÓÐͨ¹ý£©£©
£¨assertion(¶ÏÑÔ)ÔÚÈí¼þ¿ª·¢ÖÐÊÇÒ»ÖÖ³£Óõĵ÷ÊÔ·½Ê½£¬ºÜ¶à¿ª·¢ÓïÑÔÖж¼Ö§³ÖÕâÖÖ»úÖÆ¡£ÔÚʵÏÖÖУ¬assertion¾ÍÊÇÔÚ³ÌÐòÖеÄÒ»ÌõÓï¾ä£¬Ëü¶ÔÒ»¸öboolean±í´ïʽ½øÐмì²é£¬Ò»¸öÕýÈ·³ÌÐò±ØÐë±£Ö¤Õâ¸öboolean±í´ïʽµÄֵΪtrue£»Èç¹û¸ÃֵΪfalse£¬ËµÃ÷³ÌÐòÒѾ´¦ÓÚ²»ÕýÈ·µÄ״̬Ï£¬ÏµÍ³½«¸ø³ö¾¯¸æ»òÍ˳ö¡£Ò»°ãÀ´Ëµ£¬assertionÓÃÓÚ±£Ö¤³ÌÐò×î»ù±¾¡¢¹Ø¼üµÄÕýÈ·ÐÔ¡£assertion¼ì²éͨ³£ÔÚ¿ª·¢ºÍ²âÊÔʱ¿ªÆô¡£ÎªÁËÌá¸ßÐÔÄÜ£¬ÔÚÈí¼þ·¢²¼ºó£¬assertion¼ì²éͨ³£Êǹرյġ££©
×¢£º£¨assertion(¶ÏÑÔ)ÔÚÈí¼þ¿ª·¢ÖÐÊÇÒ»ÖÖ³£Óõĵ÷ÊÔ·½Ê½£¬ºÜ¶à¿ª·¢ÓïÑÔÖж¼Ö§³ÖÕâÖÖ»úÖÆ¡£ÔÚʵÏÖÖУ¬assertion¾ÍÊÇÔÚ³ÌÐòÖеÄÒ»ÌõÓï¾ä£¬Ëü¶ÔÒ»¸öboolean±í´ïʽ½øÐмì²é£¬Ò»¸öÕýÈ·³ÌÐò±ØÐë±£Ö¤Õâ¸öboolean±í´ïʽµÄֵΪtrue£»Èç¹û¸ÃֵΪfalse£¬ËµÃ÷³ÌÐòÒѾ´¦ÓÚ²»ÕýÈ·µÄ״̬Ï£¬ÏµÍ³½«¸ø³ö¾¯¸æ»òÍ˳ö¡£Ò»°ãÀ´Ëµ£¬assertionÓÃÓÚ±£Ö¤³ÌÐò×î»ù±¾¡¢¹Ø¼üµÄÕýÈ·ÐÔ¡£assertion¼ì²éͨ³£ÔÚ¿ª·¢ºÍ²âÊÔʱ¿ªÆô¡£ÎªÁËÌá¸ßÐÔÄÜ£¬ÔÚÈí¼þ·¢²¼ºó£¬assertion¼ì²éͨ³£Êǹرյġ££©
ÉÏÃæµÄ´úÂëÓÐÒ»¸ö£¨ÓÐÒâµÄ£©´íÎó£¬ËùÒÔÔËÐÐÊDz»ÄÜͨ¹ýÁË£¬ÏÔʾ½á¹ûÈçÏ£º

Calculate_sales_tax()Õâôһ¸ö¼òµ¥µÄ²ÅÒ»Ðеĺ¯ÊýÄÄÀï³ö´íÁËÄØ£¿Äã¿ÉÄÜÒѾעÒâµ½Õâ¸öº¯ÊýûÓзµ»Ø½á¹û¡£ÏÂÃæÊÇÕýÈ·µÄº¯Êý£º
function calculate_sales_tax($amount) {
return round($amount * TAX_RATE,2);
}
Ð޸ĺóÔËÐУ¬²âÊÔͨ¹ý¡£

µ«ÊÇÒ»¸ö¼òµ¥µÄ²âÊÔ²¢²»Äܱ£Ö¤´úÂëÊÇÎȶ¨µÄ¡£±ÈÈ磬Äã°Ñcalculate_sales_tax()¸Ä³É function calculate_sales_tax($amount) { return 7; }£¬´úÂëÒ²»áͨ¹ý²âÊÔ£¬µ«Ö»Óе±1ÃÀÔªµÈ¼ÛÓÚ100µÄʱºò²ÅÊÇÕýÈ·µÄ¡£Äã¿ÉÒÔ×Ô¼ºÔö¼ÓһЩ¶îÍâµÄ²âÊÔ·½·¨À´²âÊÔÆäËûµÄ¾²Ì¬Öµ¡£
function TestSomeMoreSalesTax() {
$this->assertEqual(3.5, calculate_sales_tax(50));
}
»òÕ߸ı亯ÊýTestSalesTax()À´ÑéÖ¤µÚ¶þ¸ö£¨ºÍµÚÈý¸ö£¬µÈµÈ£©Öµ£¬ÈçÏÂËùʾ
function TestSalesTax() {
$this->assertEqual(7, calculate_sales_tax(100));
$this->assertEqual(3.5, calculate_sales_tax(50));
}
µ½Ä¿Ç°ÎªÖ¹»¹ÓÐÒ»ÖÖ¸üºÃµÄ·½·¨£¬¾ÍÊÇÐÂÔö¼ÓÒ»¸ö²âÊÔ£ºÑ¡ÔñËæ¼´ÖµÀ´²âÊÔÄãµÄ´úÂë¡£¾ßÌåÈçÏ£º
function TestRandomValuesSalesTax() {
$amount=rand(500,1000);
$this->assertTrue(defined(‘TAX_RATE’));
$tax=round($amount*TAX_RATE*100)/100;
$this->assertEqual($tax, calculate_sales_tax($amount));
}
TestRandomValuesSalesTax()ÒýÈëÁË·½·¨assertTrue()£¬Èç¹û´«ÈëµÄµÚÒ»¸ö±äÁ¿µÈÓÚÓÚ²¼¶ûÕæÔòassertTrue()ͨ¹ý¡££¨ºÍ·½·¨assertEqual()Ò»Ñù£¬·½·¨assertTrue()ÔÚ½ÓÊÜÒ»¸ö¿ÉÑ¡ÔñÐԵġ¢¶îÍâµÄºó½«·µ»ØÒ»¸öʧ°ÜµÄÐÅÏ¢£©¡£ËùÒÔTestRandomValuesSalesTax()Ê×ÏÈÈÏΪ³£Á¿TAX_RATEÒѾ¶¨ÒåÁË£¬È»ºóʹÓÃÕâ¸ö³£Á¿À´¼ÆËãËæ»úÑ¡ÔñµÄµÄÊýÁ¿µÄ˰ÊÕ¡£
µ«ÊÇTestRandomValuesSalesTax()Ò²´æÔÚÒ»¸öÎÊÌ⣺ËüºÜ´ó³Ì¶ÈµÄÒÀÀµÓÚ·½·¨calculate_sales_tax()¡£²âÊÔÊÇÓ¦¸ÃºÍÌØÊâµÄʵÏÖϸ½ÚÎ޹صġ£Ò»¸ö¸üºÃµÄ²âÊÔÓ¦¸ÃÖ»½¨Á¢Ò»¸öºÏÀíµÄ·Ö½çÏß¡£½ÓÏÂÀ´µÄÕâ¸ö²âÊÔ¼Ù¶¨ÏúÊÛ˰ÓÀÔ¶²»»á³¬¹ý20£¥¡£
function TestRandomValuesSalesTax() {
$amount=rand(500,1000);
$this->assertTrue(calculate_sales_tax($amount)<$amount*0.20);
}
È·±£ÄãµÄ´úÂëÕý³£¹¤×÷ÊDzâÊÔµÄÊ×ÒªµÄÄ¿µÄ£¬µ«ÊÇÔÚ²âÊÔÄãµÄ´úÂëʱºò£¬ÄãÓ¦¸ÃÈÏʶµ½³ý´ËÖ®Í⻹ÓÐһЩ¶îÍâµÄ£¬Ïà¶Ô´ÎÒªµÄÄ¿µÄ£º
- ²âÊÔÈÃÄãÊéдÈÝÒײâÊԵĴúÂë¡£ÕâʹµÃ´úÂëËÉÉ¢ñîºÏ£¬¸´ÔÓÉè¼Æ£¬¶øÇÒ¾ßÓкܺõÄÄ£¿éÐÔ¡£
- ²âÊÔÄÜÈÃÄãÇåÎúµÄÁ˽âÔËÐдúÂëµÄÆÚÍû½á¹û£¬ÈÃÄã´ÓÒ»¿ªÊ¼¾Í×¢ÖØÓÚÄ£¿éµÄÉè¼ÆºÍ·ÖÎö¡£Í¨¹ý²âÊÔ£¬Ò²»áÈÃÄ㿼ÂÇËùÓпÉÄܵÄÊäÈëºÍÏàÓ¦µÄÊä³ö½á¹û¡£
- ²âÊÔÄܺܿìËÙµÄÁ˽â±àÂëµÄÄ¿µÄ¡£»»¾ä»°Ëµ£¬²âÊÔÊÂÀý°çÑÝלʵÀý”ºÍ“Îĵµ”µÄ¹¦ÄÜ£¬×¼È·µÄչʾ×ÅÈçºÎ¹¹½¨Ò»¸öÀ࣬·½·¨µÈ¡£ÔÚÕâ±¾ÊéÖУ¬ÎÒÓÐʱºòͨ¹ýÒ»¸ö²âÊÔÊÂÀýÀ´ÑÝʾ´úÂëµÄÆÚÍû¹¦ÄÜ¡£Í¨¹ý¶Áȡһ¸ö²âÊÔ·½·¨µÄÉùÃ÷£¬Äã¿ÉÒÔÇå³þµÄÁ˽â´úÂëÊÇÈçºÎÔËÐеġ£Ò»¸ö²âÊÔʵÀý¶¨ÒåÔÚ´úÂëÔÚÃ÷È·¹ßÓ÷¨ÏµÄÔËÐÐÇé¿ö¡£
×îºó£¬Èç¹ûÄãµÄ²âÊÔ¼¯——²âÊÔʵÀýµÄ¼¯ºÏ——ÊǷdz£³¹µ×µÄ£¬¶øÇÒµ±ËùÓеIJâÊÔ¶¼Í¨¹ýµÄʱºò£¬Äã¿ÉÒÔ˵ÄãµÄ´úÂëÊÇÍ걸µÄ¡£ÓÐȤµÄÊÇ£¬Õâ¸ö¹ÛµãҲǡºÃÊÇTest Driven Development£¨²âÊÔÇý¶¯¿ª·¢£©µÄÌØÕ÷Ö®Ò»¡£
Test Driven Development£¨TDD£©Ò²±»ÈÏΪÊÇTest First Coding£¨±àÂëǰ²âÊÔ£©¡£Test First CodingÊÇÒ»ÖְѲâÊÔ¸üÌáǰһ²½µÄ·½·¨£ºÔÚÄãдÈκδúÂë֮ǰÏÈдºÃ²âÊÔ¡£Äã¿ÉÒÔ´Óhttp://xprogramming.com/xpmag/testFirstGuidelines.htmÏÂÔØµ½Ò»·ÝºÜºÃµÄ£¬¼ò½àµÄ¹ØÓÚTDDµÄÕªÒªÎÄÕ£¬Í¬Ê±ÏÂÔØµ½Ò»±¾ºÜºÃµÄ¹ØÓÚ²ßÂÔµÄÈëÃÅÊé——Kent BeckÖø×÷µÄ¡¶Test Driven Development£ºBy Example¡·(Õâ±¾ÊéµÄÀý×Ó¶¼ÊÇÓÃJAVA¿ª·¢µÄ£¬µ«ÆäÖдúÂëµÄ¿É¶ÁÐÔÊǺܺõ쬶øÇÒ¶ÔÖ÷ÌâµÄ½éÉܺÍ˵Ã÷¶¼×öµÄºÜºÃµÄ)¡£
×¢£ºÃô½Ý¿ª·¢£¨Agile Development£©
×î½ü£¬µ¥Ìå²âÊÔ——ÌØ±ðÊÇ²â»æÇý¶¯¿ª·¢——ÒѾºÍÃô½Ý¿ª·¢·½·¨Ñ§½ôÃܵÄÁªÏµÆðÀ´ÁË£¬±ÈÈç˵¼«ÏÞ±à³Ì(XP)¡£¼«ÏÞ±à³ÌµÄ½¹µã¹Ø×¢ÓÚ¿ìËٵķ´¸´µÄ·¢²½¹¦ÄÜÐԵĴúÂë¸ø¿Í»§£¬²¢°Ñ±ä»¯µÄ¿Í»§ÐèÇó×öΪ¿ª·¢¹ý³ÌÖеıر¸²¿·Ö¡£ÏÂÃæÊÇһЩ¹ØÓÚѧϰÃô½Ý±à³ÌµÄÔÚÏß×ÊÔ´£º
º¯ÊýÐÔ²âÊÔ
Õâ±¾ÊéÀïÃæµÄ´ó²¿·Ö²âÊÔÀý×Ó¶¼ÊÇÓÃÀ´²âÊÔÃæ¶Ô¶ÔÏóµÄ´úÂ룬µ«ÊÇËùÓÐÐÎʽµÄ±à³Ì¶¼¿ÉÒÔ´ÓÖеõ½ÊÕ»ñµÄ¡£µ¥Ìå²âÊÔ¿ò¼Ü£¬±ÈÈç˵PHPUnitsºÍSimpleTest£¬Ò²¶¼ÄܺÜÈÝÒ×µÄÓÃÀ´²âÊÔ¹¦Äܺ¯ÊýµÄ¡£ÀýÈçÉÏÃæµÄSimpleTestÀý×Ó£¬Ëü¾ÍÊÇÓÃÀ´²âÊÔcalculate_sales_tax()º¯ÊýµÄ¡£ÊÀ½ç¸÷µØµÄ³ÌÐòÔ±ÃÇ£º°Ñµ¥Ìå²âÊÔÓÃÀý·Åµ½ÄãµÄº¯Êý¿âÀïÃæ°É£¡
ÎÒÏ£Íû¾¹ýÉÏÃæµÄÌÖÂÛºó£¬ÄãÒ²»á±»´ø¶¯ÆðÀ´——“²âÊÔÒýµ¼”(Test Infected)£¡£¨Õâ¸öÊõÓԴ´ÓÚErich Gamma£¬ÏêϸÇé¿öÇë¼ûÎÄÕÂhttp://junit.sourceforge.net/doc/testinfected/testing.htm£©£¬¾ÍÏóGammaËùдµÄÄÇÑù£¬¸Õ¿ªÊ¼Äã¿ÉÄÜ»á¸Ðµ½²âÊÔÊǺܷ±ËöµÄ£¬µ«Êǵ±ÄãΪÄãµÄ³ÌÐò´î½¨ºÃÒ»¸ö¹ãÀ«µÄ²âÊÔ¼¯ºó£¬Ä㽫ÄãµÄ´úÂë¸ü¼Ó×ÔÐÅ£¡
ÖØ¹¹
¼´Ê¹×îÓÐ˼ÏëÐÔÇÒ×îÊìÁ·µÄ³ÌÐòÔ±Ò²²»ÄÜÔ¤¼ûÒ»¸öÈí¼þÏîÄ¿ÖеÄÈκÎϸ΢֮´¦¡£ÎÊÌâ×ÜÊdzöºõÒâÍâµÄ³öÏÖ£¬ÐèÇóÒ²¿ÉÄÜÔڱ仯£¬½á¹ûÊÇ´úÂë±»ÓÅ»¯£¬¹²ÏíÈ»ºó´úÌæ¡£
ÖØ¹¹ÊÇÒ»¸ö¹ßÓõķ½·¨£º¼ì²éÄãËùÓеĴúÂ룬ÕÒ³öÆäÖÐÄÜͳһ»¯ºÍ¼òµ¥»¯µÄ¹²Í¬»òÕßÀàËÆÖ®´¦£¬Ê¹µÃÄãµÄ´úÂë¸ü¼ÓÈÝÒ×ά»¤ºÍÀ©Õ¹¡£Öع¹Ò²°üÀ¨Ì½Ë÷Ò»¸öÉè¼ÆÄ£Ê½ÊÇ·ñÄܹ»Ó¦Óõ½Õâ¸ö¾ßÌåµÄÎÊÌâÉÏ——ÕâÒ²ÄÜʹ½â¾ö·½°¸¼òµ¥»¯¡£
ÖØ¹¹£¬¼òµ¥µã˵ÊÇÖØÃüÃûÒ»¸öÊôÐÔ»òÕß·½·¨£¬¸´ÔÓµã˵ÊÇѹËõÒ»¸öÒÑÓеÄÀà¡£¸Ä±äÄãµÄ´úÂëʹµÃËü·ûºÏÒ»¸ö»òÕ߸ü¶àµÄÉè¼ÆÄ£Ê½ÊÇÁíÍâÒ»ÖÖÖØ¹¹——¶ÁÍêÕâ±¾Êéºó£¬Äã¿ÉÄÜ»áȥʵÏֵġ£
ûÓÐʲôÄܱÈÀý×ÓÀ´¸üºÃµÄ½âÊÍÖØ¹¹ÁË£¡
ÈÃÎÒÃÇ¿¼ÂÇÁ½¸ö¼òµ¥µÄÀࣺCartLineºÍCart¡£CartLine¼Ç¼Á˹ºÎï³µÀïÃæÃ¿¸öÏîÄ¿µÄµ¥¼þ¼Û¸ñºÍÊýÁ¿¡£±ÈÈçCartLine¿ÉÄܼǼ×Å“ËļûºìÉ«µÄpolo³ÄÒ£¬Ã¿¼þ19.99$”¡£Cart ÊÇÒ»¸öÈÝÆ÷£¬ÓÃÀ´×°ÔØÒ»¸ö»òÕ߸ü¶àµÄCartLine¶ÔÏó²¢Ö´ÐÐһЩÏà¹ØµÄ¼ÆË㹤×÷£¬±ÈÈ繺Îï³µÀïÃæµÄËùÓÐÉÌÆ·µÄ×Ü»¨·Ñ¡£
ÏÂÃæÊÇCartLineºÍCartµÄ¼òµ¥ÊµÏÖ£º
// PHP5
class CartLine {
public $price=0;
public $qty=0;
}
class Cart {
protected $lines=array();
public function addLine($line) {
$this->lines[]=$line;
}
public function calcTotal() {
$total=0;
// add totals for each line
foreach($this->lines as $line) {
$total +=$line->price * $line->qty;
}
// add sales tax
$total *=1.07;
return $total;
}
}
ÖØ¹¹µÄµÚÒ»²½±ØÐëÓÐ×ã¹»µÄ²âÊÔÀ´¸²¸ÇÄãËùÓеĴúÂë¡£ÕâÑù²ÅÄܱ£Ö¤ÄãÐ޸ĵĴúÂë²»ÄܲúÉúºÍÄãÔÀ´´úÂ벻ͬµÄ½á¹û¡£Ë³±ãÌáһϣ¬³ý·ÇÄã¸Ä±äÁËÐèÇó£¨Äã´úÂëÆÚÍûµÄ½á¹û£©»òÕßÔÚ²âÊÔʵÀýÖз¢ÏÖÁË´íÎó£¬ÄãµÄ²âÊÔ´úÂëÊÇÊDz»ÄܸıäµÄ¡£
ÏÂÃæÊÇÒ»¸ö²âÊÔCartLineºÍCartµÄÀý×Ó£¬ËüÔÚÖØ¹¹µÄ¹ý³ÌÖÐÊDz»»á¸Ä±äµÄ¡£
function TestCart() {
$line1=new CartLine;
$line1->price=12; $line1->qty=2;
$line2=new CartLine;
$line2->price=7.5; $line2->qty=3;
$line3=new CartLine;
$line3->price=8.25; $line3->qty=1;
$cart=new Cart;
$cart->addLine($line1);
$cart->addLine($line2);
$cart->addLine($line3);
$this->assertEqual(
(12*2 + 7.5*3 + 8.25) * 1.07,
$cart->calcTotal());
}
¿´×ÅÉÏÃæµÄ´úÂ룬Äã¿ÉÄܻᷢÏÖËüÃÇÓÐһЩ“code smells”(´úÂë³ôζ)——ÓÐ׏ŹֵÄÑù×Ó¶øÇÒ¿´ÆðÀ´ºÃÏñÊÇÓÐÎÊÌâµÄ´úÂë——ËüÃǾÍÏñÖØ¹¹µÄºòÑ¡Ïî¡££¨¸ü¶à¹ØÓÚcode smellsµÄ×ÊÁÏÇë¿´http://c2.com/cgi/wiki?codesmell£©¡£Á½¸ö×îÖ±½ÓµÄÖØ¹¹ºòÑ¡ÕßÊÇ×¢ÊͺͼÆË㣨ÓëÏúÊÛ˰µÈÏà¹ØµÄ¼ÆË㣩¡£Öع¹µÄÒ»ÖÖÐÎʽ£ºÎöÈ¡º¯Êý£¨Extract Method£©½«°ÑÕâЩÄÑ¿´µÄ´úÂë´Ócart::calcTotal()ÖÐÌáÈ¡³öÀ´£¬È»ºóÓÃÒ»¸öºÏÊʵķ½·¨À´Ìæ´úËü£¬´Ó¶øÊ¹µÃ´úÂë¸ü¼Ó¼ò½à¡£
±ÈÈ磬Äã¿ÉÒÔÔö¼ÓÁ½¸ö¼ÆËã·½·¨£ºlineTotal()ºÍcalcSalesTax()£º
protected function lineTotal($line) {
return $line->price * $line->qty;
}
protected function calcSalesTax($amount) {
return $amount * 0.07;
}
ÏÖÔÚÄã¿ÉÒÔÖØÐ´calcTotal()º¯Êý£º
public function calcTotal() {
$total=0;
foreach($this->lines as $line) {
$total +=$this->lineTotal($line);
}
$total +=$this->calcSalesTax($total);
return $total;
}
µ½Ä¿Ç°ÎªÖ¹µÄ¸Ä¶¯¶¼ÊÇÓÐÒâÒåµÄ£¨ÖÁÉÙÔÚÕâ¸öÀý×ÓµÄÉÏÏÂÎÄÖУ©£¬Ëü¶ÔÓÚÔÙ´ÎÔÝÍ£ºÍÔËÐÐÕâЩ´úÂëÀ´ÑéÖ¤½á¹ûÒÀÈ»ÕýÈ·ÊǺÜÓаïÖúµÄ¡£¼ÇµÃ£¬Ò»¸öÂÌÉ«µÄ³É¹¦ÌõµÄÏÔʾ³öÀ´ÁË£¡£¨ÒëÕß×¢£º±¾Õ¿ªÊ¼Ê±£¬×÷ÕßÌá¼°µ½£ºÂÌÉ«µÄÌõÒâζ×ŲâÊÔ¶¼Í¨¹ýÁË¡££©
È»¶ø£¬Ä¿Ç°µÄ´úÂëÒÀÈ»ÓÐһЩ¿ÉÒÔÌôÌ޵ĵط½¡£ÆäÖÐÒ»¸ö¾ÍÊÇÔÚз½·¨lineTotal()ÖдæÈ¡¹«¹²ÊôÐÔ¡£ºÜÃ÷ÏÔ¼ÆËãÿÐеÄÖ®ºÍµÄÔðÈβ»Ó¦¸ÃÊôÓÚCartÀ࣬¶øÓ¦¸ÃÔÚÀàCartLineÀïÃæÊµÏÖ¡£
ÔÙ´ÎÖØ¹¹£¬ÔÚCartLineÖÐÔö¼ÓÒ»¸öÐµķ½·¨total()ÓÃÀ´¼ÆËã¶©µ¥ÀïÃæµÄÿ¸öÏîÄ¿µÄ³¤ÆÚ¼ÛÇ®¡£
public function total() {
return $this->price * $this->qty;
}
È»ºó´ÓÀàCartÖÐÒÆ³ý·½·¨lineTotal()£¬²¢¸Ä±äcalcTotal()·½·¨À´Ê¹ÓÃеÄcartLine::Total()·½·¨¡£ÖØÐÂÔËÐÐÕâ¸ö²âÊÔ£¬ÄãÒÀÈ»»á·¢ÏÖ½á¹ûÊÇÂÌÉ«Ìõ¡£
È«ÐÂÖØ¹¹ºóµÄ´úÂë¾ÍÊÇÕâÑù£º
class CartLine {
public $price=0;
public $qty=0;
public function total() {
return $this->price * $this->qty;
}
}
class Cart {
protected $lines=array();
public function addLine($line) {
$this->lines[]=$line;
}
public function calcTotal() {
$total=0;
foreach($this->lines as $line) {
$total +=$line->total();
}
$total +=$this->calcSalesTax($total);
return $total;
}
protected function calcSalesTax($amount) {
return $amount * 0.07;
}
}
ÏÖÔÚÕâ´úÂë²»ÔÙÐèҪÿÐÐ×¢ÊÍÁË£¬ÒòΪ´úÂë±¾Éí¸üºÃµÄ˵Ã÷ÁËÿÐеŦÄÜ¡£ÕâЩÐµķ½·¨£¬¸üºÃµÄ·â×°Á˼ÆËãÕâ¸ö¹¦ÄÜ£¬Ò²¸ü¼ÓÈÝÒ×ÊÊÓ¦½«À´µÄ±ä»¯¡££¨±ÈÈç˵£¬¿¼ÂDz»Í¬´óµÄÏúÊÛ˰ÂÊ£©¡£ÁíÍ⣬ÕâЩÀàÒ²¸ü¼Óƽºâ£¬¸üÈÝÒ×ά»¤¡£
Õâ¸öÀý×ÓÏÔÈ»ÊÇ΢²»×ãµÀµÄ£¬µ«ÊÇÏ£ÍûÄãÄÜ´ÓÖÐÍÆ¶Ï²¢Ô¤Ïë³öÈçºÎÖØ¹¹Äã×Ô¼ºµÄ´úÂë¡£
ÔÚ±àÂëµÄʱºò£¬ÄãÓ¦¸ÃÓгöÓÚÁ½ÖÖģʽÖеÄÒ»ÖÖ£ºÔö¼ÓеÄÌØÕ÷»òÕßÖØ¹¹´úÂë¡£µ±ÔÚÔö¼ÓÌØÕ÷µÄʱºò£¬ÄãҪд²âÊÔºÍÔö¼Ó´úÂë¡£ÔÚÖØ¹¹µÄʱºò£¬ÄãÒª¸Ä±äÄãÔÓеĴúÂ룬²¢È·±£ËùÓÐÏà¹ØµÄ²âÊÔÒÀÈ»ÄÜÕýÈ·ÔËÐС£
¹ØÓÚÖØ¹¹µÄÖ÷Òª²Î¿¼×ÊÁÏÓÐMartin FowlerÖø×÷µÄ¡¶Öع¹£º¸Ä½øÔÓдúÂëµÄÉè¼Æ¡·£¨Refactoring:Improving the Design of Existing Code£©¡£ÓÃһЩ¾«¼òµãÀ´×ܽáFowlerµÄÊ飬֨¹¹µÄ²½ÖèÈçÏÂËùʾ£º
¶¨ÒåÐèÒªÖØ¹¹µÄ´úÂë
Óи²¸ÇËùÓдúÂëµÄ²âÊÔ
С²½ÖèµÄ¹¤×÷
ÿ²½Ö®ºó¶¼ÔËÐÐÄãµÄ²âÊÔ¡£±àÂëºÍ²âÊÔ¶¼ÊÇÏàµ±ÖØ¸´µÄ——ºÍ±àÒëÐÍÓïÑÔÏà±È£¬½âÊÍÐÍÓïÑÔ£¬±ÈÈçPHPÊÇÈÝÒ׺ܶàµÄ¡£
ʹÓÃÖØ¹¹À´Ê¹ÄãµÄ´úÂëÓиüºÃµÄ¿É¶ÁÐԺͿÉÐÞ¸ÄÐÔ¡£
ÆäËûʵ¼ù
ÏÂÃæ»¹Óм¯ÖÐÆäËûµÄʵ¼ùϰ¹ßÖµµÃÌá¼°µ½µÄ£¬Ò²ÖµµÃ¼ÓÈëµ½Äã×Ô¼ºµÄ±à³Ìϰ¹ßÀïÃæµÄ¡£
UML
ͳһ½¨Ä£ÓïÑÔ£¨UML£©ÊÇÒ»ÖÖÓë¾ßÌå±à³ÌÓïÑÔÎ޹صÄÓÃÀ´ÃèÊöÃæ¶Ô¶ÔÏó±à³Ì¹ÛÄîµÄ·½·¨¡£¹ØÓÚUMLµÄÏà¹ØÐÅÏ¢×ÊÁÏÄã¿ÉÒÔ´Óhttp://www.uml.orgÉÏÕÒµ½¡£
UMLÉæ¼°µ½ºÜ¶à·½Ã棬µ«¶ÔPHP³ÌÐòÔ±À´Ëµ£¬ÆäÖÐ×îÏà¹ØµÄÁ½·½ÃæÊÇÀàͼºÍÐòÁÐͼ¡£
ÀàͼÃèÊöÁËÒ»¸ö»òÕ߸ü¶àµÄÀàÒÔ¼°ËûÃÇÔÚÄãµÄ³ÌÐòÖ®¼äµÄÏ໥¹ØÏµ¡££¨ÒëÕß×¢£º×îºÃÄܹ»²Î¿¼Ïà¹ØµÄUML½Ì²Ä£¬½«ÓÐÖúÓÚÄãµÄÀí½â¡££©Ã¿¸öÀà¶¼ÓÃÒ»¸öºÐ×Ó±êʶ£¬Ã¿¸öºÐ×Ó¶¼·Ö³ÉÈý²¿·Ö£ºµÚÒ»²¿·ÖÊÇÀàÃû£¬µÚ¶þ²½·ÖÁоÙÁËÀàµÄÊôÐÔ£¨±äÁ¿£©£¬×îºóÒ»²¿·ÖÁоÙÁËÀàµÄ·½·¨¡£ÊôÐԺͷ½·¨µÄ¿É¼û¶È±»Éè¼ÆÎª£º£«´ú±ípublic£¨¹«¿ª£©£¬—´ú±íprivate£¨Ë½ÓУ©£¬#´ú±íprotected£¨Êܱ£»¤µÄ£©¡£

ÐòÁÐͼÃèÊöÁËΪһ¸öÌØ¶¨µÄÈÎÎñ»òÕßʼþ£¬Äã¶Ô´úÂëÖеĶÔÏóÖ®¼äµÄµäÐ͵Ľ»»¥»î¶¯¡£Ò»¸öÐòÁÐͼÖ÷Òª´«´ïÕâÑùµÄÐÅÏ¢£ºË£¬ÒÔʲôÑùµÄ˳Ðò£¬ÔÚʲôʱºò£¬µ÷Óò»Í¬µÄ·½·¨£¨ÓÉÃû×ÖÒ²¿ÉÒÔ¿´³ö£º“ÐòÁÐͼ”£©¡£ÐòÁÐͼÊǶÔÏ󼯺Ϳª·¢ÈËÔ±Ö®¼ä½»»¥¹µÍ¨µÄ·Ç³£ÓÐÓù¤¾ß¡£
ÔÚÎÒ×Ô¼ºµÄ¹¤³ÌÀÎÒʹÓÃÕâÁ½ÖÖµäÐ͵ÄÀàͼÀ´¹´»ÎÒÃǵÄÉè¼Æ£¬µ«ÊǺÜÉÙÄܽ«ËûÃǸñʽ»¯µ½ÏîÄ¿ÎĵµÀïÃæ¡£¶ÔÏóÖ®¼äµÄ¹ØÏµ¾³£Ëæ×ÅÄã¶ÔϵͳÀí½âµÄÉºÍÓû§ÐèÇóµÄ±ä»¯¶ø¸Ä±ä£¬Òò´ËÕâЩͼ±íºÜ¿ì¾Í»á¹ýʱ¡£ÕâÒ²¾ÍÊÇ˵“Ò»ÕÅͼ×ã×ãֵһǧ¸öÎÄ×Ö”¡£ÕâЩͼ±í¶Ôпª·¢ÈËÔ±Àí½âϵͳÊǷdz£ÓɰïÖúµÄ£¬Ò²ÄÜ×öΪʹÓÃÄãÈí¼þµÄ¿ª·¢ÈËÔ±µÄÊֲᡣ

×ÊÔ´¿ØÖÆ
“¼°Ê±µÄ¡¢¾³£ÐԵı£´æ”ÊÇ¿ª·¢ÈËÔ±ÁíÍâÒ»¸öÓÐÓõĸñÑÔ¡£¼´Ê¹ÄãÊÇÕâ¸öÏîÄ¿µÄΨһµÄ¿ª·¢ÈËÔ±£¬ÄãÒ²Ó¦¸Ãά³ÖËùÓеÄ×ÊÔ´´¦ÓÚ¿ØÖÆÏ¡£
ÍøÉÏ¿ÉÒÔ»ñÈ¡µ½ºÜ¶à¹ØÓÚ×ÊÔ´¿ØÖƵĽâ¾ö·½·¨£¬ÆäÖÐÁ½¸ö³öÉ«£ºCVS£¨http://www.cvshome.org£©ºÍSubversion£¨http://subversion.tigris.org£©¡£CVSÊÇÒ»¸ö·Ç³£Á÷ÐеÄÓÃÓÚ½â¾öPHPºÍApacheÏîÄ¿µÄ¹¤¾ß¡£Í¬Ê±£¬SubversionÒ²ÕýÔÚѸËٵijÉΪÁ÷ÐеĶþѡһ¹¤¾ßÖ®Ò»£¬ÒòΪËü¿Ë·þÁËCVSµÄһЩ²»×ãÖ®´¦£¨ÌرðÊÇÔÚÔÓïÃüÁîºÍɾ³ý/ÖØÃüÃûÎļþ¼Ð»òÎļþ·½Ã棩¡£È»¶øºÜÉÙÓÐÏîÄ¿°²×°Subversion·þÎñÆ÷¡£
ÔÚ¹¤×÷µÄʱºò£¬ÎÒ²ÉÓÃCVS£¬µ«Õâ±¾ÊéµÄ´úÂë¶¼ÊÇʹÓÃSubversionÀ´Î¬»¤µÄ¡£
×ÊÔ´´úÂëÎĵµ
Èç¹ûÄãä¯ÀÀÍêÁËÕâ±¾ÊéµÄËùÓÐÒ³Ãæ£¬Äã¿ÉÒÔ»á×¢Ò⵽һЩÃ÷ÏԵĸñʽ»¯µÄ×¢ÊÍ¿éÀàËÆÓÚ£º
ËüÃDZ»³ÆÎª“docblocks”£¨ÒëÕß×¢£ºÎĵµ¿é£©£¬ÊÇÓɳÌÐò£¬±ÈÈç˵phpDocumentor£¨http://phpdocu.sf.net£©£¬ÎªÄãµÄPHPÏîÄ¿×Ô¶¯Éú³ÉµÄÓ¦ÓóÌÐò½Ó¿Ú£¨API£©Îĵµ¡£
Docblocks£¨Îĵµ¿é£©ÊÇÌØ¶¨¸ñʽµÄ¶àÐÐ×¢ÊÍ£¬ÒÔ±êʶעÊÍÖÕÖ¹¡£ÔÚÿÐеÄÇ°×ºÇ°ÃæÔÊÐíÓпոñ¡£
@something ´ú±íÒ»¸ö“±êÇ©”(tag)£¬µ±ÎĵµÐèҪת»¯Îª½âÎö¸ñʽʱ£¬±êÇ©ÓÃÀ´²ûÃ÷һЩ±ØÒªµÄÐÅÏ¢¡£±ÈÈç˵±êÇ©@private£¬Ê¹ÓÃÔÚphp4ÖУ¬³£ÓÃÀ´±êʶÀàµÄÕâ¸ö·½·¨»òÕßÊôÐÔʱ˽Óеģ¬ÒòΪÔÚphp4ÖÐʱûÓÐÌṩÕâÖÖÌìÈ»µÄÄÜÁ¦µÄ£¨ÒëÕß×¢£ºÔÚphp4ÖÐʱÎÞ·¨ËµÃ÷Ò»¸ö±äÁ¿»òÕß·½·¨ÊÇ·ñ˽Óеģ©¡£
×ÊÔ´´úÂëÎĵµ±ÈÈç˵docblocks¼´ÊÇÒ»¸öÓÐÓõIJο¼×ÊÁÏ£¬Ò²ÊÇ¿ªÔ´ÏîÄ¿µÄÒ»¸öºÃ¹ã¸æ¡£ÆäÖÐÒ»¸öÀý×Ó£¨ÎÒ°ïæά»¤µÄ£©¾ÍÊÇSimpleTestAPIÎĵµ£¨http://simpletest.org£©¡£
| <?php // PHP4 // the subject code define(‘TAX_RATE’, 0.07); function calculate_sales_tax($amount) { round($amount * TAX_RATE,2); } // include test library require_once ‘simpletest/unit_tester.php’; require_once ‘simpletest/reporter.php’; // the test class TestingTestCase extends UnitTestCase { function TestingTestCase($name=’’) { $this->UnitTestCase($name); } function TestSalesTax() { $this->assertEqual(7, calculate_sales_tax(100)); } } // run the test $test=new TestingTestCase(‘Testing Unit Test’); $test->run(new HtmlReporter()); |
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÒ»Õ ±à³Ì¹ßÓ÷¨£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺phpÉè¼ÆÄ£Ê½txtÈ«¼¯ÏÂÔØ
¡¡¡¡´ð£ºphpÉè¼ÆÄ£Ê½ txtÈ«¼¯Ð¡Ëµ¸½¼þÒÑÉÏ´«µ½°Ù¶ÈÍøÅÌ£¬µã»÷Ãâ·ÑÏÂÔØ£º È·ÈϺóÇë²ÉÄÉ >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺ÎÒÒ»¿ªÊ¼¾ÍÏëÍùÉè¼ÆÄ£Ê½¼Ü¹¹ÉÏ×ߣ¬
¡¡¡¡´ð£ºÏëÕâ´Î²Î¼Óµç×ÓÉè¼Æ´óÈüÍêºó£¬½øÈëǶÈëʽѧϰ£¡ÎÒÒ»Ö±¶¼ÓÐѧϰlinux²Ù×÷ϵͳ£¬2¡¢Ç§Íò±ðÖ½ÉÏ̸±ø£¬Êé±¾µÄѧϰÀëʵ¼Ê¹¤×÷µÄÊìÁ·²Ù×÷»¹Óкܳ¤Ò»¶Î¾àÀ룬ϣÍû >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺Çó¡¶NETÉè¼Æ¹æ·¶¡ª¡ª.NETÔ¼¶¨¡¢¹ßÓ÷¨Óëģʽ¡· ÖÐÎÄ...
¡¡¡¡´ð£ºÕâ¸öÒ³ÃæÉÏÓÐÕâ±¾Êé°¡£¬ÊÇpdfµÄ£¬fiiii.com/framework_design_guidelines/£¬Èç¹û´ò²»¿ª¾ÍÔÚÇ°Ãæ¼ÓÉÏÈý¸öwww> >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
