Kami memiliki lapisan data yang membungkus Linq To SQL. Dalam datalayer ini kita memiliki metode ini (disederhanakan)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
Saat mengirim perubahan, ID laporan diperbarui dengan nilai dalam basis data yang kemudian kami kembalikan.
Dari sisi panggilan sepertinya ini (disederhanakan)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Melihat kode, ID telah diatur di dalam fungsi InsertReport sebagai semacam efek samping, dan kemudian kita mengabaikan nilai kembali.
Pertanyaan saya adalah, haruskah saya mengandalkan efek samping dan melakukan sesuatu seperti ini sebagai gantinya.
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
atau haruskah kita mencegahnya
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
bahkan mungkin
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
Pertanyaan ini muncul ketika kami membuat unit test dan menemukan bahwa tidak benar-benar jelas bahwa properti ID parameter laporan akan diperbarui dan bahwa untuk mengejek perilaku efek samping terasa salah, kode akan berbau jika Anda mau.