依赖注射不会伤害SRP吗?

时间:2015-08-29 11:23:12

标签: php dependency-injection

给出一个课程:

class Cart
{
    private $items;

    public function add (Product $item)
    {
        $this->items[] = $item;
    }

    public function clear()
    {
        $this->items = array();
    }
}

这很酷。但是为了进行测试,我们可以更改项目:

class Cart
{
    private $items;

    public function add (Product $item)
    {
        $this->items[] = $item;
    }

    public function clear()
    {
        $this->items = array();
    }

    public function setItems ($items)
    {
        $this->items = $items;
    }

    public function getItems()
    {
        return $this->items;
    }
}

但我认为它不是一个很好的解决方案,因为getItems,setItems并不真正与类本身相关。当然,我可以写下:

class Cart extends DI
{
    protected $items;

    public function add (Product $item)
    {
        $this->items[] = $item;
    }

    public function clear()
    {
        $this->items = array();
    }
}

class DI
{   
    public function setItems ($items)
    {
        $this->items = $items;
    }

    public function getItems()
    {
        return $this->items;
    }
}

但如果我还有$ items和$折扣怎么办?没有多重继承

1 个答案:

答案 0 :(得分:1)

附注:使用子类的受保护变量来创建具有函数的超类通常是不好的做法,因为继承应该只采用一种方式,并且这种方式是向下的,永远不会向上。如果有人创建DI类然后调用setItems或getItems函数怎么办?麻烦!不要练习最后一个代码示例。

我的回答:

Setters / Getters是相关的,因为Cart负责为$ items提供功能。我看到它的方式,你没有使用DI违反SRP,因为你所做的只是在发送之前定义类外的依赖,给$ item没有理由改变并且不承担任何责任。在这种情况下,您的第二个代码示例是正确的解决方案

你的第三个例子违反了SRP,因为Cart类与DI类共享$ items的责任。

一些链接:

有关依赖注入的更多信息,请参阅此文章: http://tutorials.jenkov.com/dependency-injection/dependency-injection-benefits.html

SRP:https://en.wikipedia.org/wiki/Single_responsibility_principle