У нас есть слой данных, который оборачивает Linq To SQL. В этом слое данных у нас есть этот метод (упрощенный)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
При отправке изменений идентификатор отчета обновляется значением в базе данных, которое мы затем возвращаем.
С вызывающей стороны это выглядит так (упрощенно)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Глядя на код, ID был установлен внутри функции InsertReport как своего рода побочный эффект, и затем мы игнорируем возвращаемое значение.
Мой вопрос, должен ли я положиться на побочный эффект и сделать что-то подобное вместо этого.
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;
}
Этот вопрос был поднят, когда мы создали модульный тест и обнаружили, что на самом деле не совсем ясно, что свойство идентификатора параметров отчета обновляется и что для имитации поведения, связанного с побочными эффектами, было неправильно, если хотите, пахнет кодом.