1

好的,所以我只是在想,为什么程序员在谈到OOP中的访问修饰符时会如此紧张。

让我们以这段代码为例/ PHP!

class StackOverflow
{
    private var $web_address;

    public function setWebAddress(){/*...*/}
}

因为 web_address 是私有的,它不能被改变$object->web_address = 'w.e.',但是这个变量只会改变的事实是如果你的程序确实$object->web_address = 'w.e.';

如果在我的应用程序中我希望一个变量不被更改,那么我会制作我的应用程序,以便我的编程没有更改它的代码,因此它永远不会被更改?

所以我的问题是:使用私有/受保护/非公共实体的主要规则和原因是什么

4

6 回答 6

3

因为(理想情况下),一个类应该有两个部分:

  1. 一个暴露给世界其他地方的界面,一个其他人如何与之交谈的清单。文件句柄类中的示例:String read(int bytes). 当然,这必须是公开的,我们课程的(一个/那个)主要目的是提供这个功能。
  2. 内部状态,除了实例本身之外没有人应该(必须)关心。文件句柄类中的示例:private String buffer. 这可以而且应该对世界其他地方隐藏:他们与它无关,这是一个实现细节。

这甚至可以在没有访问修饰符的语言中完成,例如 Python - 除了我们不强迫人们尊重隐私(请记住,无论如何他们总是可以使用反射 - 封装永远不会 100% 强制执行)但在私有成员前面加上_表示“你不应该碰这个;如果你想弄乱它,后果自负”。

于 2010-09-14T14:45:13.660 回答
2

因为您可能不是项目中唯一的开发人员,其他开发人员可能不知道他们不应该更改它。或者你可能会忘记等等。

当你在做一些有人说是个坏主意的事情时,它很容易被发现(甚至编译器也能发现它)。

于 2010-09-14T14:31:25.850 回答
2

所以我的问题是:使用私有/受保护/非公共实体的主要规则和原因是什么

在 Python 中,没有访问修饰符。

所以原因实际上是特定于语言的。您可能需要稍微更新您的问题以反映这一点。

这是关于 Python 的一个相当普遍的问题。许多来自 Java 或 C++(或其他)背景的程序员喜欢深入思考这一点。当他们学习 Python 时,真的没有深入的思考。工作原理是

我们在这里都是成年人

目前尚不清楚谁——确切地说——访问修饰符有帮助。在 Lakos 的《大型软件设计》一书中,对“受保护”进行了长时间的讨论,因为受保护的语义使子类和客户端接口有点模糊。

http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620

于 2010-09-14T14:39:25.757 回答
0

您可以防止自己意外执行$object->web_address = 'w.e.';. 目前这似乎没有必要,但如果

  • 两个月后,您想更改项目中的某些内容(并且忘记了web_address不应直接更改的事实)或

  • 您的项目有数千行代码,您根本不记得“允许”直接设置哪个字段以及哪些字段需要 setter 方法。

于 2010-09-14T14:33:18.637 回答
0

访问修饰符是防御性编程策略的工具。你有意识地保护你的代码免受你自己的愚蠢错误(当你一段时间后忘记某些东西,没有正确理解某些东西或者只是没有喝足够的咖啡)。

于 2010-09-14T14:32:36.393 回答
0

仅仅因为一个类有“一些东西”并不意味着它应该暴露那个东西。该类应该实现它的契约/接口/你想调用它的任何东西,但是这样做它可以很容易地拥有不需要(并且无论如何不应该)在外部知道的各种内部成员/方法那个班的。

当然,您可以编写应用程序的其余部分来处理它,但这并不是真正的好设计。

于 2010-09-14T14:39:30.283 回答