访问修饰符......为什么?

时间:2010-09-14 14:27:00

标签: access-modifiers application-structure

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

让我们以此代码为例/ PHP!

class StackOverflow
{
    private var $web_address;

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

因为web_address是私有的,所以$object->web_address = 'w.e.'无法更改,但变量只会改变的事实是你的程序是$object->web_address = 'w.e.';

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

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

6 个答案:

答案 0 :(得分:3)

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

  1. 暴露于世界其他地方的界面,是其他人如何与之交谈的一种表现。文件句柄类中的示例:String read(int bytes)。当然这必须是公开的,(我们的一个)主要目的是提供这种功能。
  2. 内部状态,除了实例本身之外,没有人应该(必须)关心。文件句柄类中的示例:private String buffer。这可以而且应该对世界其他地方隐藏:他们没有任何商业,这是一个实施细节。
  3. 甚至可以在没有访问修饰符的语言中完成,例如Python - 除了我们不强迫人们尊重隐私(并记住,他们总是可以使用反射 - 封装永远不会100%强制执行),但使用_为私人成员添加前缀以表示“你不应该触摸这个;如果你想搞砸它,请自担风险“。

答案 1 :(得分:2)

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

当你做某些人所说的不好的事情时,很容易发现(甚至编译器都能发现它)。

答案 2 :(得分:2)

  

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

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

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

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

  

我们都是成年人

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您不会意外执行$object->web_address = 'w.e.';。目前看来这似乎是不必要的,但如果

,则没有必要
  • 两个月后你想改变项目中的某些内容(并且忘记了web_address不应该直接更改的事实)或

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

答案 5 :(得分:0)

仅仅因为一个类有“某事”并不意味着它应该暴露那些东西。这个类应该实现它的契约/接口/你想要的任何东西,但是这样做可以很容易地让所有类型的内部成员/方法不需要(并且所有权利都不应该)在外面知道那个班。

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