理由有成千上万,但我只举几个here然后扩展这些:
隐藏对象的内部可以防止用户将组件的内部数据设置为无效或不一致的状态,从而保护其完整性。
类型强制执行某些不变量是很常见的(例如,一个人的 ID 号必须始终为 8 个字符长)。如果客户端可以完全访问类的每个成员,那么您就无法强制执行这些约束。这是一个具体的例子:
public class Person
{
public string Id;
public void SetId(string newId)
{
if(newId.Length != 8)
throw new InvalidArgumentException("newId");
Id = newId;
}
}
没有什么可以阻止我访问Id
字段并将其设置为我想要的任何内容!我可以这样做:
Person p = new Person();
p.Id = "Invalid Id";
这就是为什么你的私有状态需要是private.
封装的一个假定的好处是它可以降低系统复杂性,从而通过允许开发人员限制软件组件之间的相互依赖关系来提高鲁棒性。
假设我开发了一个具有 40 个方法的类,其中需要 35 个方法来连接该类的内部结构并实现其功能,其中 5 个方法实际上对客户端很重要。现在我给你这个类供你使用 - 你看一下它的公共接口,你会看到 40 个方法,其中大部分是完全地与你无关,你却问我“这意大利面条般的代码到底是什么?”
为了确保类型的意图明确,您可以限制与客户端不相关的任何成员的访问。
此外,更多的公共成员=更大的公共表面=更多需要测试的东西=更难维护。
根据经验,尝试让您的成员尽可能私密,然后从那里开始逐步提升。例如,从private
, 进而:
- 派生类是否需要访问此成员?如果有的话,推广到
protected
- 其他类是否需要访问该成员?如果有的话,推广到
public