OOPとDDDの後にPHPでショッピングカートを作成しています。 CartItemInterfaceを実装しているCartItemインスタンスのさまざまなタイプ(Type1ProductItem、Type2ProductItemなど)のコレクションとして動作するShoppingCartクラスがあります。OOP - コレクション内の一意の識別子を管理する
ShoppingCartの内部コレクションのキーとして使用する一意の識別子を管理する最適な方法はありますか?
私の現在のソリューションは、タイプおよびIDに基づいて一意の識別子を返すCartItemInterfaceにおける "getPrimaryKey()" メソッドである:
するShoppingCart:
ShoppingCart->add($CartItem);
ShoppingCart->doSomething($CartItem);
:その結果
public function add(CartItemInterface $CartItem) {
$this->items[$CartItem->getPrimaryKey()] = $CartItem;
}
public function remove(CartItemInterface $CartItem) {
unset($this->items[$CartItem->getPrimaryKey()]);
}
しかし、この方法では、カートのすべてのアクション(add、remove、update ..)の前に、uriのパラメータに応じてCartItemを作成してから、関連するメソッドに渡す必要がありますShoppingCartの:
// type and id coming as parameters
switch ($type) {
case 1 : $CartItem = new Type1ProductItem($id); break;
case 2 : $CartItem = new Type2ProductItem($id); break;
....
}
ShoppingCart->doSomething($CartItem);
これは私が重複したロジックを避けるために、工場を使用することができますよう大きな問題ではありませんが、一意の識別子(UID)がCartItemインスタンスの外に作成され、渡された場合、それはより実現可能なソリューションとなります最初に商品が追加されたときにShoppingCartに追加しますか?
ShoppingCart->add($UID, CartItemInterface $CartItem);
ShoppingCart->doSomething($UID); // no need of CartItem instance here
uidがCartItemインスタンスの外部で管理されているかどうかはわかりません。 あなたはどう思いますか? ソリューションの長所と短所は何ですか? ありがとうございます。
'$ UID'を工場に渡します。作成した 'CartItemInterface'オブジェクトの' PK'フィールドを初期化するために使用します。 'ShoppingCart'のインターフェースを変更しないでください。 – axiac
なぜ 'CartItemInterface'を' add'に渡す必要がありますか? productId、productType、quantity、priceのような必要なプロパティを渡すのはなぜですか? –
shoppingCartクラスの中にcartItemの主キーは必要ないと思います。 なぜ単純に$ this-> items [] = $ CartItemを実行しないのですか? 私はcartItemは値オブジェクトでなければならないと思います。なぜなら、itemItemはアイテムの説明であり、アイテム自体ではないからです。それで本当にIDが必要ないのです –