Abbiamo un livello dati che avvolge Linq To SQL. In questo datalayer abbiamo questo metodo (semplificato)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
Al momento dell'invio delle modifiche, l'ID del rapporto viene aggiornato con il valore nel database che viene quindi restituito.
Dal lato chiamante sembra questo (semplificato)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Guardando il codice, l'ID è stato impostato all'interno della funzione InsertReport come una sorta di effetto collaterale, e quindi stiamo ignorando il valore restituito.
La mia domanda è, dovrei fare affidamento sull'effetto collaterale e fare invece qualcosa del genere.
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
o dovremmo impedirlo
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
forse anche
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
Questa domanda è stata sollevata quando abbiamo creato un test unitario e abbiamo scoperto che non è davvero chiaro che la proprietà ID dei parametri del report venga aggiornata e che deridere il comportamento dell'effetto collaterale ritenuto sbagliato, un odore di codice se lo si desidera.