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