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
コードを見ると、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;
}
この質問は、単体テストを作成し、レポートパラメーターのIDプロパティが更新され、副作用の動作をモックするのが間違っていると感じた場合、コードの匂いがすることがはっきりしないことがわかったときに発生しました。