Oop 基于多个参数创建不同的对象
我有一个RESTAPI。我需要创建presentation(DTO)对象,但是这个对象的构造取决于请求-它有15%的不同。 我想知道我应该用什么图案 我的情况是:Oop 基于多个参数创建不同的对象,oop,design-patterns,Oop,Design Patterns,我有一个RESTAPI。我需要创建presentation(DTO)对象,但是这个对象的构造取决于请求-它有15%的不同。 我想知道我应该用什么图案 我的情况是: //presentation-DTO class Item { private $name; private $price; private $tags; private $liked; //is Liked by logged user ... public function __c
//presentation-DTO
class Item {
private $name;
private $price;
private $tags;
private $liked; //is Liked by logged user
...
public function __construct(Item $item, bool $liked, ...)
{
$this->name = $item->getName();
$this->price = $item->getPrice();
$this->tags = $item->getTags();
$this->liked = $liked;
...
}
}
当用户未登录时-我不需要$
显示项目列表时-我不需要$tags
还有更多的属性可以像上面那样工作
我的第一个想法是使用生成器原理
$itemBuilder = new ItemBuilder();
$itemBuilder->setItem($item);
...
if($user) {
$itemBuilder->setUserLiked($userLiked);
...
}
return $itemBuilder->build();
它解决了构造函数中参数太多的问题
但是,我仍然不需要构造所有的参数——例如,我不需要标签(在列表上)。由于我使用延迟加载,我不希望dto构造函数调用它们
所以我想,也许是工厂。。但是我的问题是太多(可选)参数返回
您将如何解决这一问题?对不起,我没有必要的要点来发表评论,因此没有答案 您想用
项类做什么。您的类是Item
,第一个参数也是Item
类型。我无法想象它将如何运作
我更愿意保持业务登录,以便在单独的类中设置适当的属性:
/**
* A class for business logic to set the proper properties
*/
class ItemProperties {
private $item;
public $isLogin = false;
public $showList = false;
.....
public function __construct(Item &$item) {
// set all properties;
}
public function getProperties() {
$retVal = [];
if($this->isLogin == true) {
$retVal['liked'] = true;
}
if($this->showList == true) {
$retVal['tags'] = $this->item->getTags();
}
if(....) {
$retVal['...'] = $this->item->.....();
}
return $retVal;
}
}
/**
* DTO
*/
class Item {
public function __construct(ItemProperties $itemProps) {
$this->setItemProps($itemProps);
}
// If you prefer lazy loading here...maybe make it public
// and remove call from constructor.
private function setItemProps(&$itemProps) {
$properties = $itemProps->getProperties();
foreach($properties AS $propName => $propValue) {
$this->$propName = $propValue;
}
}
}
// Usage:
$itemProps = new ItemProperties($Item);
// set other properties if you need to...
$itemProps->isLogin = false;
$item = new Item($itemProps);
当用户未登录[1]时,您不想将$liked
作为参数传递给构造函数吗?或者[2]可以将$liked
作为参数传递给构造函数,但您不想调用$this->liked=$item->getLiked()
自用户未登录时起-我不需要$code>。再解释一下,有两种情况。[a] 有关$liked的信息来自单独的数据。我无法从$item对象获取它们-需要将它们作为参数传递。[b] 有关$tokes的信息来自$item对象,但我不希望在构造函数中调用它们,因为我不需要它们。因此,在案例[a]中,我不想通过它们[1]。以防万一,我不想给他们打电话。在bot的情况下,如果我不需要这些属性,我不想在dto对象中包含这些属性。您很了解这一点。Item类是DTO,它获取Item属性,即ORM实体。感谢您的回答,它给了我一个全新的视角。只有一个想法需要重新考虑。在您的解决方案中,ItemProperties类的工作方式类似于构建器(存储创建对象所需的信息),而且它还存储有关对象将具有哪些属性的信息,因此它有多个职责。我认为,ItemProperties类应该只存储数据并验证是否设置了正确的类型。。。应该有不同的类来确定DTO将具有哪些属性。另外,getProperties方法将很难保持简单并对其进行开发。