web-dev-qa-db-ja.com

依存性注入:単一インスタンスオブジェクトに対してのみ?

アプリケーションをProductやUserなどのクラスから分離したい場合はどうなりますか? (通常、複数のインスタンスがあります)

この例を見てください:

class Controller {
    public function someAction() {
        $product_1 = new Product();
        $product_2 = new Product();
        // do something with the products
    }
}

コントローラが製品に依存していると言うのは正しいですか?

それらを分離することもできると考えていました(データベースなどの単一インスタンスオブジェクトの場合と同様)

この例では、醜いですが、分離されています。

class Controller {
    public function someAction(ProductInterface $new_product) {
        $product_1 = clone $new_product;
        $product_2 = clone $new_product;
        // do something with the products
    }
}

誰かが以前にこのようなことをしましたか?過剰ですか?

5
HappyDeveloper

ユニットテストと抽象化レイヤーの真の力について初めて知ったとき、すべてにインターフェイスを設定したいと思いました。そして、私はしました。そして、私はすぐに「遠すぎる」ことを知りました。

あなたが製品のサブタイプを扱っていないと仮定すると、あなたの分離に絶対に利益はありません。達成することは、製品のインターフェースに加えた変更を複製する必要がある別の場所を作成することです。

とはいえ、ここで描くことになるのは、単一インスタンスクラスと複数インスタンスクラスの間にあるとは思いません。しかし、それは、必要がない限り、単一インスタンスにするのが好きではないためかもしれません。コントローラーとデータベースは、私の考えでは良い例ではありません。

抽象化が必要になるまで抽象化しないことを選択します(ただし、適切にユニットテストを行っている場合は、ドメインオブジェクト以外のすべてで抽象化がおそらく必要になります)。そして、それが単一インスタンスになる必要があるまで、クラスを複数インスタンスにすることを選択します。

2
pdr