Iniezione di dipendenza: solo per oggetti a istanza singola?

4

Che cosa succede se voglio disaccoppiare anche la mia applicazione, da classi come Product o User? (che di solito hanno più di un'istanza)

Dai un'occhiata a questo esempio:

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

È giusto dire che il controller ora dipende dal prodotto?

Stavo pensando che potremmo disaccoppiare anche loro (come faremmo con oggetti a istanza singola come Database)

In questo esempio, per quanto brutti, sono disaccoppiati:

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

Qualcuno ha mai fatto qualcosa del genere? È eccessivo?

    
posta HappyDeveloper 13.11.2011 - 21:03
fonte

1 risposta

2

Quando ho appreso per la prima volta dei test unitari e del potere reale dei livelli di astrazione, volevo mettere un'interfaccia su tutto. E l'ho fatto. E ho imparato molto rapidamente che c'è un "troppo lontano".

Supponendo che tu non abbia a che fare con sottotipi di prodotti, non c'è assolutamente alcun vantaggio per il tuo disaccoppiamento. Tutto ciò che ottieni è creare un altro posto in cui devi replicare qualsiasi modifica apportata all'interfaccia del Prodotto.

Detto questo, non penso che la linea che selezionerei qui sia tra classi a istanza singola e classi a istanze multiple. Ma ciò potrebbe essere dovuto al fatto che non mi piace creare oggetti a istanza singola a meno che non debbano esserlo - i controller e i database non sono dei buoni esempi, secondo me.

Scegli di non avere un'astrazione finché non ne hai bisogno (anche se, se fai un test unitario, probabilmente ne avrai bisogno uno su tutti tranne gli oggetti del dominio). E scegli di creare un'istanza multipla di classe finché non ha bisogno di essere a istanza singola.

    
risposta data 14.11.2011 - 01:59
fonte