Sì, è sicuro passare una connessione. Gestisci la connessione in un blocco di controllo esterno. Non c'è nulla di pericoloso a riguardo.
Ciò che è pericoloso è la scrittura di codice che non garantisce che la connessione sia correttamente disposta in modo tempestivo. Dimenticare di ripulire una risorsa non è correlato alla sua diffusione. Potresti semplicemente scrivere codice che lascia una connessione sospesa senza passarla da nessuna parte.
In C ++, sei protetto da RAII se ti alleni sullo stack o usi puntatori intelligenti. In C # si impegna una regola che tutti gli oggetti usa e getta (come le connessioni) siano dichiarati in un blocco "using". In Java ripulire con logica try-finally. Avere recensioni di codice su tutto il codice del livello dati per garantire questo.
Il caso d'uso più comune è quando si hanno diverse operazioni che possono essere combinate in molte permutazioni. E ciascuna di queste permutazioni deve essere una transazione atomica (tutto successo o rollback). quindi devi passare la transazione (e quindi la connessione corrispondente) a tutti i metodi.
Supponiamo di avere molte azioni foobar () che possono essere combinate in vari modi come transazioni atomiche.
//example in C#
//outer controlling block handles clean up via scoping with "using" blocks.
using (IDbConnection conn = getConn())
{
conn.Open();
using (IDbTransaction tran = conn.BeginTransaction())
{
try
{//inner foobar actions just do their thing. They don't need to clean up.
foobar1(tran);
foobar2(tran);
foobar3(tran);
tran.Commit();
}
catch (Exception ex)
{ tran.Rollback(); }
}
}//connection is returned to the pool automatically
BTW vorrai aprire le connessioni il più tardi possibile, disponili al più presto possibile. I tuoi compagni di squadra potrebbero avere ragione se stai trattando le connessioni come membri degli oggetti, introducendoli come uno stato non necessario e lasciando le connessioni aperte molto più a lungo del necessario. Ma l'atto di passare una connessione o una transazione come parametro non è intrinsecamente sbagliato.
A proposito. In base al supporto della tua lingua per le funzioni di prima classe, puoi visualizzare un elenco di azioni foobar (). Quindi una funzione potrebbe gestire tutte le permutazioni delle azioni. Eliminazione della duplicazione del blocco di controllo esterno per ogni permutazione.