Это похоже на этот вопрос. Я спросил: "Почему?" на самый популярный ответ, но я не знаю, что кто-нибудь снова посмотрит на него. По крайней мере, не в любой момент.
Во всяком случае, мой вопрос касается наилучшей практики делегирования ответственности за создание объектов для функций или процедур, не вызывая утечки памяти. Кажется, что это:
procedure FillObject(MyObject: TMyObject; SomeParam: Integer);
begin
//Database operations to fill object
end;
procedure CallUsingProcedure();
var
MyObject: TMyObject;
begin
MyObject = TMyObject.Create();
try
FillObject(MyObject, 1);
//use object
finally
MyObject.Free();
end;
end;
является предпочтительным по сравнению с этим:
function CreateMyObject(DBID: Integer): TMyObject;
begin
Result := TMyObject.Create();
try
//Database operations to fill object
except on E: Exception do
begin
Result.Free();
raise;
end;
end;
end;
procedure CallUsingFunction();
var
MyObject: TMyObject;
begin
MyObject = CreateMyObject(1);
try
//use object
finally
MyObject.Free();
end;
end;
Почему?
Я относительно новичок в Delphi, ранее работавший больше всего с Java и PHP, а также с С++, хотя и в меньшей степени. Интуитивно я склоняюсь к функциональному методу, потому что:
- Он инкапсулирует код создания объекта в функцию, а не создает объект отдельно, когда я хочу использовать эту процедуру.
- Мне не нравятся методы, которые изменяют их параметры. Он часто оставил недокументированным и может затруднить отслеживание ошибок.
- Смутно, но, по общему признанию, это просто "плохо пахнет" для меня.
Я не говорю, что я прав. Я просто хочу понять, почему сообщество выбирает этот метод, и если есть веские причины для меня изменить.
Edit: Ссылки на @E-Rock в комментариях для меня (Eric G). Я изменил свое отображаемое имя.