尽管在下面的代码中使用的是在电子商务站点中简单的单项购买,但我的一般问题是有关更新所有数据成员以始终保持对象数据处于有效状态的信息。
我发现“一致性”和“国家是邪恶的”是相关的短语,在这里进行了讨论:https : //en.wikibooks.org/wiki/Object_Oriented_Programming#.22State.22_is_Evil.21
<?php
class CartItem {
private $price = 0;
private $shipping = 5; // default
private $tax = 0;
private $taxPC = 5; // fixed
private $totalCost = 0;
/* private function to update all relevant data members */
private function updateAllDataMembers() {
$this->tax = $this->taxPC * 0.01 * $this->price;
$this->totalCost = $this->price + $this->shipping + $this->tax;
}
public function setPrice($price) {
$this->price = $price;
$this->updateAllDataMembers(); /* data is now in valid state */
}
public function setShipping($shipping) {
$this->shipping = $shipping;
$this->updateAllDataMembers(); /* call this in every setter */
}
public function getPrice() {
return $this->price;
}
public function getTaxAmt() {
return $this->tax;
}
public function getShipping() {
return $this->shipping;
}
public function getTotalCost() {
return $this->totalCost;
}
}
$i = new CartItem();
$i->setPrice(100);
$i->setShipping(20);
echo "Price = ".$i->getPrice().
"<br>Shipping = ".$i->getShipping().
"<br>Tax = ".$i->getTaxAmt().
"<br>Total Cost = ".$i->getTotalCost();
有什么缺点,或者更好的方法吗?
在由关系数据库支持的实际应用程序中,这是一个经常发生的问题,如果您不大量使用存储过程来将所有验证都推入数据库中。我认为数据存储区应该只存储数据,而代码应该执行所有运行时状态维护工作。
编辑:这是一个相关的问题,但没有关于维护有效状态的单个大功能的最佳实践建议:https : //stackoverflow.com/questions/1122346/c-sharp-object-directional-design-maintaining-有效对象状态
EDIT2:虽然@ eignesheep的回答是最好的,这答案- /software//a/148109/208591 -是什么罢了@ eigensheep的答案,我想知道之间的界限-代码应该只处理,全局状态应由启用DI的对象之间的状态传递代替。