以下のコードでは、eコマースサイトでの単純な単一アイテム購入を使用していますが、私の一般的な質問は、すべてのデータメンバーを更新して、オブジェクトのデータを常に有効な状態に保つことです。
関連するフレーズとして「一貫性」と「状態は悪」を見つけました。ここで説明します: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();
不利な点、またはこれを行うより良い方法はありますか?
これは、リレーショナルデータベースに裏付けられた現実のアプリケーションで繰り返し発生する問題であり、ストアドプロシージャを広範囲に使用してすべての検証をデータベースにプッシュしない場合です。データストアはデータを保存するだけで、コードは実行時の状態を維持するすべての作業を行う必要があると思います。
編集:これは関連する質問ですが、有効な状態を維持するための単一の大きな機能に関するベストプラクティスの推奨事項はありません:https: //stackoverflow.com/questions/1122346/c-sharp-object-oriented-design-maintaining-有効なオブジェクトの状態
EDIT2:@ eignesheepの答えは最高ですが、この答え- /software//a/148109/208591は - 、コードは処理しなければならない- @ eigensheepの答えと私は知りたいと思ったの間に線を埋めるものですグローバル状態は、オブジェクト間でのDI対応状態の受け渡しに置き換える必要があります。