Self Encapsulate Field 自封装字段

你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙。为这个字段建立取值/设值函数,并且只以这些函数来访问字段。

动机

在“字段访问方式”这个问题上,存在两种截然不同的观点:其中一派认为,在该变量定义所在的类中,你可以自由访问它;另一派认为,即使在这个类中你也应该只使用访问函数间接访问。两派之间的争论可以说是如火如荼。(参见Auer在[Auer]p.413和Beck在[Beck]上的讨论。)

归根结底,间接访问变董的好处是,子类可以通过覆写一个函数而改变获取数据的途径:它还支持更灵活的数据管理方式,例如延迟初始化(意思是:只有在需要用到某值时,才对它初始化)。

直接访时变量的好处则是:代码比较容易阅读。阅读代码的时候,你不需要停下來说:“啊,这只是个取值函数。”

面临选择时,我总是做两手准备。通常情况下我会很乐意按照团队中其他人的意愿来做。就我自己而言,我比较喜欢先使用直接访问方式,直到这种方式给我带来麻烦为止,此时我就会转而使用间接访问方式。重构给了我改变主意的自由。

如果你想访问超类中的一个字段,却又想在子类中将对这个变量的访问改为一个计算后的值,这就是最该使用Self Encapsulate Field的时候。“字段自我封装” 只是第一步。完成自我封装之后,你可以在子类中根据自己的需要随意覆写取值/设值函数。

做法

  • 为待封装字段建立取值/设值函数。
  • 找出该字段的所有引用点,将它们全部改为调用取值/设值函数。
    • 如果引用点要读取字段值,就将它替换为调用取值函数;如果引用点要给字段赋值,就将它替换为调用设值函数。
    • 你可以暂时将该字段改名,让编译器帮助你查找引用点。
  • 将该字段声明为private。
  • 复查,确保找出所有引用点。
  • 编译,测试。

results matching ""

    No results matching ""