Temos uma camada de dados que envolve o Linq To SQL. Nesta camada de dados, temos este método (simplificado)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
Ao enviar as alterações, o ID do relatório é atualizado com o valor no banco de dados que retornamos.
Do lado da chamada, fica assim (simplificado)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Observando o código, o ID foi definido dentro da função InsertReport como um tipo de efeito colateral, e então estamos ignorando o valor de retorno.
Minha pergunta é: devo confiar no efeito colateral e fazer algo assim em seu lugar.
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
ou devemos impedi-lo
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
talvez até
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
Essa questão foi levantada quando criamos um teste de unidade e descobrimos que não está realmente claro que a propriedade ID dos parâmetros do relatório é atualizada e que, para zombar do comportamento do efeito colateral, parecia errado, um cheiro de código, se você quiser.