【问题标题】:Single Responsibility / Separation of Concerns PHP [closed]单一职责/关注点分离PHP [关闭]
【发布时间】: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


【解决方案1】:

我认为在您的情况下,工厂方法可能会更好,因为您正在与一个团队合作。如果只有你,只要你的代码是合理的,以对你最有意义的方式编写它是有意义的。然而,在与团队合作时,您会与不同的头脑一起工作,每个人对如何做某事都有不同的想法。尝试对在这种情况下编写但没有定义方法的代码进行版本化、重构和扩展,可能会导致各种令人毛骨悚然的情况。当然,您可以为您建议的方法定义一种方法,但工厂方法是一种经过验证的方法,它将迫使人们编写符合某些期望的代码。它本质上是有序的,本质上是可扩展的。如果我是你,我会在这种情况下听从我的队友。

【讨论】:

  • 我认为你是对的。也许就这么简单。
【解决方案2】:

促使您做出选择的因素是一种或另一种设计允许您轻松测试代码的方式。 ProductListFactory 可以注入 productRepository 模拟,因此这是一个很好的测试点。

PS:我希望你没有像这样编写你添加函数的代码,否则你肯定会失望;)

$this>-productList[] = $product;

【讨论】:

  • 可以说另一种方法也很容易用于测试。这完全取决于您在方法中输入的内容。
  • :) 这不是生产代码,甚至不是复制粘贴代码——我只是想用一些简单的例子来解决问题。你是对的测试 - 但我不会测试工厂 - 我会用一系列模拟产品实例化 ProductList ...
猜你喜欢
  • 2010-12-16
  • 2019-06-30
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2011-12-27
  • 2014-04-27
  • 2012-05-24
相关资源
最近更新 更多