Istanza di un'altra classe all'interno della classe, invece delle variabili di istanza del costruttore?

1

Stavo guardando una lezione OOP con tale codice:

class UsersConstroller {

    protected $userService
    protected $logger

    public function __construct {

        UserService $userService,
        Logger $logger
     }

}

Ciò che questa classe fa è passare un'altra classe nel costruttore, quindi assegnarli alla variabile, e saranno usati con $ all'interno della classe.

È sbagliato non passare queste classi nel costruttore e istanziarle direttamente dove necessario nel codice della classe, in questo modo:

( new Logger )->logMessage("this is a message")

In questo modo, si eviteranno di passare molte istanze di altre classi alla classe.

    
posta Robert Brax 02.03.2017 - 10:35
fonte

1 risposta

4

Quanto descritto nell'esempio che hai fornito è chiamato Iniezione di dipendenza ed è generalmente considerata una buona pratica.

L'istanziazione degli oggetti della classe ogni volta che ne avete bisogno può comportare un peggioramento delle prestazioni, frammentazione della memoria e maggiore consu-mazione della memoria nei linguaggi gestiti (ci vorrebbe del tempo perché il garbage collector rilasci alcuni di questi riferimenti). Per non parlare del fatto che avresti bisogno di rilasciare quella memoria ogni volta in lingue non gestite, il che significa che ci sarebbe un grande rischio di perdite di memoria (in qualche posto ti dimenticherai di scrivere delete logger ).

In effetti, non vedo uno scenario valido in cui verrebbe usato qualcosa come (new Logger)-> logMessage("this is a message") , a parte la situazione in cui il logger sarebbe una variabile locale, cioè senza alcun impatto su altri metodi di quella classe.

In questo caso particolare, tuttavia, considerando cosa fa tipicamente il logger, non c'è assolutamente alcun scenario in cui fare qualcosa del genere è una buona pratica. La classe del logger dovrebbe essere in grado di gestire la scrittura concorrente nello stesso file di log da più thread. Se istanziate una nuova lezione ogni volta, questo sarebbe molto difficile da raggiungere.

    
risposta data 02.03.2017 - 11:18
fonte