1

我使用 Delphi,但我认为这是一个适用于任何面向对象编程语言的问题。

我什么时候应该在对象上使用记录。我曾经认为,当您对一组相关数据有一些简单的定义时,您会使用记录,这些数据要存储在一起,不需要能够自行操作。但是,每次我决定将一条数据与其他数据一起放入记录时,我都会想出为什么它应该是一个完全成熟的对象的原因。

  1. 一条数据需要一些属性或方法几乎总是有原因的。
  2. 使用对象(至少在 Delphi 中)内存管理(创建和销毁)要简单得多。
  3. 就速度和内存而言,使用对象可能不会更昂贵,但更灵活。

事实上,我最近得出的结论是,在现代应用程序中,您应该在对象上使用记录的唯一情况是,如果您正在从磁盘读取可以直接读取到记录数组中的二进制文件。

我继承了一个已有 10 年历史的项目,该项目在对象上广泛使用记录来存储小块数据,我想知道是我自己还是应该将这些概念交给经验的回收站。

讨论。

4

3 回答 3

1
  1. 当没有方法对您的数据采取行动时,大多数时候它是无用的。所以你就在这里。

  2. 对象和记录之间最大的区别之一是记录默认在堆栈上,而对象在堆上。要在堆上获取记录,您会遇到您所指的所有麻烦,但是当您可以将它们留在堆栈上时,管理对象的生命周期要容易得多。但让我们面对现实,短期记录几乎没有用处。

  3. 当对象被实例化时,发生的不仅仅是保留内存,还有要管理的 VMT,而记录却没有。所以分配对象比记录要贵一点,但我想当你不谈论成千上万的项目时,它是可以忽略的。

要做出选择,您需要考虑如何使用这些对象或记录。如果您要读取大型二进制文件,则可以使用记录(将整个缓冲区读取到记录数组中可能会将它们转换为要使用的对象)。如果您正在处理结构化数据,我们的运行时生成的数据对象似乎更容易使用。

于 2009-02-25T10:28:05.763 回答
0

如果您确实只是在处理数据,那么我认为使用记录很好。

一些典型场景:

  • 报告
  • 批量更新
  • 在构建对象的情况下将名称/值数据绑定到下拉列表只是矫枉过正。
  • 内存中的关系数据缓存
  • 对大量数据执行操作

但是,正如您所指出的,这些场景在典型的 OO 应用程序中只占少数。

于 2009-02-25T18:45:00.623 回答
0

您可以在所谓的记录对象中一起使用记录和对象,其优点是可以有效地处理数据,例如一个巨大的整数加密盒,通过记录中的这些对象封装,我们获得了更快的速度和事务:

TKeyObjAB= record
  ID:string;
  n:TInteger; {the modulus}
  phi:TInteger; {Totient phi=(p-1)*(q-1)}
  e:TInteger; 
  d:TInteger; {private key if e relative to phi,
                which means that d*e mod phi = 1}
  blocksize:integer;    
  keysize:Integer; {bits in modulus}
  benchmark: string; //double;
end;

然后用两个或多个 recobj 实例化它:

var
 tAlice:TKeyObjAB;
 tBob:  TKeyObjAB;

构造函数是一个简单的函数来初始化你的成员:

function Obj_createAB(newid:string; 
  newkeysize:integer; actor:TKEYObjAB):TKeyObjAB;
begin
  with actor do begin
    id:=newid;
    keysize:=newkeysize;
    n:=TInteger.Create(0);
    phi:=TInteger.Create(0);
    e:=TInteger.create(0);
    d:=Tinteger.create(0);
    benchmark:= '';
  end;
 result:= actor;  
end;

// invoke instances
talice:= Obj_createAB('Alice', 256, talice)
tbob:= Obj_createAB('Bob', 512, tbob)
于 2020-05-22T14:11:09.817 回答