Bien que dans le code ci-dessous, un simple achat d'un article dans un site de commerce électronique soit utilisé, ma question générale concerne la mise à jour de tous les membres de données pour garder les données d'un objet dans un état valide à tout moment.
J'ai trouvé «cohérence» et «état est mauvais» comme expressions pertinentes, discutées ici: 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();
Des inconvénients ou peut-être de meilleures façons de le faire?
Il s'agit d'un problème récurrent dans les applications du monde réel soutenu par une base de données relationnelle, et si vous n'utilisez pas de procédures stockées de manière extensive pour pousser toute la validation dans la base de données. Je pense que le magasin de données devrait simplement stocker des données, tandis que le code devrait faire tout le travail de maintenance de l'état d'exécution.
EDIT: c'est une question connexe mais n'a pas de recommandation de meilleures pratiques concernant une seule grande fonction pour maintenir un état valide: /programming/1122346/c-sharp-object-oriented-design-maintaining- état-objet-valide
EDIT2: Bien que la réponse de @ eignesheep soit la meilleure, cette réponse - /software//a/148109/208591 - est ce qui remplit les lignes entre la réponse de @ eigensheep et ce que je voulais savoir - le code ne devrait être traité que, et l'état global doit être remplacé par un passage d'état activé par DI entre les objets.