Wir haben eine Datenschicht, die Linq To SQL umschließt. In dieser Datenebene haben wir diese Methode (vereinfacht)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
Bei Änderungen wird die Berichts-ID mit dem Wert in der Datenbank aktualisiert, den wir dann zurückgeben.
Von der aufrufenden Seite sieht es so aus (vereinfacht)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Beim Betrachten des Codes wurde ID in der InsertReport-Funktion als eine Art Nebeneffekt festgelegt, und dann ignorieren wir den Rückgabewert.
Meine Frage ist, sollte ich mich auf die Nebenwirkung verlassen und stattdessen so etwas tun.
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
oder sollten wir es verhindern
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
vielleicht sogar
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
Diese Frage wurde aufgeworfen, als wir einen Komponententest erstellten und feststellten, dass es nicht wirklich klar ist, dass die ID-Eigenschaft der Berichtsparameter aktualisiert wird und dass, um das Verhalten der Nebenwirkungen zu verspotten, ein Codegeruch empfunden wird, wenn Sie so wollen.