在这种情况下使用特征而不是继承或组合来重用代码有多糟糕?

时间:2016-06-17 20:21:12

标签: php inheritance composition traits

我有一组扩展泛型类的服务,它提供了它们之间的一些常用功能。

这些服务中的一个特定组合有一个共同点:它们在API中使用特定资源,因此它们有许多共同的代码(连接到API并执行一些GET或POST,使用API要求,基本上改变端点和要传递的参数数量。

我的问题是,在特征上抽象这个代码是不是很糟糕?并将其重用于需要使用该特定代码的任何服务?

以下是一些例子:

trait ApiResource {
    public function retrieve()
    {
        try {
            // apply logic of the resource
        } catch (\Exception $e) {
            return false;
        }
    }
}

class Departments extends Generic {
    use ApiResource;

    public function createCache(Cache $cache)
    {
        $cache->storeDepartments($this->retrieve('departments', 200));
    }
}

class Brands Generic {
    use ApiResource;

    public function createCache(Cache $cache)
    {
        $cache->storeBrands($this->retrieve('brands'));
    }
}

1 个答案:

答案 0 :(得分:2)

将其作为一种特质包括在内并不是错误(双关语),但我认为它更有意义,因为它是Generic延伸的抽象类,甚至是仅包含在Generic中。

据推测,此方法适用于您的所有ApiResources,但适用于您的ApiResources - 它不会被用于任何ApiResource其他课程。所以for应该正常继承它。

Traits通常用于一个类来继承来自多个源的方法或多个不相关的类来继承该方法 - 在这里似乎都不是这种情况。我发现很少有特征适合的情况,而且这似乎不是其中之一。