我使用Delphi,但这是一个我认为对任何面向对象的编程语言都有效的问题。
我应该何时使用对象上的记录。我曾经认为,当您对一组相关数据进行简单定义时,您会使用记录,这些数据要存储在一起,而不需要自己操作。然而,每次我决定将一条数据与其他数据一起放入记录中时,我想出了为什么它应该是一个完全成熟的对象。
事实上,我最近得出的结论是,在现代应用程序中唯一一次使用记录而不是对象是你是从磁盘读取二进制文件,可以直接读入记录数组。
我继承了一个10年历史的项目,该项目广泛使用对象来记录小块数据,我想知道这只是我还是应该将这些概念托付给经验回收站。
讨论
答案 0 :(得分:1)
如果没有方法对您的数据采取行动,那么大部分时间都没用。所以你就在这里。
对象和记录之间最大的区别之一是记录是堆栈上的默认值和堆上的对象。要在堆上获取记录,您将获得所引用的所有麻烦,但是当您将它们留在堆栈上时,它比管理对象生命周期容易得多。但是让我们面对现实,短暂的记录几乎没用。
当对象被实例化时,不仅仅是保留内存,还有一个要管理的VMT,而记录则没有。因此,分配对象比记录要贵一些,但我认为当你不谈论项目时,它是可以忽略的。
要做出选择,您需要考虑如何使用这些对象或记录。如果您要读取大型二进制文件,则可以使用记录(将整个缓冲区读入记录数组,也可以将它们转换为可以使用的对象)。如果您正在处理结构化数据,那么运行时生成的数据对象似乎更容易使用。
答案 1 :(得分:0)
如果您处于真正处理数据的情况,那么我认为使用记录很好。
一些典型情况:
但是,正如您所指出的那样,这些场景在典型的OO应用程序中占少数。
答案 2 :(得分:0)
您可以在所谓的recordobject中一起使用记录和对象,从而具有高效处理数据的优势,例如,一个巨大的整数密码盒,通过将这些对象封装在记录中,我们可以提高速度和事务处理:
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)