Supponiamo di avere un oggetto di grandi dimensioni - pensa EntityManager
di un ORM come Doctrine
o un oggetto DAO personalizzato o cosa hai. Oggetto, il cui output è richiesto per essere utilizzato all'interno di una classe, ma l'oggetto stesso potrebbe essere transitorio - svolgere il proprio lavoro e quindi uscire dall'ambito.
Non sempre importa se tale oggetto è grande o no, ma non è necessario far parte della classe. Tuttavia il suo sottoprodotto è. Esempio:
//i.e. Doctrine\ORM\EntityManager
class BigTerribleDatabaseObject
{
//300 methods and 20 properties
}
Quando non si utilizza DI
BigTerribleDatabaseObject
è usato solo per ottenere alcuni dati e poi viene scartato.
class Small
{
public getData($id)
{
$db = new BigTerribleDatabaseObject();
return $db->getDataById($id);
}
}
Utilizzo DI
BigTerribleDatabaseObject
diventa un residente permanente della piccola classe, nonostante sia stato iniettato (viene iniettato e quindi rimane).
class Small
{
private $db;
function __construct(BigTerribleDatabaseObject $db)
{
$this->db = $db;
}
public getData($id)
{
$db = $this->db;
return $db->getDataById($id);
}
}
Il mio problema
A volte faccio un'istruzione print_r
a scopo di debug su un oggetto. Mi piace così:
//first line depending on whether or not I use DI or not:
$myClass = new Small(new BigTerribleDatabaseObject())
$myClass = new Small()
print_r($myClass);
Con DI $myClass
stampa il contenuto di Small
E anche tutto il contenuto di BigTerribleDatabaseObject
, perché BigTerribleDatabaseObject
fa parte di Small
.
Questo inonda il mio schermo e talvolta anche il mio browser si blocca perché nel mio caso è il gestore di entità di Doctrine ed è enorme e poco maneggevole.
Senza DI ottengo una bella stampa solo della mia classe molto piccola. Quale penso sia più pulito.
Quindi devo scegliere tra "nice e small print di debug senza DI" o "use DI, ma subiscono stampe di debug ampie e ingombranti".
Domanda
Preferisco di gran lunga la stampa più piccola. Significa che devo scartare usando le tecniche di Iniezione di Dipendenza? Posso usare qualcos'altro? È un male necessario per il DIing di grandi oggetti transitori?