我真的不明白为什么将成员变量和成员函数设为私有是一般的好习惯。
是为了防止人们使用某种组织工具来解决问题?
答案 0 :(得分:16)
基本上,是的,这是为了防止人们搞砸东西。
封装(信息隐藏)是您正在寻找的术语。
只需向外界发布最少的信息,您就可以随意更改内部信息。
例如,假设您将电话簿实现为一系列条目,而不是隐藏这一事实。
然后有人出现并编写代码,搜索或操作您的数组,而不用通过“普通”接口。这意味着,当您想要开始使用链表或其他更高效的数据结构时,它们的代码将会中断,因为它使用了该信息。
这是发布该信息的 错误,而不是他们使用它的信息: - )
经典的例子是制定者和吸气剂。您可能认为您可以在类中公开温度变量本身,以便用户可以执行:
Location here = new Location();
int currTemp = here.temp;
但是,如果您希望以后在要求温度时实际上从气象局获取网络信息该怎么办?如果你首先封装了信息,那么调用者就会这样做:
int currTemp = here.getTemp();
您可以根据需要更改该方法的实现。您唯一需要保留的是API(函数名称,参数,返回类型等)。
有趣的是,它不只是在代码中。某些大公司会用以下短语来记录他们的文档:
此技术信息仅供参考,可能会在以后的版本中更改。
这允许他们提供客户想要的东西(额外的信息),但不会锁定他们永远支持它。
答案 1 :(得分:6)
主要原因是您(图书馆开发人员)有保险,没有人会使用您不希望维护的部分代码。
您的代码的每个公共部分,并且 将不可避免地被客户使用。如果您后来发现您的设计实际上非常糟糕,并且版本2.0应该写得更好,那么您会意识到您的付费客户实际上希望您保留所有现有功能,并且您已经锁定以保持向后兼容性的价格制作更好的软件。
通过尽可能多地使用私有代码,您可以毫无保留地声明此代码是无人问津的,并且您可以随时重写代码。
答案 2 :(得分:2)
防止人们搞砸事情 - 但从安全角度来看不。
相反,它旨在让您的班级用户只关心public
部分,让您(作者)可以自由修改实施(private
)而无需担心打破别人的代码。
例如,大多数编程语言似乎将String
存储为char[]
(字符数组)。如果由于某种原因发现链接的节点列表(每个节点包含单个字符)表现得更好,则可以切换使用该阵列的内部实现,没有(理论上)使用{打破任何代码{1}}上课。
答案 3 :(得分:1)
向使用您的对象的任何人(您,其他人)提供明确的代码合同......将“如何使用它”与“工作原理”区分开来。这称为Encapsulation。
另一方面,至少在.NET上(可能在其他平台上),对于真正想要访问的人来说,获取对象的私有部分(在.NET中,使用反射)并不是很难。
答案 4 :(得分:0)
以计数器的典型例子为例。你夜总会的保镖握着他的手,使他的拳更加努力,并计算进入和离开俱乐部的人。
现在事情定义如下:
public class Counter{
private int count = 0;
public void increment()
{
count++;
}
public void decrement()
{
count--;
}
}
正如你所看到的,没有可用于计数的setter / getter,因为我们不希望这个类的用户(程序员)能够调用myCounter.setCount(100),甚至更糟的myCounter.Count - = 10;因为这不是这件事所做的事情,所以每个人离开时,每个人都会进入和离开。
答案 5 :(得分:0)
对此有很多争论的余地。 例如......如果很多.Net Framework是私有的,那么这会阻止开发人员搞砸事情,但同时也会阻止开发人员使用这些功能。
在我个人看来,我会优先考虑公开方法。但我建议使用Facade模式。简单来说,您有一个封装复杂功能的类。例如,在.net框架中,WebClient是一个隐藏复杂的http请求/响应逻辑的Facade。
另外......保持课程简单......你应该有很少的公共方法。这是一个比拥有大量私有方法的大型类更好的抽象
答案 6 :(得分:0)
知道如何将对象放在一起“看看YouTube上的这个视频
是很有用的。”http://www.youtube.com/watch?v=RcZAkBVNYTA&list=PL3FEE93A664B3B2E7&index=11&feature=plpp_video