3

我最近一直在写不同的课程,我注意到我无意中使用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;

标识符的意思是,field例如FName和,标识符的意思是和,例如。FIDpropertyNameID

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

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

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

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

谢谢。

4

1 回答 1

6

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

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

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

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

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

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

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

于 2013-09-27T23:12:14.567 回答