In pratica hai due opzioni.
Usa la relazione di composizione
Non si passa una classe implementando un'interfaccia Log
a una classe, ma si creerebbe un abstract class
in cui, nel suo costruttore, si inizializza direttamente il membro protected Log
con l'istanza new
della classe implementando l'interfaccia Log
.
Tutte le classi che hanno bisogno di usare il logger erediteranno questa classe e se in futuro dovessi cambiare la procedura del meccanismo di registrazione, puoi semplicemente sostituire l' new
nella tua base abstract class
in un nuovo logger e la modifica verrà propagata in tutte le tue classi.
Utilizza metodi statici
La registrazione è un'attività così semplice, non produce effetti collaterali. Semplicemente apre un flusso da registrare (che si tratti di un database o di un file) e scarica lì il contenuto del registro.
A causa della sua semplicità, il logger può entrare nel pacchetto delle utility.
Tuttavia, c'è un problema. Se decidi in qualsiasi momento, in futuro, di cambiare il modo in cui i processi vengono registrati, dovrai modificare la classe del logger e la sua registrazione metodi. In questo processo è molto probabile che tu perdi il meccanismo di registrazione iniziale o che passi a commentare il codice per le procedure iniziali, il che renderà il tuo codice disordinato.
Dove lavoro, utilizziamo il primo approccio: un'interfaccia di registrazione semplice, contenente metodi come logInfo
o logError
e le classi implementano l'interfaccia.
Anche se di solito ci tratteniamo dal rapporto di composizione, perché è difficile da deridere, la classe di taglialegna, come ho detto, è così semplice, abbiamo fatto un'eccezione, perché ci piace ancora un po 'più di avere un logger statico.