Je suis en train de développer un panier en php à la suite de POO et de DDD. J'ai une classe ShoppingCart agissant comme collection pour différents types d'instances CartItem (Type1ProductItem, Type2ProductItem, etc.), toutes implémentant une CartItemInterface.POO - gérer un identifiant unique dans une collection
Qu'en est-il de la meilleure façon de gérer l'identifiant unique à utiliser comme clé dans la collection interne de la Boutique?
Ma solution actuelle est une méthode "getPrimaryKey()" dans CartItemInterface retournant un identifiant unique basé sur le type et id:
ShoppingCart:
public function add(CartItemInterface $CartItem) {
$this->items[$CartItem->getPrimaryKey()] = $CartItem;
}
public function remove(CartItemInterface $CartItem) {
unset($this->items[$CartItem->getPrimaryKey()]);
}
résultant en:
ShoppingCart->add($CartItem);
ShoppingCart->doSomething($CartItem);
Mais de cette façon, je dois créer un CartItem avant chaque action sur le chariot (ajouter, supprimer, mettre à jour ..), en fonction des paramètres de l'uri, et ensuite le passer à la méthode appropriée de 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);
Ce n'est pas un grand problème que je peux utiliser une usine pour éviter la logique dupliquée, mais il sera une solution plus réalisable si l'identifiant unique (UID) a été créé en dehors des instances de CartItem et passé à ShoppingCart la première fois qu'un article est ajouté?
ShoppingCart->add($UID, CartItemInterface $CartItem);
ShoppingCart->doSomething($UID); // no need of CartItem instance here
Je ne sais pas si c'est bien que l'UID soit géré en dehors des instances de CartItem. Que pensez-vous? Quels sont les avantages et les inconvénients des solutions? Merci beaucoup.
Passez le '$ UID' à l'usine. Il devrait l'utiliser pour initialiser le champ 'PK' des objets' CartItemInterface' qu'il crée. Ne modifiez pas l'interface du 'ShoppingCart'. – axiac
Pourquoi avez-vous besoin de passer un 'CartItemInterface' à' add'? Pourquoi ne transmettez-vous pas les propriétés nécessaires telles que productId, productType, quantity et price? –
Je pense que vous n'avez pas besoin de la clé primaire cartItem à l'intérieur de la classe shoppingCart. Pourquoi ne pas simplement faire $ this-> items [] = $ CartItem; Je pense que le cartItem devrait être un objet de valeur puisqu'il s'agit juste d'une description d'un élément et non de l'élément lui-même. Donc, il n'a pas vraiment besoin d'un ID –