2013-10-17 43 views
17

我一直在使用Delphi相当长一段时间,但不是来自CS背景,我已经学会了“在工作中” - 主要来自我的老板,并通过从网页中拾取的零散文件进行增强,用户指南,示例等。为什么我们应该使用类而不是记录,反之亦然?

现在我的老板是老派,开始使用Pascal进行编程,并且未必能随时了解Delphi的最新变化。

就在最近我一直在想我们的核心技术是否是“错误的”。

我们的大部分应用程序都与MySQL接口。一般来说,我们将创建一个结构为record的存储从数据库读取的数据,这些记录将存储在TList中。一般来说,我们将有一个单元来定义我们在应用程序中的各种记录,以及种子和读取记录的功能和过程。我们不使用备案手续这样概述here

回顾了一些例子,我开始怀疑我们是否会更好使用classes而不是记录后,但我很难找到有力的指导两种方式。

我们正在处理的事情是用户信息:姓名,生日,事件,事件类型。或时间表信息:小时,工作等...

回答

35

最大的区别是记录是值类型和类是参考类型。简而言之,这意味着:

  1. 对于值类型,当您使用赋值a := b时,会进行复制。有两个不同的实例,ab
  2. 对于参考类型,当您使用赋值a := b时,两个变量都指向同一个实例。只有一个实例。

这样做的主要后果是当您编写a.Field := 42时会发生什么情况。对于记录,值类型a.Field的值类型会更改a中的成员值,但不会更改b中的成员值。这是因为ab是不同的实例。但是对于一个班级,因为ab都指向相同的实例,那么在执行a.Field := 42之后,您可以安全地断言b.Field = 42

有没有硬性规定,说你应该总是使用值类型,或者总是使用引用类型。两者都有自己的位置。在某些情况下,最好使用一个,而在其他情况下,最好使用另一个。基本上,决策总是归结为您希望赋值运算符意味着什么的决定。

你有一个现有的代码库,大概是熟悉它的程序员,已经做出了特别的选择。除非您有充分的理由改用参考类型,否则进行更改几乎肯定会导致缺陷。现有代码中的缺陷(切换到引用类型会改变赋值运算符的含义),以及在将来编写的代码中(您和您的同事已经在特定的上下文中就赋值运算符的含义发展了直觉,并且该直觉将会中断如果你切换)。

更重要的是,你声明你的类型不使用方法。一种仅由数据组成的类型,并且没有与之关联的方法很可能最好由值类型表示。我不能肯定地说,但我的直觉告诉我,最初的开发者做出了正确的选择。

+0

+1与我的第一本能完全相反,但最终的实用性很强,我不得不同意。 OP应该意识到由于任务可能造成的性能下降。例如:将记录参数作为'const'传递应该是默认的,但是再次,这可能会破坏应用程序,我们又回到了试图实用的。 –

+0

@LievenKeersmaekers是的,我确实想过讨论参数传递,但选择不为简单。您可以将参数按值传递为与赋值等效。参数是局部变量。按值传递根据参数的类型复制值或引用。因此,您对分配的了解同样适用于值参数传递。 –

+0

我们通常仅在流式传输结构化数据(例如TCP,串行或磁盘)时使用记录,在这种情况下,我们使用打包记录来确保大小保持有限。我们将使用类/对象来处理其他事情。 –

相关问题