php设计模式介绍之值对象模式(4)_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:谈PHP程序开发中的中文编码问题
PHP程序设计中中文编码问题曾经困扰很多人,导致这个问题的原因其实很简单,每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码, 中国的 GB2312-80,日本的 JIS 等。作为该国家/区域内信息处理的基础,字符编码集起着统一编码的

另一个重要的概念是对象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 {

// ...

/**

* pay rent from one player to another

* @param Player $from the player paying rent

* @param Player $to the player collecting rent

* @param Dollar $rent the amount of the rent

* @return void

*/

public function payRent($from, $to, $rent) {

$to->collect($from->pay($rent));

}

}

payRent()方法函数实现了两个player对象之间($from和$to)的租金支付。方法函数Player::collect()已经被定义了,但是Player::pay()必须被添加进去,以便实例$from通过pay()方法支付一定的Dollar数额$to对象中。首先我们定义Player::pay()为:

class Player {

// ...

public function pay($amount) {

$this->savings = $this->savings->add(-1 * $amount);

}

}

但是,我们发现在PHP中你不能用一个数字乘以一个对象(不像其他语言,PHP不允许重载操作符,以便构造函数进行运算)。所以,我们通过添加一个debit()方法函数实现Dollar对象的减的操作。

class Dollar {

protected $amount;

public function __construct($amount=0) {

$this->amount = (float)$amount;

}

public function getAmount() {

return $this->amount;

}

public function add($dollar) {

return new Dollar($this->amount $dollar->getAmount());

}

public function debit($dollar) {

return new Dollar($this->amount - $dollar->getAmount());

}

}

引入Dollar::debit()后,Player::pay()函数的操作依然是很简单的。

class Player {

// ...

/**

* make a payment

* @param Dollar $amount the amount to pay

* @return Dollar the amount payed

*/

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,那么这里的 “商业逻辑”蕴含的意思就是针对一个游戏的规则而说的。

分享:浅谈正确理解PHP程序错误信息的表示含义
简述:我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的。这些错误通常会迷惑PHP编译器。如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧。 我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的。

来源:模板无忧//所属分类:PHP教程/更新时间:2009-06-18
相关PHP教程