我们有一个包装Linq To SQL的数据层。在此数据层中,我们有此方法(简化)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
在提交更改时,将使用数据库中的值更新报告ID,然后我们将其返回。
从主叫方看起来像这样(简化)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
查看代码,作为一种副作用,已经在InsertReport函数内部设置了ID,然后我们忽略了返回值。
我的问题是,我应该依靠副作用,而是做类似的事情。
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
还是应该防止它
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
甚至会
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
当我们创建一个单元测试时,提出了这个问题,发现它不是很清楚报告参数ID属性是否已更新,并且模拟副作用的行为感觉不对,如果可以的话,会产生代码异味。