所以尽管我的单一课程是编程课程,但他们从未真正解释过它,甚至我用Google搜索了很多次,我从来没有完全理解它。就安全性而言,它更好吗?
我正在尝试编写一个多类系统,并将所有访问修饰符更改为public,否则将无法访问。
有人可以详细解释一下,并尝试让它易于理解吗?
谢谢你们
答案 0 :(得分:7)
使用private
称为封装。
它可以而且应该用于组织代码。它与安全无关。
基本规则是所有数据(字段)都应该是私有的,并且只能通过公共成员(属性,方法)进行访问。
这样一个对象可以对其自己正确的“对象状态”负责。
封装是一个简单但非常强大的概念,类应该有一个外部(公共接口)和一个内部(私有实现)。只有通过消费代码使用且安全的成员才应公开。
private
并不意味着“你可能不知道”,但它意味着“你不必知道”。
答案 1 :(得分:1)
首先,错误修正变得更容易,因为您没有看到许多变量与您的私有变量一起浮动。
也许当你加入一个大项目时,你不希望任何其他程序员访问你的类文件的特殊内容,每个人都在做一部分工作而不了解所有项目。如果有人知道所有变量,那么他/她可以秘密地出售项目(在团队之前完成)。
最后,您的私有变量不是全局变量,仅此一项就可以进行优化(可能不适用于java)。
答案 2 :(得分:1)
之前答案中未提及的另一点是对代码可维护性的影响 - 所有变量都是公共的,任意数量的类都可以引用它们。如果要更改一个类的工作方式,还需要修改所有这些类。因此,您可能需要更改其他类的内部,并且您有一个美丽的蝴蝶效果。另一方面,如果你保持内部私有并且只有公共抽象接口,你可以修改类实现,同时保持旧接口,不需要在类之外进行任何更改。
答案 3 :(得分:1)
我在这里只谈到C ++。
private
偶尔非常有用。假设你有一个相当大的代码库。假设您正在尝试查找类中某个字段的所有用户,可能是因为您想要删除它。您可以创建该字段private
。然后你得到了很好的,友好的编译错误,告诉你所有用户的确切位置。
private
在信息隐藏方面并不是那么好,因为它并没有真正隐藏任何信息。在重载成员函数的情况下,这可能是一个真正的问题。如果基类具有名为base::foo(double)
的公共成员并且您创建了私有derived::foo(int)
,则这不是错误。但是,重载解析只会找到derived::foo
,即使它是私有的。
我还要指出,隐藏信息的正确方法是pimpl idiom
答案 4 :(得分:0)
使用私有属性并通过getter和setter访问它们的另一个好处是,您可以使用这些函数在值实际设置之前对其进行操作。
这是一个例子。在Doctrine中 - 用PHP编写并用于与数据库交互 - 您创建一个包含要发送到数据库的值的对象。添加的数据通常来自表单。在数据库中,某些值可以为null。显然,如果表单中的值为空,则应将该值设置为null。但这不是它的工作原理 - 它只是被设置为一个空字符串,并且你没有得到你想要发送到数据库的空值。
为了使这项工作正常,你可以设置你的setter函数:
public function setName($name)
{
if ($name === '') {
$this->name = null;
} else {
$this->name = $name;
}
return $this;
}
如您所见,函数检查空字符串,然后将类的$ name属性设置为null(如果是这种情况)。然后将此空值发送到数据库,而不是空字符串。
如果您在许多地方使用该方法,这将特别有用。没有它,您必须检查每次的空值 。通过对班级的设定者进行检查,可以更容易,因为您不必考虑它。