Iniezione di dipendenza

6

Ho letto da qualche parte che è meglio passare un oggetto nel costruttore piuttosto che istanziarlo in esso.

Quindi invece di

public function __construct() {
    $this->user = new User();
    // more stuff...
}

Dovrei fare

public function __construct($user) {
    $this->user = $user;
    // more stuff...
}

Ma poi quello che succede è qualcosa del genere:

$user = new User();

// generate routes...

$router->get('/article', function() use ($user)) {

    $page = new Views\ArticlePage($user);
    // more stuff...
}

E la mia domanda è cosa succede quando il codice come sopra è annidato, e stiamo iniettando molte più dipendenze. Il codice finisce per essere più difficile da capire.

$router->get('/article', function() use ($router, $db, $user, $request, $and, $more, $stuff, $needed)) {

    $page = new Views\ArticlePage($view , $db, $user);
    // do more things....
}

Che cos'è un rimedio a questo? O quando diventa ok creare nuovi oggetti (se mai è così)

    
posta St0mX 22.05.2017 - 03:02
fonte

2 risposte

2

La soluzione è schemi di creazione .

Sei libero di utilizzare tutti gli strumenti nella tua lingua per semplificare la costruzione. La costruzione non deve essere codice procedurale piatto in main. È possibile utilizzare fabbriche, builder, oggetti parametri e altro.

È possibile creare oggetti con valori predefiniti solo finché si forniscono modi per sovrascriverli.

È possibile creare oggetti che mantengono i valori predefiniti tipici ed esporre come parametri di dipendenza che non hanno valori predefiniti validi. È anche possibile creare una serie di oggetti che contengono valori di default diversi all'interno di essi.

Ciò che non dovresti fare è mescolare costruzione e comportamento. Solo la difficile codifica senza alcun modo di eseguire l'override significa che potresti anche non usare le classi. Il codice procedurale sarebbe più facile da leggere e flessibile.

    
risposta data 22.05.2017 - 03:21
fonte
1

Alcuni lavori possono essere eseguiti automaticamente da Dependency Injection. Un breve esempio basato sul tuo codice:

use DI;
use View\ArticlePage;

public function getPage() {
    $page = DI::get(ArticlePage::class);
    // do things
    return $page;
}

class ArticlePage {

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

Come nel tuo esempio, ArticlePage ha bisogno di User per essere istanziata. Qui, invece di creare User te stesso, DI creerà un User per te. Avere suggerimento tipo nel costruttore ArticlePage è parte della magia DI nella creazione dell'oggetto.

La stessa cosa accadrebbe anche nella creazione di oggetti User , molto probabilmente ha bisogno di qualcosa come un oggetto Session . DI creerà il Session quando è necessario creare User .

Questo è solo uno dei Pattern Creazionali. Nel caso in cui tu sappia quali sono le dipendenze di un oggetto, penso che sia il più utile.

    
risposta data 23.05.2017 - 23:17
fonte

Leggi altre domande sui tag