Php 在这种情况下,使用特征而不是继承或组合来重用代码有多糟糕?
我有一组扩展泛型类的服务,泛型类提供了它们之间的一些公共功能 一组特定的服务有一个共同点:它们在API中使用特定的资源,因此它们有很多共同的代码(连接到API并执行一些GET或POST,应用API要求,基本上更改端点和要传递的参数数量) 我的问题是,根据一个特性抽象这个代码是不是不好?并在需要使用特定代码段的任何服务上重用它 下面是一些例子:Php 在这种情况下,使用特征而不是继承或组合来重用代码有多糟糕?,php,inheritance,composition,traits,Php,Inheritance,Composition,Traits,我有一组扩展泛型类的服务,泛型类提供了它们之间的一些公共功能 一组特定的服务有一个共同点:它们在API中使用特定的资源,因此它们有很多共同的代码(连接到API并执行一些GET或POST,应用API要求,基本上更改端点和要传递的参数数量) 我的问题是,根据一个特性抽象这个代码是不是不好?并在需要使用特定代码段的任何服务上重用它 下面是一些例子: trait ApiResource { public function retrieve() { try {
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'));
}
}
把它作为一个特性包含进来并不是天生的错误(双关语的意思),但我认为它作为一个抽象类(通过
Generic
扩展,甚至只是包含在Generic
中)会更有意义
假设此方法将应用于所有ApiResources
s,但它只适用于ApiResources
——它不会用于任何其他类。因此,ApiResource
s应该正常地继承它
特征通常用于一个类继承来自多个源的方法,或者用于多个不相关的类继承该方法——这里的情况似乎都不是这样。我看到很少有人认为性格有好处,而这似乎不是其中之一。事实并非如此。Trait是一种语言辅助的复制粘贴。以你想要的方式使用它没有什么错。这是一个基于观点的问题,所以我相信它处于如此允许的边缘。话虽如此,我很少发现特质是个好主意,尽管确实存在例外。在我看来,对象组合将是更好的选择。某种ApiConnector,可以位于ApiResources的属性内,用于与API的实际通信。