interface DoSomething
{
public function do();
public function getId();
}
class DoSomethingGood implements DoSomething
{
private $dependency;
private $id;
public function __construct($id, $dependency)
{
$this->dependency = $dependency;
$this->id = $id;
}
public function do()
{
if ($this->dependency->isActive()) {
return true;
}
return false;
}
public function getId()
{
return $this->id;
}
}
class DoSomethingBad implements DoSomething
{
private $id;
public function __construct($id)
{
$this->id = $id;
}
public function do()
{
return false;
}
public function getId() {
return $this->id;
}
}
我应该在这里使用作文还是继承会更好?不同之处在于这些类如何实现do()
方法。第一个类有一个它需要的依赖,一些内部逻辑决定而另一个更简单。
答案 0 :(得分:2)
继承是一种语义关系。不是作文。一个常见的错误是使用继承而不是组合来分解代码。
答案 1 :(得分:1)
我认为你应该从概念上思考这段代码。这些课程之间有什么关系?它是是 - 关系还是有 - 关系?
如果你可以说DoSomethingGood
是 DoSomething
,那么继承很好地反映了这一点。您可以让继承者替换继承的类和适当的多态。应用程序的其余部分将顺利运行,因为它反映了您对此的看法。
如果您可以说DoSomething
有 DoSomethingGood
,那么您应该使用合成。特别是如果你能有很多 DoSomethingGood
。同样,如果这在概念上是正确的,那么代码的其余部分也很容易编写。
有时看起来你可以对两者说“是”并且线条模糊,但你应该在概念层面考虑它,而不是在代码层面。特别是如果你想要理解模式而不仅仅是“代码重用”,这是一种推理继承的微小方法。
当你选择错误时,编码会变得麻木,反直觉,不必要的复杂或不可能(矛盾)。如果发生这种情况,请回到绘图板并重新考虑您的选择。
那就是说,你几乎是唯一可以说出你的想法和你想做的事情的人。如果你使用像DoSomethingGood
这样的名字,那就太模糊了。
当您说Cat
,Dog
和Animal
时,这会容易得多。在这里可以很容易地说出要使用的内容(断言“Cat
是 Animal
”在直觉上是正确的。)