好的,所以我只是在想我为什么程序员在OOP中的访问修饰符时会如此重视。
让我们以此代码为例/ PHP!
class StackOverflow
{
private var $web_address;
public function setWebAddress(){/*...*/}
}
因为web_address是私有的,所以$object->web_address = 'w.e.'
无法更改,但变量只会改变的事实是你的程序是$object->web_address = 'w.e.';
如果在我的应用程序中我希望变量不被更改,那么我会创建我的应用程序,以便我的编程没有代码来更改它,因此它永远不会被更改?
所以我的问题是:使用私人/受保护/非公共实体的主要规则和理由是什么
答案 0 :(得分:3)
因为(理想情况下),一个类应该有两个部分:
String read(int bytes)
。当然这必须是公开的,(我们的一个)主要目的是提供这种功能。private String buffer
。这可以而且应该对世界其他地方隐藏:他们没有任何商业,这是一个实施细节。甚至可以在没有访问修饰符的语言中完成,例如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)
仅仅因为一个类有“某事”并不意味着它应该暴露那些东西。这个类应该实现它的契约/接口/你想要的任何东西,但是这样做可以很容易地让所有类型的内部成员/方法不需要(并且所有权利都不应该)在外面知道那个班。
当然,你可以编写你的应用程序的其余部分来处理它,但这并不是真正的好设计。