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;
}
In caso di invio delle modifiche, l'ID del report viene aggiornato con il valore nel database che restituiamo.
Dal lato chiamante sembra così (semplificato)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Guardando il codice, ID è stato impostato all'interno della funzione InsertReport come una sorta di effetto collaterale, quindi ignoriamo il valore restituito.
La mia domanda è: dovrei fare affidamento sull'effetto collaterale e fare qualcosa del genere invece.
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 per deridere il comportamento degli effetti collaterali si sentisse sbagliato, un odore di codice se lo si desidera.