L'iniezione di dipendenza richiede un trade-off tra il disaccoppiamento di parti del codice a scapito di aumentarne la complessità attraverso la creazione di astrazioni. Quindi, come regola generale, l'aumento della complessità deve offrire vantaggi che superano i costi.
Iniettando dipendenze mutabili o con effetti collaterali, otteniamo evidenti benefici. Il codice diventa più facile da testare poiché questi effetti collaterali possono essere presi in giro. Controlliamo quali parti del sistema hanno accesso a quelle parti mutanti, rendendo il codice più pulito, più facile da capire e più facile da mantenere. L'aumento della complessità è facilmente neutralizzato da questi benefici.
Ma se una dipendenza è pura, non otteniamo alcuno di questi benefici, tuttavia continuiamo ad aumentare i costi di complessità. Vorresti iniettare Math.PI
(o l'equivalente) o accedervi direttamente? È una costante, quindi non ci sarebbe alcun vantaggio nel farlo; può essere reso accessibile a livello globale. Ma sicuramente lo stesso vale per Math.Max()
? È completamente deterministico. Non ci sarebbe alcun vantaggio a deriderlo; nessun vantaggio nello swapparlo per un'altra implementazione di Max
. Quindi, di nuovo, è un costo di complessità senza guadagno. Così anche dovrebbe essere accessibile a livello globale.
Se la resa di Math.Max()
globalmente accessibile ha senso. Allo stesso modo, rendere il tuo somePureFunction
accessibile a livello globale ha anche senso. L'iniezione di nuovo rende il codice più complesso senza ulteriori vantaggi.
Ovviamente, è importante sottolineare "puro" qui. Se la tua funzione in qualche modo non è deterministica, ha effetti collaterali o muta in qualche modo i parametri passati, non è pura e quindi non dovrebbe essere accessibile a livello globale. Iniettarli. Non iniettare pure funzioni.