Delphi:记录构造函数vs工厂函数

时间:2009-07-12 19:30:20

标签: delphi constructor record

那么初始化记录的首选方式是什么?

使用'工厂功能':

TMyRecord = record
  valueX: integer;
  valueY: integer;
end;

function MyRecord(const AValueX, AValueY: integer): TMyRecord;
begin
  result.valueX := AValueX;
  result.valueY := AValueY;
end;

var
  myrec: TMyRecord;
begin
  myrec := MyRecord(1, 2);
end;

或构造函数:

TMyRecord = record
  valueX: integer;
  valueY: integer;
  constructor Create(const AValueX, AValueY: integer);
end;

constructor TMyRecord.Create(const AValueX, AValueY: integer);
begin
  self.valueX := AValueX;
  self.valueY := AValueY;
end;

var
  myrec: TMyRecord;
begin
  myrec := TMyRecord.Create(1, 2);
end;

我觉得构造函数更加封装,但是在阅读代码时很容易让人感到困惑。它使它看起来像一个没有免费电话的类。输入...也是更多...

为什么你喜欢一个而不是另一个?

4 个答案:

答案 0 :(得分:11)

我更喜欢类,但如果我必须使用记录,我喜欢将它们视为尽可能类。所以我使用记录构造函数。

但是记录和单位存在令人讨厌的错误。如果函数返回记录(使用方法),如果要访问这些方法,则会产生内部错误。您可以通过将其分配给另一个变量来避免这种情况:

type 
  TMyRec = record
    ..
    procedure X;
  end;


function GetRec: TMyRec;



procedure Test;
var
  r1, r2 : TMyRec;
begin
  r1 := GetRec;
  r1.X; // internal error
  r2 := r1;
  r2.X; // No internal error;

答案 1 :(得分:2)

我更喜欢“工厂方法”,如

  function TMyRecord.CreateRec(const AValueX, AValueY: integer): TMyRecord;

单独的工厂函数泄漏封装和记录构造函数只是混淆了恕我直言。

答案 2 :(得分:1)

在我创建的Delphi项目中,我使用记录而不是类来减少列表上的开销。我会在动态数组中有几百条记录,所以我创建了两条记录。 第一个记录是项目本身。这些字段是私有的(是的,您可以使用private / protected with records)并将只读属性添加到公共部分。还添加了一个额外的构造函数,以正确的方式初始化记录。这个设置允许我保护来自其他开发人员的记录内容。 第二条记录只是前一记录类型的动态数组的包装器。该数组将是私有的,我添加了获取,添加和删除此列表中的记录的方法。因此,整个列表可以防止其他开发人员误用,并且比常规TList / TObjectList解决方案的开销更少。

请记住,记录不是类。您不能继承构造函数和其他方法。它们在WIN32环境中的功能少于真正的类。在.NET中,它们只是再次升级为类。 当开发人员可以轻松修改记录中每个字段的内容时,使用添加构造函数并不是很有用。您应该使用构造函数来保护这些字段。

答案 3 :(得分:0)

我通常不会为记录创建构造函数。它与所有版本(和FPC)不兼容。此外,它们通常仅在一个地方使用,通常填充就足够了。