给出一个课程:
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和$折扣怎么办?没有多重继承
答案 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