Tenemos una capa de datos que envuelve Linq To SQL. En esta capa de datos tenemos este método (simplificado)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
Al enviar los cambios, la ID del informe se actualiza con el valor en la base de datos que luego devolvemos.
Desde el lado de la llamada se ve así (simplificado)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Mirando el código, la ID se ha establecido dentro de la función InsertReport como una especie de efecto secundario, y luego estamos ignorando el valor de retorno.
Mi pregunta es, ¿debería confiar en el efecto secundario y hacer algo como esto?
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
o deberíamos evitarlo
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
tal vez incluso
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
Esta pregunta se planteó cuando creamos una prueba unitaria y descubrimos que no está realmente claro que la propiedad ID de los parámetros del informe se actualice y que, para burlarse del comportamiento de los efectos secundarios, se sintiera mal, un olor a código, por así decirlo.