我们花了一些时间在今天的工作中讨论这个话题,我想我需要听一些其他的意见。
我们讨论的出发点是设计某种订单类 - 即
class order {
private $productList;
public function __construct()
//some kind of constructor
}
public function getProductList()
{
return $this->productList;
}
}
因此订单对象包含一个抽象产品清单(基本上是产品集合),我们可以在其上执行某些操作/批量操作(即获得所有产品的总金额,获得总税收等)。到目前为止,我们都同意这个设计。但是,当实际建立这个订单列表时,我们 - 让我们说 - 不同意:)
我会这样开始的:
class productList {
/** @var array */
private $productList;
public function add(Product $product)
{
$this>-productList[] = $product;
}
}
还有一个使用工厂的想法:
class ProductListFactory {
private $productRepository;
public function __construct(ProductRepository $productRepository)
{
$this->productRepository = $productRepository;
}
public function createFromOrderNumber($orderNumber)
{
$products = $this->productRepository->getAllProdctsForOrder($orderNumber);
return new ProductList($products);
}
}
class ProductList {
/** @var array */
private $products;
public function __construct(array $products)
{
$this->products = $products;
}
}
我可以看到在这里使用工厂的“魅力”,而不允许从“外部”向列表中添加新产品。但不知怎的,这对我来说并不合适。也许任何人都可以在这一点上启发我:)谢谢!
答案 0 :(得分:1)
我认为,在您的情况下,工厂方法可能更优越,因为您正在与团队合作。如果它只是你,只要你的代码是合理的,那么以对你最有意义的方式编写它是有意义的。然而,在与团队合作时,您正在与不同的思维者合作,每个人都对如何完成某些事情有不同的想法。尝试对在这种情况下编写的代码进行版本化,重新分解和扩展,但没有定义的方法,可能会导致各种类型的头发拉动方案。当然,您可以为您建议的方法定义方法,但工厂方法是经过验证的方法,会迫使人们编写符合某些期望的代码。它本质上是有序的,并且本质上是可扩展的。如果我是你,我会在这种情况下顺从我的队友。
答案 1 :(得分:0)
可以推动您选择的是一种设计或另一种设计允许您轻松测试代码的方式。 可以使用productRepository mock注入ProductListFactory,因此它是测试的好点。
PS:我希望你没有代码添加这样的功能,否则你肯定会感到失望;)
$ this> -productList [] = $ product;