아래 코드에서 전자 상거래 사이트의 간단한 단일 품목 구매가 사용되지만 일반적인 질문은 모든 데이터 멤버를 업데이트하여 객체의 데이터를 항상 유효한 상태로 유지하는 것입니다.
https://ko.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 가능 상태 전달로 대체되어야합니다.