»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚ¶þÕ ֵ¶ÔÏóģʽ¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚ¶þÕ ֵ¶ÔÏóģʽ
ÔÚËùÓеÄ×î¼òµ¥µÄ³ÌÐòÖУ¬´ó¶àÊý¶ÔÏó¶¼ÓÐÒ»¸ö±êʶ£¬Ò»¸öÖØÒªµÄÉÌÒµÓ¦ÓöÔÏó£¬ÀýÈçÒ»¸öCustomer»òÕßÒ»¸öSKU£¬ÓÐÒ»¸ö»òÕ߸ü¶àµÄÊôÐÔ---id,name,emailµØÖ·,ÕâÑù¿ÉÒÔ°ÑËü´Óͬһ¸öÀàµÄÆäËûʵÀýÇø·Ö¿ªÀ´¡£´ËÍ⣬¶ÔÏóÓÐÒ»¸öºã¶¨µÄ±êʶ:ËüÊǹᴩÓÚÕû¸öÓ¦ÓóÌÐòµÄÒ»¸öΨһµÄ±êʶ£¬¶ÔÓÚ³ÌÐòÔ±À´Ëµ£¬”customer A”ÔÚÈκεط½¾ÍÊÇ”customer A”,²¢ÇÒÖ»ÒªÄãµÄ³ÌÐòÔÚ³ÖÐøÔËÐÐʱ"customer A"ÈÔÈ»ÊÇ"customer A"¡£ µ«ÊÇÒ»¸ö¶ÔÏó²»ÐèÒªÓÐÒ»¸ö±êʶ¡£ÓÐЩ¶ÔÏó½ö½öÊÇΪÁËÃèÊöÆäËû¶ÔÏóµÄÊôÐÔ¡£
ÀýÈ磺ͨ³£ÓÃÒ»¸ö¶ÔÏóÃèÊöÒ»¸öÈÕÆÚ¡¢Ò»¸öÊý×Ö»òÕß»õ±Ò¡£ÈÕÆÚ¡¢ÕûÊý»òÃÀÔªµÄÀඨÒåÊǶ¼ÊDZãÓÚʹÓõġ¢¿ì½Ý¡¢±ãÓÚ·â×°µÄ£¬²¢ÇÒ·½±ã½øÐп½±´£¬Ï໥±È½Ï£¬ÉõÖÁÊÇ´´½¨¡£
´Ó±íÃæÉÏ¿´£¬ÕâЩÃèÊö¼òµ¥µÄ¶ÔÏóºÜÈÝÒ×±»Ö´ÐУºËüÃǵÄÓï¾ä·Ç³£ÉÙ£¬ÔÚ¹¹ÔìÀàʱÎÞÂÛÊÇÓ¦ÓÃÓÚCustomer»¹ÊÇSKU¶¼Ã»ÓÐʲô²»Í¬¡£Õâ¸öÏë·¨ËÆºõÊÇÕýÈ·µÄ£¬µ«ÊÇËùνµÄ"ËÆºõÕýÈ·"ºÜÈÝÒײúÉúһЩbug¡£
Çë¿´ÏÂÃæµÄ´úÂ룬ÕâÊÇÒ»¸ö¹ØÓÚÒÔÃÀÔª¸øÔ±¹¤·¢·Å¹¤×ʵĶÔÏóµÄ¶¨ÒåºÍÖ´ÐвÙ×÷¡£¶àÊýÇé¿öÏ£¬ËüµÄÔËÐÐÊÇûÓÐÎÊÌâµÄ¡££¨Õâ¸öÀà±»ÃüÃûΪBadDollar£¬ÒòΪËü»¹´æÔÚ×Åbug£©¡£¿¼ÂÇһϣ¬¿´ÄãÊÇ·ñÄÜ·¢ÏÖËüµÄbug¡£
|
// PHP5 class Work { function testBadDollarWorking() { |
ÄÇô£¬ bugÊÇÊ²Ã´ÄØ£¿Èç¹û²»ÄÜÉÏÃæµÄ´úÂëÀý×ÓÖÐÖ±¹ÛµØ·¢ÏÖÎÊÌ⣬ÕâÀïÓиöÌáʾ:¹ÍÔ±¶ÔÏó$p1ºÍ¶ÔÏó$p2ʹÓÃ×Åͬһ¸öBadDollar¶ÔÏóʵÀý¡£
Ê×ÏÈ£¬ÀàWorkºÍÀàPersonµÄʵÀýÒѾ´´½¨¡£ÄÇô£¬¼ÙÉèÿһ¸ö¹ÍÔ±×î³õÓÐÒ»¸ö¿ÕµÄµç×ÓÇ®°ü£¬¹ÍÔ±µÄµç×ÓÇ®°üPerson:walletÊÇͨ¹ýWork::payDay()º¯Êý·µ»ØµÄ¶ÔÏó×ÊÔ´±äÁ¿¸³ÖµµÄ£¬ËùÒÔ±»É趨Ϊһ¸öBadDollarÀàµÄ¶ÔÏóʵÀý¡£
»¹¼ÇµÃPHP5µÄ¶ÔÏó¸³Öµ´¦Àí·½Ê½Âð£¿ÒòΪPHP5µÄ¶ÔÏó¸³ÖµµÄ´¦Àí·½Ê½£¬ËùÒÔ$job::salary,¡¢$p1::walletºÍ$p2::walletÕâÈý¸ö¿´ÉÏÈ¥²»Í¬µÄ¶ÔÏóʵÀýËäȻʹÓÃ×Ų»Í¬µÄ“±êʶ·û”£¬µ«ÊÇÊÂʵÉÏ£¬ËüÃÇÈ«²¿¶¼Ö¸¶¨µ½Í¬Ò»¸ö¶ÔÏóʵÀý¡£
Òò´Ë£¬½ÓÏÂÀ´µÄ·¢·Å¹¤×ʵIJÙ×÷£¨PayDay±íʾ·¢·Å¹¤×ʵÄÈÕ×Ó£¬ÕâÀï±íʾ·¢·Å¹¤×ʵ͝×÷£©£¬Ê¹ÓÃ$job->payDay()±¾À´½ö½öÊÇÏëÔö¼Ó$P1µÄ¹¤×Ê£¬È´³öºõÒâÁϵشθø$P2Ò²·¢·ÅÁË¡£²¢ÇÒ£¬Õâ¸ö¶¯×÷»¹¸Ä±äÁ˹¤×÷µÄ»ù±¾¹¤×ʵĶî¶È¡£Òò´Ë£¬×îºóÁ½¸öÖµµÄ¼ì²â±¨´í¡£
| Value Object PHP5 Unit Test 1) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200 in testBadDollarWorking in ValueObjTestCase 2) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200 in testBadDollarWorking in ValueObjTestCase FAILURES!!! |
ÎÊÌ⣺
ÄÇô£¬Äã¸ÃÈçºÎΪDate»òDollarÕâÑùһЩÃèÊö¼òµ¥µÄÓ¦Óö¨ÒåÒ»¸ö¸ßЧµÄÀ࣬²¢ÇÒÒ×ÓÚ´´½¨ÄØ¡£
½â¾ö·½°¸£º
¸ßЧµÄ¶ÔÏóÓ¦¸ÃÏñPHPµÄÕûÐÍÄÇÑùÔË×÷£ºÈç¹ûÄã°Ñͬһ¸ö¶ÔÏó×ÊÔ´¸³Öµ¸øÁ½¸ö²»Í¬µÄ±äÁ¿£¬È»ºó¸Ä±äÆäÖеÄÒ»¸ö±äÁ¿£¬ÁíÒ»¸ö±äÁ¿ÈÔÈ»²»ÊÜÓ°Ïì¡£ÊÂʵÉÏ£¬Õâ¾ÍÊÇValue ObjectģʽµÄÄ¿±êËùÔÚ¡£
Ö´ÐÐValue Objectʱ£¬php4ºÍphp5ÊÇÓÐÇø±ðµÄ¡£
ÕýÈçÒÔÉÏÄãËù¿´µ½µÄ£¬PHP5ͨ¹ýnew½øÐжÔÏó×ÊÔ´µÄ¸³Öµ´«µÝµÄÊǶÔÏó×ÊÔ´µÄÖ¸Õë¾ÍÏñÎÒÃÇÔÚPHP4ÖÐͨ¹ýÖ¸Õë´«µÝÒ»Ñù¡£ºÜÃ÷ÏÔ£¬ÕâÊÇÒ»¸öÎÊÌ⡣ΪÁ˽â¾öÄǸöÎÊÌⲢʵÏÖÒ»¸öרÓжÔÏóDollarµÄÖµ£¬ÎÒÃDZØÐëʹÊôÐÔ$amountµÄ¶ÔÏóµÄËùÓÐÊôÐÔµÄÒ»¸öÖµÔÚÒ»°ãÇé¿öϲ»¿É±ä»ò²»Äܸı䡣µ«ÊÇÔÚPHPÓïÑÔµÄûÓÐÌṩ²ÎÊý²»¿É¸Ä±äµÄ¹¦ÄܵÄÇé¿öÏ£¬ÄãÍêÈ«¿ÉÒÔ½áºÏÊôÐԵĿɼûÐÔÓë»ñµÃºÍÉèÖ÷½·¨À´ÊµÏÖ¡£
Ïà·´µØ£¬PHP4²Ù×÷ËùÓеĶÔÏó¶¼ÊÇ×ñÑValue Objects¶ÔÏó¹æÂɵģ¬ÒòΪPHP4µÄ¸³Öµ²Ù×÷Ï൱ÓÚ¶Ô¶ÔÏó×öÁËÒ»¸ö¿½±´¡£ËùÒÔΪÁËÔÚPHP4ÖÐʵÏÖValue ObjectsÉè¼ÆÄ£Ê½ÄãÐèÒª´òÆÆÄãϸÐĵØÅàÑøµÄͨ¹ýÖ¸Õ븳ֵÀ´´´½¨¡¢´«µÝ¡¢ÌáÈ¡¶ÔÏóµÄϰ¹ß¡£
×¢£ºÊõÓï ²»¿É±äµÄ£¨Immutable£©£º
ÔڴʵäÖÐImmutableµÄ¶¨ÒåÊDz»ÔÊÐí»ò²»Ò×ÊÜÓ°Ïì¡£ÔÚ±à³ÌÖУ¬Õâ¸öÊõÓï±íʾһ¸öÒ»µ©±»ÉèÖþͲ»ÄܸıäµÄÖµ¡£
PHP5 Ñù±¾´úÂ룺
¼ÈÈ»ÎÒÃÇ¿ªÊ¼ÓÃPHP5±àд´úÂ룬ÈÃÎÒÃÇÓÅ»¯Ò»¸öPHP5µÄValue ObjectµÄʵÀý²¢´´½¨Ò»¸ö½ÏºÃµÄDollarÀඨÒå¡£ÃüÃûÔÚÃæÏò¶ÔÏó±à³ÌÖзdz£ÖØÒª£¬Ñ¡ÔñÒ»¸öΨһµÄ»õ±ÒÀàÐÍ×÷ΪÕâ¸öÀàµÄÃû×Ö£¬ËµÃ÷Ëü²»±»¶¨ÒåΪ¿ÉÒÔ´¦Àí¶àÖÖ»õ±ÒÀàÐ͵ÄÀà¡£
|
class Dollar { |
ͨ³££¬µ±ÄãʹÓÃÃæÏò¶ÔÏó½øÐбà³ÌµÄʱºò£¬Äã¾³£ÐèÒª´´½¨ÁËÒ»¸ö“setter”º¯Êý£¬¾ÍÀàËÆÓÚ£º
public setAmount($amount)
{
$this->amount=$amount;
}
Ò»Ñù£¬ÔÚÕâÖÖÇé¿öÏ£¬ËäȻûÓÐÉ趨º¯ÊýDollar::amount()£¬µ«ÔÚ¶ÔÏóµÄʵÀý»¯ÆÚʱ£¬²ÎÊýDollar::amount¾ÍÒѾ±»¸³ÖµÁË¡£¶øº¯ÊýDollar::getAmount()Ö»ÊÇÌṩһ¸ö·ÃÎÊDollarÊôÐԵŦÄÜ£¬ÔÚÕâÀï·ÃÎʵÄÊý¾ÝÀàÐÍΪ¸¡µãÐÍ¡£
×îÓÐȤµÄ±ä»¯ÊÇÔÚDollar::add()·½·¨º¯ÊýÖС£²¢²»ÊÇÖ±½Ó¸Ä±ä$this->amount±äÁ¿µÄÖµ´Ó¶ø»á¸Ä±äÒÑ´æÔÚµÄDollar¶ÔÏóʵÀý£¬¶øÊÇ´´½¨²¢·µ»ØÒ»¸öеÄDollarʵÀý¡£ÏÖÔÚ£¬¾¡¹ÜÄãÖ¸¶¨µ±Ç°¶ÔÏó¸ø¶à¸ö±äÁ¿£¬µ«ÊÇÿһ¸ö±äÁ¿µÄ±ä»¯¶¼²»»áÓ°ÏìÆäËüµÄ±äÁ¿ÊµÀý¡£
¶ÔÓÚ¼ÛÖµÉè¼ÆÄ£Ê½²»±äÐÔÊǹؼü£¬ÈκζÔÓÚÒ»¸öValue ObjectµÄ±äÁ¿amountµÄ¸Ä±ä£¬ÊÇͨ¹ý´´½¨Ò»¸öеĴøÓв»Í¬Ô¤ÆÚÖµµÄÀàµÄʵÀýÀ´Íê³ÉµÄ¡£ÉÏÎÄÖÐÌá¸ßµÄ×î³õÄǸö$this->amount±äÁ¿µÄÖµ´Óδ¸Ä±ä¡£
¼òµ¥À´Ëµ£¬ÔÚPHP5ÀïÃæÊ¹ÓüÛÖµÉè¼ÆÄ£Ê½Ê±£¬ÐèҪעÒâÒÔϼ¸¸ö·½Ã棺
- ±£»¤Öµ¶ÔÏóµÄÊôÐÔ£¬½ûÖ¹±»Ö±½Ó·ÃÎÊ¡£
- ÔÚ¹¹Ô캯ÊýÖоͶÔÊôÐÔ½øÐи³Öµ¡£
- È¥µôÈκÎÒ»¸ö»á¸Ä±äÊôÐÔÖµµÄ·½Ê½º¯Êý£¨setter£©£¬·ñÔòÊôÐÔÖµºÜÈÝÒ×±»¸Ä±ä¡£
ÒÔÉÏÈý²½´´½¨ÁËÒ»¸ö²»±äµÄÖµ£¬Õâ¸öÖµÒ»µ©±»³õʼ»¯ÉèÖÃÖ®ºó¾Í²»Äܱ»¸Ä±ä¡£µ±È»£¬ÄãÒ²Ó¦¸ÃÌṩһ¸ö²é¿´º¯Êý»òÕßÊÇ·ÃÎÊValue ObjectµÄÊôÐԵķ½·¨£¬²¢ÇÒ¿ÉÒÔÌí¼ÓһЩÓëÕâ¸öÀàÏà¹ØµÄº¯Êý¡£Öµ¶ÔÏó²¢²»ÊÇÖ»ÄÜÓÃÔÚÒ»¸ö¼òµ¥µÄ¼Ü¹¹ÉÏ£¬ËüÒ²¿ÉÒÔʵÏÖÖØÒªµÄÉÌÎñÂß¼Ó¦Óá£ÈÃÎÒÃÇ¿´¿´ÏÂÒ»¸öÀý×Ó:
ÏêϸÀý×Ó£º
ÈÃÎÒÃÇÔÚһϸü¼Ó¸´ÔÓµÄÀý×ÓÖв鿴ֵ¶ÔÏóģʽµÄ¹¦ÄÜ¡£
ÈÃÎÒÃÇ¿ªÊ¼ÊµÏÖÒ»¸öµÄ»ùÓÚPHP5ÖÐDollarÀàÖеÄÒ»¸öMonopolyÓÎÏ·¡£
µÚÒ»¸öÀàMonopolyµÄ¿ò¼ÜÈçÏ£º
class Monopoly {
protected $go_amount;
public function __construct() {
$this->go_amount=new Dollar(200);
}
public function passGo($player) {
$player->collect($this->go_amount);
}
}
Ŀǰ£¬MonopolyµÄ¹¦ÄܱȽϼòµ¥¡£¹¹ÔìÆ÷´´½¨Ò»¸öDollarÀàµÄʵÀý$go_amount,É趨Ϊ200£¬ÊµÀýgo_amount³£³£±»passtGo()º¯Êýµ÷Óã¬Ëü´ø×ÅÒ»¸öplayer²ÎÊý£¬²¢ÈöÔÏóplayerµÄº¯ÊýcollectΪplayer»úÉÏ200ÃÀÔª.
PlayerÀàµÄÉùÃ÷Çë¿´ÏÂÃæ´úÂ룬MonoplayÀàµ÷ÓôøÒ»¸öDollar²ÎÊýµÄPlayer::collect()·½·¨¡£È»ºó°ÑDollarµÄÊýÖµ¼Óµ½PlayerµÄÏÖ½ðÓà¶îÉÏ¡£ÁíÍ⣬ͨ¹ýÅжÏPlayer::getBalance()·½·¨º¯Êý·µ»ØÀ´µÄÓà¶î£¬ÎÒÃÇ¿ÉÒÔÖªµÀʹ·ÃÎʵ±Ç°PlayerºÍMonopoly¶ÔÏóʵÀýÊÇ·ñÔÚ¹¤×÷ÖС£
|
class Player { |
ÉϱßÒѾ¸ø³öÁËÒ»¸öMonopolyºÍPlayerÀ࣬ÄãÏÖÔÚ¿ÉÒÔ¸ù¾ÝĿǰÉùÃ÷µÄ¼¸¸öÀඨÒå½øÐÐһЩ²âÊÔÁË¡£
MonopolyTestCaseµÄÒ»¸ö²âÊÔʵÀý¿ÉÒÔÏñÏÂÃæÕâÑùд£º
class MonopolyTestCase extends UnitTestCase {
function TestGame() {
$game=new Monopoly;
$player1=new Player(‘Jason’);
$this->assertEqual(1500, $player1->getBalance());
$game->passGo($player1);
$this->assertEqual(1700, $player1->getBalance());
$game->passGo($player1);
$this->assertEqual(1900, $player1->getBalance());
}
}
Èç¹ûÄãÔËÐÐMonopolyTestCaseÕâ¸ö²âÊÔ´úÂ룬´úÂëµÄÔËÐÐÊÇûÓÐÎÊÌâµÄ¡£ÏÖÔÚ¿ÉÒÔÌí¼ÓһЩÐµĹ¦ÄÜ¡£
ÁíÒ»¸öÖØÒªµÄ¸ÅÄîÊǶÔÏóMonopolyÖеÄ×â½ðÖ§¸¶¡£ÈÃÎÒÃÇÊ×ÏÈдһ¸ö²âÊÔʵÀý£¨²âÊÔÒýµ¼¿ª·¢£©¡£ÏÂÃæµÄ´úÂëÏ£ÍûÓÃÀ´ÊµÏּȶ¨µÄÄ¿±ê¡£
function TestRent() {
$game=new Monopoly;
$player1=new Player(‘Madeline’);
$player2=new Player(‘Caleb’);
$this->assertEqual(1500, $player1->getBalance());
$this->assertEqual(1500, $player2->getBalance());
$game->payRent($player1, $player2, new Dollar(26));
$this->assertEqual(1474, $player1->getBalance());
$this->assertEqual(1526, $player2->getBalance());
}
¸ù¾ÝÕâ¸ö²âÊÔ´úÂ룬ÎÒÃÇÐèÒªÔÚMonopoly¶ÔÏóÖÐÔö¼ÓpayRent()µÄ·½·¨º¯ÊýÀ´ÊµÏÖÒ»¸öPlayer¶ÔÏóÈ¥Ö§¸¶×â½ð¸øÁíÒ»¸öPlayer¶ÔÏó.
|
Class Monopoly { |
class Player {
// ...
public function pay($amount) {
$this->savings=$this->savings->add(-1 * $amount);
}
}
µ«ÊÇ£¬ÎÒÃÇ·¢ÏÖÔÚPHPÖÐÄã²»ÄÜÓÃÒ»¸öÊý×Ö³ËÒÔÒ»¸ö¶ÔÏ󣨲»ÏñÆäËûÓïÑÔ£¬PHP²»ÔÊÐíÖØÔØ²Ù×÷·û£¬ÒԱ㹹Ô캯Êý½øÐÐÔËË㣩¡£ËùÒÔ£¬ÎÒÃÇͨ¹ýÌí¼ÓÒ»¸ödebit()·½·¨º¯ÊýʵÏÖDollar¶ÔÏóµÄ¼õµÄ²Ù×÷¡£
|
class Dollar { |
class Player {
// ...
public function pay($amount) {
$this->savings=$this->savings->debit($amount);
return $amount;
}
}
Player::pay()·½·¨·µ»ØÖ§¸¶½ð¶îµÄ$amount¶ÔÏó£¬ËùÒÔMonopoly::payRent()ÖеÄÓï¾ä$to->collect($from->pay($rent))µÄÓ÷¨ÊÇûÓÐÎÊÌâµÄ¡£ÕâÑù×öµÄ»°£¬Èç¹û½«À´ÄãÌí¼ÓеēÉÌÒµÂß¼”ÓÃÀ´ÏÞÖÆÒ»¸öplayer²»ÄÜÖ§¸¶±ÈËûÏÖÓеÄÓà¶î»¹¶àµÃ½ð¶î¡££¨ÔÚÕâÖÖÇé¿öÏ£¬½«·µ»ØÓëplayerµÄÕË»§Óà¶îÏàͬµÄÊýÖµ¡£Í¬Ê±£¬Ò²¿ÉÒÔµ÷ÓÃÒ»¸ö“ÆÆ²úÒì³£´¦Àí”À´¼ÆËã²»×ãµÄ½ð¶î£¬²¢½øÐÐÏà¹Ø´¦Àí¡£¶ÔÏó$toÈÔÈ»´Ó¶ÔÏó$fromÖÐÈ¡µÃ$fromÄܹ»¸øÓèµÄ½ð¶î¡££©
×¢£ºÊõÓï------ÉÌÒµÂß¼
ÔÚÒ»¸öÓÎϷƽ̨µÄÀý×ÓÉÏÌá¼°µÄ“ÉÌÒµÂß¼”ËÆºõÎÞ·¨Àí½â¡£ÕâÀïµÄÉÌÒµµÄÒâ˼²¢²»ÊÇÖ¸Õý³£¹«Ë¾µÄÉÌÒµÔË×÷£¬¶øÊÇÖ¸ÒòÎªÌØÊâÓ¦ÓÃÁìÓòÐèÒªµÄ¸ÅÄî¡£Çë°ÑËüÈÏ֪Ϊ “Ò»¸öÖ±½ÓµÄÈÎÎñ»òÄ¿±ê”£¬¶ø²»ÊÇ“ÕâÀïÃæ´æÔÚµÄÉÌÒµ²Ù×÷”¡£
ËùÒÔ£¬¼ÈȻĿǰÎÒÃÇÌÖÂÛµÄÊÇÒ»¸öMonopoly£¬ÄÇôÕâÀïµÄ “ÉÌÒµÂß¼”Ô̺¬µÄÒâ˼¾ÍÊÇÕë¶ÔÒ»¸öÓÎÏ·µÄ¹æÔò¶øËµµÄ¡£
PHP4Ñù±¾´úÂ룺
ºÍPHP5²»Ò»ÑùµÄÊÇ£¬PHP4¸³Öµ¶ÔÏó×ÊÔ´µÄʱºòÊÇ¿½±´¸Ã¶ÔÏó£¬Õâ¸öÓï·¨µÄÌØµã±¾ÖÊÉϺÍÖµ¶ÔÏóÉè¼ÆÄ£Ê½ÒªÇóÕýºÃÎǺϡ£
È»¶ø£¬PHP4²»ÄÜ¿ØÖƵÄÊôÐԺͷ½·¨º¯ÊýÔÚ¶ÔÏóÖ®ÍâµÄ¿É¼ûÐÔ£¬ËùÒÔʵÏÖÒ»¸öÖµ¶ÔÏóÉè¼ÆÄ£Ê½Ïà¶ÔPHP5Ò²ÓÐϸ΢µÄ²î±ð¡£
¼ÙÈçÄã»ØÏëÒ»ÏÂÕâ±¾ÊéÐòÑÔÖеē¶ÔÏó¾ä±ú”²¿·Ö£¬ËüÌá³öÁËÈý¸ö “¹æÔò”£¬µ±ÄãÔÚPHP4ÖÐʹÓöÔÏóȥģ·ÂPHP5ÖеĶÔÏó¾ä±úʱ£¬ÕâÈý¸ö¹æÔò×ÜÊÇÊÊÓõģº
- ͨ¹ýÖ¸Õë($obj=&new class;)À´´´½¨¶ÔÏó¡£
- ÓÃÖ¸Õë(function funct(&$obj) param{})À´´«µÝ¶ÔÏó¡£
- ÓÃÖ¸Õë(function &some_funct() {} $returned_obj=& some_funct())À´»ñȡһ¸ö¶ÔÏó¡£
È»ºó£¬Öµ¶ÔÏóÉè¼ÆÄ£Ê½È´²»ÄÜʹÓÃÉÏÊöÈý¸ö“×ÜÊÇÊÊÓԵĹæÔò¡£Ö»ÓкöÊÓÁËÕâЩ¹æÔò£¬²ÅÄÜ×ÜÊǵõ½Ò»¸öPHP4¶ÔÏóµÄ¿½±´(ÕâÏ൱ÓÚPHP5Öеē¿Ë¡”²Ù×÷£¬ÃèÊöÔÚhttp://www.php.net/manual/en/language.oop5.cloning.php)
ÒòΪPHP4¿ÉÒÔÇáËɵظ³ÖµÒ»¸ö¶ÔÏó—ÕâÔÚPHPÓïÑÔÖÐÊÇÒ»¸ö¹ÌÓеÄÐÐΪ£¬ËùÒÔʵÏÖ±äÁ¿µÄ²»¿É¸ü¸Ä¾ÍÐèҪͨ¹ýÖµ¶ÔÏóͨÓÃж¨À´ÊµÏÖ¡£ÔÚPHP4ÖУ¬Èç¹ûҪʹÓÃÖµ¶ÔÏó£¬Ç벻Ҫͨ¹ýÖ¸ÕëÀ´´´½¨»ò»ñȡһ¸ö¶ÔÏ󣬲¢ÇÒ¸øËùÓÐÐèÒª±£»¤ÒÔÃâÍâ½çÐ޸ĵÄÊôÐÔ»òÕß·½·¨º¯ÊýÃüÃûʱ£¬¶¼ÔÚÊôÐԺͷ½·¨º¯ÊýµÄÃû×Ö¼ÓÉÏÏ»®Ïߣ¨_£©×öǰ׺¡£°´ÕÕж¨£¬±äÁ¿Èç¹û¾ßÓÐÖµ¶ÔÏóµÄÊôÐÔ£¬Ó¦¸ÃʹÓÃÒ»¸öÏ»®ÏßÀ´±êʶËüµÄ˽ÓÐÐÔ¡£
ÏÂÃæÊÇPHP4ÖеÄDollarÀà:
ÏÂÃæÕâ¸öʵÀý¿ÉÒÔ˵Ã÷£¬Äã²»ÄÜÔÚPHP4ÖÐÏÞÖÆÒ»¸öÊôÐÔÖ»Äܱ»Íⲿ¸ü¸Ä£º
function TestChangeAmount() {
$d=new Dollar(5);
$this->assertEqual(5, $d->getAmount());
//only possible in php4 by not respecting the _private convention
$d->_amount=10;
$this->assertEqual(10, $d->getAmount());
}
ÔÙÖØ¸´Ò»´Î£¬ÔÚËùÓÐPHP4¶ÔÏóÖУ¬Ë½ÓбäÁ¿µÄǰ׺ʹÓÃÒ»¸öÏ»®Ïߣ¬µ«ÊÇÄ㻹ÊÇ¿ÉÒÔ´ÓÍⲿÀ´Ö±½Ó·ÃÎÊ˽ÓÐÊôÐԺͷ½·¨º¯Êý¡£
Öµ¶ÔÏóÖеÄÉÌÒµÂß¼
Öµ¶ÔÏó(Value Objects)²»½ö½öÓÃÓÚ×îСÏ޶ȵķÃÎÊ·½·¨ÕâÑùµÄ¼òµ¥µÄÊý¾Ý½á¹¹£¬ËüͬÑù»¹¿ÉÒÔ°üÀ¨ÓмÛÖµµÄÉÌÒµÂß¼¡£¿¼ÂÇÒÔÏÂÄãÈç¹ûʵÏÖÐí¶àÈËÖÐÆ½¾ù·ÖÅä½ðÇ®¡£
Èç¹û×ÜÇ®ÊýȷʵÊÇ¿ÉÒÔ·Ö³ÉÕûÊý£¬Äã¿ÉÒÔÉú³ÉÒ»×éDollar¶ÔÏ󣬶øÇÒÿһ¸öDollar¶ÔÏó¶¼ÓµÓÐÏàͬµÄ²¿·Ö¡£µ«Êǵ±×ÜÊý¿ÉÒÔÕûÊýµÄÃÀÔª»òÕßÃÀ·ÖµÄʱºò£¬ÎÒÃǸÃÔõô´¦ÀíÄØ£¿
ÈÃÎÒÃÇ¿ªÊ¼ÓÃÒ»¸ö¼òµ¥µÄ´úÂëÀ´²âÊÔһϣº
// PHP5
function testDollarDivideReturnsArrayOfDivisorSize() {
$full_amount=new Dollar(8);
$parts=4;
$this->assertIsA(
$result=$full_amount->divide($parts)
,’array’);
$this->assertEqual($parts, count($result));
}
×¢ÊÍ assertIsA:
assertIsA()µÄ×÷ÓÃÊÇÈÃÄã²âÊÔ£ºÒ»¸öÌØ¶¨µÄ±äÁ¿ÊÇ·ñÊôÓÚÒ»¸öʵÀý»¯µÄÀà¡£µ±È»ÄãÒ²¿ÉÒÔÓÃËüÀ´ÑéÖ¤±äÁ¿ÊÇ·ñÊôÓÚһЩphpÀàÐÍ£º×Ö·û´®¡¢Êý×Ö¡¢Êý×éµÈ¡£
ΪÁËʵÏÖÉÏÊö²âÊÔ£¬ Dollar::divide()·½·¨º¯ÊýµÄ±àÂëÈçÏÂ…
public function divide($divisor) {
return array_fill(0,$divisor,null);
}
×îºÃ¼ÓÉϸü¶àµÄϸ½Ú¡£
function testDollarDrivesEquallyForExactMultiple() {
$test_amount=1.25;
$parts=4;
$dollar=new Dollar($test_amount*$parts);
foreach($dollar->divide($parts) as $part) {
$this->assertIsA($part, ‘Dollar’);
$this->assertEqual($test_amount, $part->getAmount());
}
}
ÏÖÔÚ£¬Ó¦µ±·µ»Ø´æÓÐÕýÈ·Êý¾ÝµÄDollar¶ÔÏ󣬶ø²»ÊǼòµ¥µÄ·µ»ØÊýÁ¿ÕýÈ·µÄÊý×é¡£
ʵÏÖÕâ¸öÈÔȻֻÐèÒªÒ»ÐÐÓï¾ä£º
×îºóÒ»¶Î´úÂëÐèÒª½â¾öÒ»¸ö³ýÊý²»ÄܰÑDollarµÄ×ÜÊý¾ùÔȵijý¿ªµÄÎÊÌâ¡£
ÕâÊÇÒ»¸ö¼¬ÊÖµÄÎÊÌ⣺Èç¹û´æÔÚ²»ÄܾùÔȳý¿ªµÄÇé¿ö£¬ÊǵÚÒ»²¿·Ö»¹ÊÇ×îºóÒ»²¿·ÖÄܵõ½Ò»¸ö¶îÍâµÄ½ð¶î£¨±ãÊ¿£©£¿ÔõÑù¶ÀÁ¢²âÊÔÕⲿ·ÖµÄ´úÂ룿
Ò»¸ö·½·¨ÊÇ£ºÃ÷È·Ö¸¶¨´úÂë×îºóÐèҪʵÏÖÄ¿±ê£ºÕâ¸öÊý×éµÄÔªËØÊýÁ¿Ó¦¸ÃÊÇÓë³ýÊý±íʾµÄÊýÁ¿ÏàµÈµÄ£¬Êý×éµÄÔªËØÖ®¼äµÄ²îÒì²»ÄÜ´óÓÚ0.01£¬²¢ÇÒËùÓв¿·ÖµÄ×ÜÊýÓ¦¸ÃÓë±»³ý֮ǰµÄ×ÜÊýµÄÖµÊÇÏàµÈµÄ¡£
ÉÏÃæµÄÃèÊöͨ¹ýÕýÈçÏÂÃæµÄ´úÂëʵÏÖ£º
function testDollarDivideImmuneToRoundingErrors() {
$test_amount=7;
$parts=3;
$this->assertNotEqual( round($test_amount/$parts,2),
$test_amount/$parts,
’Make sure we are testing a non-trivial case %s’);
$total=new Dollar($test_amount);
$last_amount=false;
$sum=new Dollar(0);
foreach($total->divide($parts) as $part) {
if ($last_amount) {
$difference=abs($last_amount-$part->getAmount());
$this->assertTrue($difference <=0.01);
}
$last_amount=$part->getAmount();
$sum=$sum->add($part);
}
$this->assertEqual($sum->getAmount(), $test_amount);
}
×¢ÊÍ assertNotEqual:
µ±ÄãҪȷ±£Á½¸ö±äÁ¿µÄÖµÊDz»Ïàͬʱ£¬Äã¿ÉÒÔÓÃËüÀ´½øÐмìÑé¡£ÕâÀïÃæµÄÖµÏàͬÊÇPHPµÄ”==”ÔËËã·û½øÐÐÅжϵġ£ÈκÎÇé¿öϵ±ÄãÐèҪȷ±£Á½¸ö±äÁ¿µÄÖµÊDz»ÏàͬµÄʱºò£¬Äã¾Í¿ÉÒÔʹÓÃËü¡£
ÏÖÔÚ¸ù¾ÝÉÏÊö´úÂ룬Èç¹ûÀ´¹¹ÔìDollar::divide()·½·¨º¯ÊýÄØ£¿
|
class Dollar { |
½â¾öÉϱßÕâЩÎÊÌâµÄ·½·¨ÊÇÊ²Ã´ÄØ£¿»¹ÊÇʹÓòâÊÔµ¼ÏòµÄ¿ª·¢Ñ»·Ä£Ê½£ºÔö¼ÓÒ»¸öÐèÇóʵÀý£¬¹Û²ì¿ÉÄܵĴíÎ󣬱àд´úÂëÀ´Éú³ÉÒ»¸öеÄʵÀý½øÐÐÔËÐУ¬»¹ÓÐÎÊÌâ´æÔÚʱ¼ÌÐø·Ö½â¡£×îºóÖØ¸´ÉÏÊö¹ý³Ì¡£
|
public function divide($divisor) { return array_fill(0,$divisor,new Dollar($this->amount / $divisor)); |
| // PHP4 class Dollar { var $_amount; function Dollar($amount=0) { $this->_amount=(float)$amount; } function getAmount() { return $this->_amount; } function add($dollar) { return new Dollar($this->_amount + $dollar->getAmount()); } function debit($dollar) { return new Dollar($this->_amount - $dollar->getAmount()); } } |
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚ¶þÕ ֵ¶ÔÏóģʽ£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺±à³ÌÉè¼ÆÄ£Ê½,23ÖÖÉè¼ÆÄ£Ê½Ôõôѧ°¡,ÐèÒªÄÇÖÖͨË×...
¡¡¡¡´ð£ºÍ¨Óñà³ÌÉè¼ÆÄ£Ê½¹²23ÖÖ-Ò×ѧƪ 1¡¢¹¤³§Ä£Ê½-×·MMÉÙ²»ÁËÇë³Ô·¹ÁË,Âóµ±À͵靈áºÍ¿ÏµÂ»ùµÄ¼¦³á¶¼ÊÇMM°®³ÔµÄ¶«Î÷,ËäÈ»¿ÚζÓÐËù²»Í¬,µ«²»¹ÜÄã´øMMÈ¥Âóµ±ÀÍ»ò¿ÏµÂ»ù,Ö»¹ÜÏò·þÎñԱ˵¡±À´Ëĸö¼¦³á¡±¾ÍÐÐÁË.Âóµ±ÀͺͿϵ»ù¾ÍÊÇÉú²ú¼¦³áµÄ 2¡¢½¨Ôìģʽ-MM... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺java ÖеÄÉè¼ÆÄ£Ê½µÄÏêϸ½éÉÜ
¡¡¡¡´ð£ºÕâ²»ÊǼ¸¾ä»°¾ÍÄÜ˵ÍêµÄ°É£¬×îºÃÈ¥ÕÒ¼¸±¾µç×ÓÊé¿´¿´¡£¹úÄڱȽϲ»´íµÄÊéÓС¶JAVAÓëģʽ¡·¡¶´ó»°Éè¼ÆÄ£Ê½¡·£¬JAVAÓëģʽ½²µÃÓÐÉî¶È£¬Ò»°ãÈ˲»Ò»¶¨Äܼá³Ö¿´ÏÂÈ¥£¬´ó»°Éè¼ÆÄ£Ê½½²µÄ±È½ÏÈÝÒ×Àí½â£¬ÊÇÓÃC#ÃèÊöµÄ£¬²»¹ýÔÀí¶¼Ïàͨ£¬¶øÇÒC#Óï·¨ÓëJAVA·Ç... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺½éÉܼ¸¸öÄã±È½ÏÊìϤµÄÉè¼ÆÄ£Ê½,²¢¼òµ¥½éÉÜËüÃÇÊÇÈç...
¡¡¡¡´ð£ºÈçºÎ×öºÃ¼ô¼ÄØ£¿Ôڴ˱ÊÕß̸̸×Ô¼ºµÄ¹Ûµã£º¼ô¼¾ÍÊǽ«²»·ûºÏÖ÷ÌâµÄ²¿·Öɾ³ý²¢ÕâÀﻹ½éÉܼ¸¸ö¹ý¶ÉЧ¹ûµÄ²é¿´¼¼ÇÉ£ºÔÚTransitionsÃæ°åµÄ´°¿Ú¿ØÖƲ˵¥ÖУ¬Ñ¡Ôñ >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
