2016-06-17 1 views
3

私はジェネリッククラスを拡張する一連のサービスを持っています。これらのサービスは共通の機能を提供します。コードを再利用するために継承または合成の代わりに形質を使用するのはどれほど難しいでしょうか?

これらのサービスの特定のグループは、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

これはありません。特性は、言語支援の複写機能です。あなたがしたいようにそれを使用することで何も問題はありません。 –

+3

これはかなり意見に基づいた質問ですので、私はそれがSOが許すところの端にあると信じています。それは、例外が存在するにもかかわらず、私はほとんど特性を見つけることができないと言われています。オブジェクトの構成がここではより良い選択肢になると私は思っています。あなたのApiResourcesのプロパティ内にあり、APIとの実際の通信に使用できるApiConnectorのいくつかの並べ替え。 – Pevara

答えて

2

形質は、本質的に間違った(しゃれが意図した)ではありませんが、私はそれがGenericが延びていることにより、抽象クラスのいずれかのように、より理にかなって考えたりなどちょうどGenericに含まれています。

はおそらくこの方法は、あなたのApiResources秒のすべてに適用されますが、それはだけで今までにApiResourcesに適用されます - それは他のクラスのために使用されることはありません。だから、ApiResourceはそれを普通に継承するべきです。

一般に、特性は1つのクラスで複数のソースまたは複数の無関係なクラスのメソッドを継承してメソッドを継承するために使用されますが、どちらの場合もそうではありません。私は、形質が良好であるケースはほとんどみられておらず、これはそのようではないようです。

関連する問題