Iniezione di dipendenza e istanziazione in classe | Limiti pratici

4

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?

    
posta Marvin 11.03.2016 - 11:06
fonte

1 risposta

2

Should I instantiate value & collection objects with factories [..].

No, in genere la creazione di oggetti valore è molto semplice e non c'è bisogno di fabbriche.

Al massimo utilizzerai un qualche tipo di costruttore statico, come Denaro :: fromString () che istanzia l'oggetto valore e le dipendenze necessarie.

[..] and injected dependencies or should I instantiate in-class

Dipende da un caso d'uso. Rimangono con il Money summenzionato - potresti avere un caso d'uso in cui hai solo una somma di denaro e Currency è preso da una fonte diversa. In tal caso, si inserisce Currency in Money costruttore con numero intero.

Potrebbe esserci anche il caso che tu abbia una stringa contenente l'importo con il codice valuta, e quindi useresti Money::fromString che creerà internamente Currency di istanza per te.

Lo stesso vale per le collezioni - ci saranno situazioni, in cui alcune raccolte verranno istanziate in classe e poi iniettate, solo perché è più semplice aspettarsi un'interfaccia specifica rispetto alla matrice di oggetti valore che devono essere convalidati.

    
risposta data 06.04.2016 - 16:48
fonte

Leggi altre domande sui tag