2017-08-19 1 views
0

私は「すべての」クラスの依存関係を読んで依存性の注入について学んを注入する必要があります(今のところのインターフェイスを無視してみましょう)クラス内の値オブジェクト内での処理方法

最近値オブジェクトの代わりに、(レポさんなど以内)准アレイ、私が読んでいるほとんどのチュートリアルを使用してにシフトクラスメソッド内の値オブジェクトをインスタンス化する(依存性注入なし)これは値オブジェクトにとって大したことではありませんが、なぜこのパスが選択されたのか、リポジトリに依存性注入が行われ、

私はマイクロを最適化しようとしているわけではなく、主にベストプラクティスを習得して学んでいます。

私が考えているのは、値のオブジェクトデータのコンストラクタインジェクションだけですが、クローン作成後にコンストラクタを呼び出すことができないのでしょうか?

例:

class Repo { 
    public function getUser() { 
     return new UserValueObject($userDataProvidedByDB); 
    } 
} 

VS

class Repo { 

    public function __construct(UserValueObject $user) { 
     $this->user = $user; 
    } 

    public function getUser() { 
     return (clone $this->user)->__construct($userDataProvidedByDB); 
    } 
} 
+0

値オブジェクトには、アプリケーションの残りの部分が使用するプロパティ(可能なコンストラクタ、ゲッター、セッターを除く)のみが含まれている必要があります。別の値オブジェクトに異なるプロパティセットを注入すると、アプリケーションはいずれかの方法で失敗する可能性が高くなります。 –

+0

空のユーザー '値オブジェクト'/'エンティティ'にはdbのデータが入力され、repoによって返されます。レポを作成するときに、 'User'クラスのクリーンなインスタンスが注入されるので、各クローンはレポ内でインスタンス化されているかのように空になります。ここでの本当の違いは、レポコンストラクタにクリーンなエンティティを注入することだけです。 (私が間違っていない限り) – ICJ

+0

それを分解しましょう。 ** 1。**レポは、常に同じプロパティセットを持つオブジェクトを返す必要があるため、アプリケーションの残りの部分にはその内容が分かります。 ** 2。**値オブジェクトにはビジネスロジックが含まれていません。値オブジェクトはそのプロパティに値を格納するだけです(少なくとも必要があります)。 **結論**、値オブジェクトを嘲笑/変更する(別の値オブジェクトをコンストラクタに送る)ことは、値オブジェクトを使用するすべてのコードを変更する必要があることを意味します(ただし、なぜそれを変更するのですか?)新しいプロパティを使用すると、DIはその目的を失いました –

答えて

0

限り読みながら、私はあなたの質問を理解して、それが、(newはクラスの内部で-ingていないオブジェクトをinstaniatingの問題の詳細ですより正確に)。

多くの場合、Repositoryの内部でオブジェクトをインスタンス化することはかなり受け入れられます。理由だけで

これが最も単純な場合のために大した

ではなく、(その後、またはsomewhen程度)最新のものに実装されているすべてのことデシベルのものを持つ、あなたはすでにそのクラスを持っていますRepositoryは実装された状態に戻っています。これにより、返されるクラスの障害のためにRepositoryのテストが失敗しないようになり、これらのテストはユニットよりも機能的/統合的になります。

しかし、もっと複雑なケースがあるかもしれません。 1つの例は、クラスが返されたとき(あなたの質問をすればUser)、いくつかの豊富な振る舞いを持つことになっていて、コンストラクタを介して注入されるいくつかのサービスを使います。それにより、Repositoryは無関係なものについてあまりに多くの知識を持つようになり、Userをインスタンス化することができます。もう1つの例は、開発者がRespositoryが取得するデータで何がどのようにインスタンス化されるかについての知識がない場合です。

このような状況では、このような無関係の知識や機能をすべてクラスから除外し、そのジョブに対してRepositoryに注入するオブジェクトをいくつか残さなければなりません。だから、UserFactoryInterfaceの具体的な実装は、Userは、DBからの生データを有し、かつ自分自身で何かを管理作成する方法を知っている

interface UserFactoryInterface 
{ 
    public function makeUserFromRawArray(); 
} 


class Repo 
{ 
    private $factory; 

    public function __construct(UserFactoryInterface $factory) { 
     $this->factory = $factory; 
    } 

    public function getUser() { 
     return $this->factory->makeUserFromRawArray($userDataProvidedByDB); 
    } 
} 

:だから、のようになめらかに見ることができます。 Repositoryは依存してはならないものに依存せず、外部から作成するサービスを取得するだけです。

は再び、私は質問には、オブジェクトをinstatiatingし、具体的には約Value objects私はむしろあなたが投稿する場合にDTOかさえLocalDTO respectivlyに名前を付けたいものではなく懸念の分離の問題の詳細である信じ。