2016-06-17 8 views
3

필자는 generic 클래스를 확장하는 서비스 집합을 가지고 있는데, 이들간에 공통된 기능을 제공합니다.코드를 재사용하기 위해 상속 또는 합성 대신 특성을 사용하는 것이 얼마나 좋지 않습니까?

이러한 서비스의 특정 그룹은 공통점이 한 가지 있습니다. 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

아니요. 특성은 언어 보조 copypaste입니다. 원하는대로 사용하는 데는 문제가 없습니다. –

+3

이것은 상당히 의견을 바탕으로 한 질문이므로 SO가 허용하는 것의 가장자리에 있다고 생각합니다. 즉, 나는 예외가 존재하기는하지만 형질이 좋은 아이디어는 거의 찾지 못한다고합니다. Object Composition이 더 나은 선택이 될 것입니다. ApiConnector의 일종으로 ApiResources의 속성 내부에있을 수 있으며 API와의 실제 통신에 사용됩니다. – Pevara

답변

2

가 아닌 본질적으로 잘못된 (말장난 의도),하지만 난 Generic가 확장되는이 추상 클래스 중 하나로 더 나을 생각이나 심지어는 Generic에 포함됩니다.

는 아마도이 방법은 ApiResources의 모두에 적용됩니다,하지만 에만 이제까지 당신의 ApiResources에 적용됩니다 - 그것은 다른 클래스에 사용되지 않습니다. 따라서 ApiResource은 정상적으로 상속되어야합니다.

특성은 일반적으로 하나의 클래스에서 여러 소스 또는 여러 비 관련 클래스의 메서드를 상속하여 메서드를 상속하는 데 사용됩니다. 어느 쪽도 여기에 해당하지 않습니다. 나는 형질이 좋을 때가 거의 없다는 것을 보았는데, 그 중 하나가 아닌 것 같습니다.