Aşağıdaki kodda bir e-ticaret sitesinde basit bir tek öğe satın alma kullanılmasına rağmen, genel sorum, bir nesnenin verilerini her zaman geçerli durumda tutmak için tüm veri üyelerini güncellemektir.
Burada tartışılan alakalı ifadeler olarak "tutarlılık" ve "durum kötü" buldum: 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();
Herhangi bir dezavantaj, ya da belki de bunu yapmanın daha iyi yolları?
İlişkisel bir veritabanı tarafından desteklenen gerçek dünya uygulamalarında tekrarlanan bir sorundur ve saklı yordamları tüm doğrulamayı veritabanına itmek için yoğun olarak kullanmazsanız. Ben veri deposu sadece veri depolamak gerektiğini düşünüyorum, kod ise tüm çalışma zamanı durumunu korumak iş yapmak gerekir.
EDIT: Bu ilgili bir soru, ancak geçerli durumunu korumak için tek bir büyük işlevi ile ilgili en iyi uygulama önerisi yok: /programming/1122346/c-sharp-object-oriented-design-maintaining- geçerli-nesne-devlet
EDIT2: @ eignesheep'in yanıtı en iyisi olmasına rağmen, bu cevap - /software//a/148109/208591 - @ eigensheep'in yanıtı ve bilmek istediklerim arasındaki çizgileri dolduran şeydir - kod yalnızca işlenmelidir, ve küresel durum, DI-etkin durumun nesneler arasında geçişi ile değiştirilmelidir.