所以我从来没有完全理解使用私有的好处

时间:2013-07-06 15:22:58

标签: c# java c++

所以尽管我的单一课程是编程课程,但他们从未真正解释过它,甚至我用Google搜索了很多次,我从来没有完全理解它。就安全性而言,它更好吗?

我正在尝试编写一个多类系统,并将所有访问修饰符更改为public,否则将无法访问。

有人可以详细解释一下,并尝试让它易于理解吗?

谢谢你们

5 个答案:

答案 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(如果是这种情况)。然后将此空值发送到数据库,而不是空字符串。

如果您在许多地方使用该方法,这将特别有用。没有它,您必须检查每次的空值 。通过对班级的设定者进行检查,可以更容易,因为您不必考虑它。