组成或继承

时间:2016-04-20 21:06:45

标签: php inheritance design-patterns composition

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()方法。第一个类有一个它需要的依赖,一些内部逻辑决定而另一个更简单。

2 个答案:

答案 0 :(得分:2)

继承是一种语义关系。不是作文。一个常见的错误是使用继承而不是组合来分解代码。

只看Liskov substitution principle

答案 1 :(得分:1)

我认为你应该从概念上思考这段代码。这些课程之间有什么关系?它是是 - 关系还是有 - 关系?

如果你可以说DoSomethingGood DoSomething,那么继承很好地反映了这一点。您可以让继承者替换继承的类和适当的多态。应用程序的其余部分将顺利运行,因为它反映了您对此的看法。

如果您可以说DoSomething DoSomethingGood,那么您应该使用合成。特别是如果你能有很多 DoSomethingGood。同样,如果这在概念上是正确的,那么代码的其余部分也很容易编写。

有时看起来你可以对两者说“是”并且线条模糊,但你应该在概念层面考虑它,而不是在代码层面。特别是如果你想要理解模式而不仅仅是“代码重用”,这是一种推理继承的微小方法。

当你选择错误时,编码会变得麻木,反直觉,不必要的复杂或不可能(矛盾)。如果发生这种情况,请回到绘图板并重新考虑您的选择。

那就是说,你几乎是唯一可以说出你的想法和你想做的事情的人。如果你使用像DoSomethingGood这样的名字,那就太模糊了。

当您说CatDogAnimal时,这会容易得多。在这里可以很容易地说出要使用的内容(断言“Cat Animal”在直觉上是正确的。)