【发布时间】:2014-03-04 18:28:03
【问题描述】:
我们今天在工作中就这个话题争论了一段时间,我想我需要听听其他意见。
我们讨论的起点是设计某种订单类 - 即
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;
}
}
我可以在这里看到使用工厂的“魅力”,并且不允许从“外部”将新产品添加到列表中。但不知何故,这对我来说感觉不对。也许任何人都可以在这一点上启发我:) 谢谢!
【问题讨论】:
-
没有办法以任何不归结为“意见”的方式回答这个问题。一个人可能会去 meta 并争辩说为一个“小”类项目构建一个完整的对象也是矫枉过正,使整个问题变得毫无意义。
-
取决于项目是否是长期的。如果它是长期的,我会选择工厂,因为它可以让你改变事情而不必改变太多。假设您想构建一些不同的东西。就像 Marc B 说的那样,这是一种意见。
标签: php oop separation-of-concerns