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

3 delphi freepascal lazarus

我最近一直在写不同的课程,我注意到我无意中使用两者fieldproperty标识符读/写它们,我想知道如果有这样的话会有什么陷阱?

让我们使用基本类作为例子:

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;
Run Code Online (Sandbox Code Playgroud)

field标识符我的意思是,例如FNameFID,并且通过property标识符我的意思是NameID例如.

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

这是我注意到的一些程序(私人或受保护),我没有使用过,FName或者FID使用property等效的,NameID- 或有时混合.

到目前为止,我没有看到任何问题,事实上我通常会使用FName,FID但就像我说的那样,由于某种原因无意中没有这样做.

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

谢谢.

Joh*_*ica 6

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

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

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

无论您是否在课堂内,这些副作用都很有用.
当您的类或其后代之一更改属性的行为时,另一个有用的方面就会启动; 在之前没有的情况下添加副作用.
如果原始类中的旧代码直接使用字段,则这些副作用将不会触发,从而打破了后代内部的更改.

经验法则:副作用
除非您明确要防止副作用触发,否则始终使用该属性.!!记住吸气剂也有副作用.

实现隐藏
有时,字段不是它们在属性中的外观的直接转换.
或者您可能希望更改引擎下的实现,但保持属性相同.
同样在这种情况下,您可能希望在您自己的类中隐藏这些详细信息,以便后代类不会中断.
例如,如果您将存储实现为带有指针的红色/黑色树,那么当您决定切换到基于阵列的偏移结构时,您希望最小化对例程其余部分的影响.

经验法则:实现隐藏
只在这些直接处理数据的例程中直接访问字段.
通过放置通用例程来限制这些例程的数量,例如:locaters,iterators等.