自封装字段
自我封装不同于普通封装封装领域:这里给出的重构技术是在私有字段上执行的。
问题
直接访问类中的私有字段。
解决方案
为字段创建getter和setter,并仅使用它们访问字段。
之前
class范围{私有int低,高;Boolean包含(int arg){返回arg >= low && arg <= high;}}
后
class范围{私有int低,高;boolean include (int arg){返回arg >= getLow() && arg <= getHigh();} int getLow(){返回低;} int getHigh(){返回高;}}
之前
class范围{私有int低,高;bool包含(int arg){返回参数>= low && arg <= high;}}
后
class范围{私有int低,高;int Low {get{返回Low;}} int高{获取{返回高;}} bool包含(int arg){返回arg >= Low && arg <= High;}}
之前
私人美元低;私人美元高;函数包含($arg){返回$arg >= $this->low && $arg <= $this->high;}
后
私人美元低;私人美元高;函数包含($arg){返回$arg >= $this->getLow() && $arg <= $this->getHigh();}函数getLow(){返回$this->low;}函数getHigh(){返回$this->high;}
之前
class范围{私有低:数字私有高:数字;包含(参数:数字):布尔{返回参数>=低&&参数<=高;}}
后
class范围{私有低:数字私有高:数字;contains (arg: number): boolean{返回参数>= getLow() && arg <= getHigh();} getLow():数字{返回低;} getHigh():数字{返回高;}}
为什么重构
有时直接访问类中的私有字段不够灵活。您希望能够在第一次查询时初始化一个字段值,或者在字段的新值被赋值时执行某些操作,或者可能在子类中以各种方式完成所有这些操作。
好处
间接访问字段当通过访问方法(getter和setter)对字段进行操作时。这种方法比直接访问字段。
首先,当字段中的数据被设置或接收时,您可以执行复杂的操作。延迟初始化而且字段值的验证很容易在字段getter和setter中实现。
第二,也是更重要的一点,您可以在子类中重新定义getter和setter。
您可以选择根本不为字段实现setter。字段值将仅在构造函数中指定,从而使字段在整个对象生命周期内不可更改。
缺点
- 当直接访问字段使用时,代码看起来更简单、更美观,尽管灵活性降低了。
如何重构
为字段创建一个getter(和可选的setter)。他们应该是
受保护的
或公共
。找到字段的所有直接调用,并将它们替换为getter和setter调用。