delphi - 我应该引用字段或属性名称吗?

标签 delphi freepascal lazarus

我最近一直在编写不同的类,我注意到我无意中使用 field 来读取/写入它们。和property标识符,我想知道如果这样做的话会有什么陷阱?

让我们以一个基本类为例:

TMyClass = class
private
  FName: string;
  FID: Integer;
public
  constructor Create(AName: string);
  destructor Destroy; override; 
published
  property Name: string read FName write FName;
  property ID: Integer read FID write FID;
end;

作者:field我的意思是标识符,例如 FNameFID ,以及property我的意思是 Name 标识符和ID例如。

发布的全部目的property如果我没有记错的话,就是能够在编写类的单元之外访问它。这肯定意味着 field标识符应该在类编写的单元中使用,毕竟你无法访问那些 field类外的标识符。

这是我注意到在某些程序(私有(private)或 protected )中我没有使用 FName 的地方。或FID ,而是使用 property等效,NameID - 或有时混合。

到目前为止,我还没有发现任何问题,事实上我通常会使用 FNameFID但就像我说的,由于某种原因无意中没有这样做。

这是不好的做法还是会导致更险恶的事情?

谢谢。

最佳答案

属性的目的不是允许访问类本身之外的类数据。
这可以通过将您的成员(member)数据声明为公开来轻松完成。

属性的目的是促进良好的 OOP。
以下几点说明了这个概念。

副作用
属性的主要目的是隐藏类的实现细节并在设置属性时允许“副作用”。
这在 VCL 中很明显,由于 SetHeight Setter 中编码的副作用,更改 height 属性将自动更改窗口的外观。
这是 information hiding OOP 概念的一部分.

无论您是否在类里面,这些副作用都很有用。
当您的类或其后代之一更改属性的行为时,另一个有用的方面就会发挥作用;添加以前没有的副作用。
如果原始类中的旧代码直接修改字段,这些副作用将不会触发,从而破坏后代内部的更改。

经验法则:副作用
始终使用该属性,除非您明确希望防止触发副作用。 !!记住 setter/getter 也可能有副作用。

实现隐藏
有时,这些字段并不是其在属性中的外观的直接翻译。
或者您可能想更改底层的实现,但保持属性不变。
同样,在这种情况下,您可能也想在自己的类中隐藏这些详细信息,以便后代类不会中断。
例如如果您将存储实现为带有指针的红/黑树,那么当您决定切换到基于数组的偏移结构时,您希望尽量减少对例程其余部分的影响。

经验法则:隐藏实现
仅直接访问这些直接处理数据的例程中的字段。
通过放置通用例程来限制这些例程的数量,例如:定位器、迭代器等。

关于delphi - 我应该引用字段或属性名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058689/

相关文章:

delphi - 如何消除跟踪过程中的 header 伪影 - HDN_TRACK?

Free Pascal Lazarus 1.0.2 (FPC 2.6.0) 中的 WinAPI 函数

sql-server - 使用 RemObjects 的 delphi 中的 SQL Server varchar(MAX) 数据类型

database - 无法分配给只读属性

delphi - Free Pascal可以受益于Apache Maven之类的东西吗?

multithreading - 多个连续线程上的 TThread.WaitFor

mysql - Delphi代码不会保存到Mysql数据库

delphi - Indy10 自由帕斯卡

delphi - 将具有通用参数的类传递给Delphi中的另一个类

delphi - 如何释放接口(interface)?