Mamy warstwę danych, która otacza Linq To SQL. W tej warstwie danych mamy tę metodę (uproszczoną)
int InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
return report.ID;
}
Po przesłaniu zmian identyfikator raportu jest aktualizowany o wartość w bazie danych, którą następnie zwracamy.
Od strony wywołującej wygląda to tak (uproszczone)
var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID
Patrząc na kod, ID został ustawiony wewnątrz funkcji InsertReport jako rodzaj efektu ubocznego, a następnie ignorujemy zwracaną wartość.
Moje pytanie brzmi: czy powinienem polegać na skutkach ubocznych i zamiast tego zrobić coś takiego?
void InsertReport(Report report)
{
db.Reports.InsertOnSubmit(report);
db.SubmitChanges();
}
czy powinniśmy temu zapobiec
int InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport.ID;
}
może nawet
Report InsertReport(Report report)
{
var newReport = report.Clone();
db.Reports.InsertOnSubmit(newReport);
db.SubmitChanges();
return newReport;
}
To pytanie pojawiło się, gdy stworzyliśmy test jednostkowy i okazało się, że nie jest do końca jasne, czy właściwość ID identyfikatora parametrów raportu została zaktualizowana i że aby kpić zachowanie efektu ubocznego było źle, kod może pachnieć.