L'inversione delle dipendenze è buona
L'inversione della dipendenza è buona, ovvero:
- Semplifica i test unitari
- Riduce l'accoppiamento, consentendo l'uso intercambiabile dei componenti software
- Mantiene la logica di istanziazione per un dato oggetto in meno punti, impedendo il codice ripetitivo.
Per questi motivi, evito di creare istanze di oggetti all'interno delle classi; preferendo invece passare nelle classi di fabbrica come dipendenza. Tuttavia, mi chiedo se questo è eccessivo per alcuni tipi di oggetti.
Sono eccezioni agli oggetti valore?
Gli oggetti valore sono, per definizione, oggetti semplici con una costruzione semplice.
Nella mia esperienza, raramente c'è qualche complicazione nella logica di istanziazione, il test unitario non è compromesso poiché gli oggetti valore possono essere considerati come qualsiasi altro tipo di dati, e l'accoppiamento non è un problema perché tutte le classi devono fare affidamento sui tipi di dati di qualche descrizione (avvertenza, vedi La mia preoccupazione ).
Anche oggetti collezione?
Un caso associato speciale è quello degli oggetti di raccolta.
La mia opinione è che gli oggetti della collezione, come gli oggetti valore, non richiedono alcuna creazione reale. Sono, in effetti, una forma specializzata di array; un oggetto valore.
Esempio:
class PencilCase
{
private $pencils=[];
public function construct()
{
// blah blah
}
public function emptyPencils()
{
$pencils = $this->pencils;
$this->pencils = [];
return new PencilsCollection($pencils);
}
}
class PencilsCollection implements \Traversable
{
public function __construct($pencils=[])
{
// blah blah
}
}
La mia preoccupazione
In generale ho evitato questo tipo di accoppiamento perché potrei voler cambiare il pacchetto che fornisce alcuni dei tipi di dati utilizzati; nell'esempio sopra posso utilizzare un oggetto valore fornito da Dixon
e quindi passare a quelli forniti da Staedtler
.
Questo tipo di refactoring potrebbe essere costoso.
Domanda
Devo istanziare il valore e amp; oggetti di raccolta con fabbriche e dipendenze iniettate o dovrei istanziare in classe?