delphi – 为什么使用过程来创建优先于函数的对象?

前端之家收集整理的这篇文章主要介绍了delphi – 为什么使用过程来创建优先于函数的对象?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这跟 this question相似。我问“为什么?”到 the most popular response,但我不知道有人会再次看着它。至少不及时的。

无论如何,我的问题是关于将对象创建函数或过程的责任的最佳做法,而不会导致内存泄漏。好像这样:

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以及C中工作最多,但是在较小程度上。直观地,我倾向于功能方法,因为:

>它将对象创建代码封装在函数中,而不是每当我想使用该过程时分别创建对象。
我不喜欢改变参数的方法。它通常没有记录,可以使跟踪错误更加困难。
>暧昧,但诚然,这只是“闻起来”对我不好。

我不是说我是对的我只是想了解社区为什么选择这种方法,如果有更好的理由让我改变。

编辑:
参考@ E-Rock的评论是给我的(Eric G)。我改变了我的显示名称

解决方法

创建对象实例并将其传递到另一个过程中可以清除哪个代码负责释放实例。

在第一种情况下(使用程序填写):

MyObj := TMyObject.Create;
try
  // Do whatever with MyObj
finally
  MyObj.Free;
end;

这很清楚,该代码块在完成使用后负责释放MyObj。

MyObj := CreateMyObject(DBID);

应该释放什么代码?什么时候可以安全释放它?谁负责异常处理?你如何知道(作为别人的代码用户)?

作为一般规则,您应该创建,使用和释放需要它们的对象实例。这使得您的代码更容易维护,并且肯定会使以后的人更容易,并且必须尝试弄清楚。

猜你在找的Delphi相关文章