Mặc dù trong mã bên dưới, một giao dịch mua một mặt hàng đơn giản trong một trang web thương mại điện tử được sử dụng, câu hỏi chung của tôi là về việc cập nhật tất cả các thành viên dữ liệu để giữ dữ liệu của đối tượng ở trạng thái hợp lệ mọi lúc.
Tôi thấy "tính nhất quán" và "trạng thái là xấu xa" là các cụm từ có liên quan, được thảo luận tại đây: https://en.wikibooks.org/wiki/Object_Orients_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();
Bất kỳ nhược điểm, hoặc có thể cách tốt hơn để làm điều này?
Đây là sự cố định kỳ trong các ứng dụng trong thế giới thực được hỗ trợ bởi cơ sở dữ liệu quan hệ và nếu bạn không sử dụng rộng rãi các quy trình được lưu trữ để đẩy tất cả xác thực vào cơ sở dữ liệu. Tôi nghĩ rằng kho lưu trữ dữ liệu chỉ nên lưu trữ dữ liệu, trong khi mã phải thực hiện tất cả trạng thái thời gian chạy duy trì công việc.
EDIT: đây là một câu hỏi liên quan nhưng không có khuyến nghị thực hành tốt nhất liên quan đến một chức năng lớn duy nhất để duy trì trạng thái hợp lệ: /programming/1122346/c-sharp-object-oriented-design-maintained- trạng thái đối tượng hợp lệ
EDIT2: Mặc dù câu trả lời của @ eignesheep là tốt nhất, nhưng câu trả lời này - /software//a/148109/208591 - là những gì lấp đầy các dòng giữa câu trả lời của @ eigensheep và những gì tôi muốn biết - mã chỉ nên xử lý, và trạng thái toàn cầu nên được thay thế bằng trạng thái chuyển qua trạng thái cho phép DI giữa các đối tượng.