2

我试图了解将类变量设为私有而不是公开的好处。我了解获取/设置者可以访问/修改私有/受保护数据,但其唯一目的是“防止我破坏我的数据”吗?示例:我不明白怎么说

$person->age = x;//bad?

具有不同的破坏潜力

$person->set_x(x);//reccommended in OOP articles
4

5 回答 5

13

这都是关于封装的。

说你用$person->age = x. 现在,它可以正常工作,假设你在 100 个地方有这条线。后来事实证明,您希望限制age为大于 0 的数字。通过直接访问成员变量,无法轻松实施该限制。

但是假设你最初是$person->set_age(x)在这 100 个地方写的。现在,您可以从

private $_age;
public void age($new_age) {
    $this->_age = $new_age;
}

private $_age;
public void age($new_age) {
    if ($new_age > 0) {
        $this->_age = $new_age;
    }
}

您不必接触 set_age 方法的单个使用者;更改“正常工作”。这就是 OOP 的真正美妙之处:您可以在单个方法调用后面隐藏许多实现细节。

封装也可以在其他地方提供帮助:假设您想要一个记录每个年龄变化的 Person 子类。使用 setter 方法,就像重写一样简单;使用直接变量访问,这将是一团糟。

于 2010-09-14T21:41:00.363 回答
4

通过提供访问器(setter / getter 方法,或通过使用支持它们的语言中的属性,如 C#),开发人员可以在类及其用户之间定义更稳定的契约。不是直接访问字段,而是通过实际读取或写入内存位置,用户被迫调用一个方法,该方法反过来可以封装任何必要的逻辑。

反过来,当修改类的内部设计时,它的契约需要更改的频率较低。因此,提高了代码的可维护性和稳定性。

请注意,性能不是问题,因为现代 JIT 编译器能够以消除实际调用并且代码等效于直接访问底层内存位置的方式优化对普通 getter/setter 的调用。

编辑:

此外,setter 和 getter 通常可能具有不同的可见性(公共/受保护/私有),从而为对指定值的读/写操作提供更细粒度的控制的额外好处。

因此,最好的做法是尽可能避免使用公共字段,而是使用 setter / getter 方法或属性。

于 2010-09-14T21:48:38.960 回答
0

防止你破坏它,防止其他人破坏它,并表达非公共成员不是其他人应该看到的一部分的想法 - 从而实现封装

于 2010-09-14T21:38:19.973 回答
0

好吧,我认为set/get方法可以帮助更好地保证属性,如果你直接改变值可能会引起一些麻烦,例如对代码有害。我认为 set/get 为用户提供了一种调用方法,而不是直接对属性进行操作。

于 2010-09-14T21:41:09.787 回答
0

protected 关键字经常被误解,并且可能被过度使用。简而言之,protected 成员用于与子类通信,public 成员用于与调用者通信。

于 2018-11-19T12:48:31.873 回答