แม้ว่าในรหัสด้านล่างจะใช้การซื้อรายการเดียวอย่างง่ายในไซต์อีคอมเมิร์ซคำถามทั่วไปของฉันคือการอัปเดตข้อมูลสมาชิกทั้งหมดเพื่อให้ข้อมูลของวัตถุอยู่ในสถานะที่ถูกต้องตลอดเวลา
ฉันพบว่า "ความสอดคล้อง" และ "สถานะเป็นสิ่งที่ชั่วร้าย" เป็นวลีที่เกี่ยวข้องซึ่งได้กล่าวถึงที่นี่: 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();
ข้อเสียหรือวิธีที่ดีกว่าในการทำเช่นนี้?
นี่เป็นปัญหาที่เกิดขึ้นซ้ำในแอปพลิเคชันในโลกแห่งความจริงซึ่งได้รับการสนับสนุนจากฐานข้อมูลเชิงสัมพันธ์และหากคุณไม่ใช้ขั้นตอนการจัดเก็บอย่างกว้างขวางเพื่อผลักดันการตรวจสอบทั้งหมดลงในฐานข้อมูล ฉันคิดว่าแหล่งข้อมูลควรเก็บข้อมูลในขณะที่รหัสควรทำสถานะการทำงานในขณะทำงานทั้งหมด
แก้ไข: นี่เป็นคำถามที่เกี่ยวข้อง แต่ไม่มีคำแนะนำวิธีปฏิบัติที่ดีที่สุดเกี่ยวกับฟังก์ชั่นใหญ่เดียวเพื่อรักษาสถานะที่ถูกต้อง: /programming/1122346/c-sharp-object-oriented-design-maintaining- ที่ถูกต้องวัตถุรัฐ
EDIT2: แม้ว่าคำตอบของ @ eignesheep นั้นดีที่สุดคำตอบนี้ - /software//a/148109/208591 - เป็นสิ่งที่เติมเต็มบรรทัดระหว่างคำตอบของ @ eigensheep และสิ่งที่ฉันต้องการรู้ - โค้ดควรประมวลผลเท่านั้น และสถานะโกลบอลควรถูกทดแทนโดยการส่งผ่าน DI-enabled ของสถานะระหว่างวัตถุ