15

我显然对这些概念是全新的。我只是不明白您为什么要限制对属性或方法的访问。看来您只是根据预期的结果编写代码。为什么要创建私有方法而不是简单地不调用该方法?是用于迭代对象创建(如果我说得对的话)、多开发人员的情况(不要弄乱其他人的工作),还是只是为了不意外弄乱自己的工作?

4

8 回答 8

8

我们创建私有方法,这样我们类的消费者就不必关心实现细节——他们可以专注于我们的类为他们提供的一些漂亮的东西。

此外,我们有义务考虑公共方法的所有可能用途。通过将方法设为私有,我们减少了一个类必须支持的特性数量,并且我们有更多的自由来改变它们。

假设您有一个Queue班级 - 每次调用者将项目添加到队列时,可能需要增加队列的容量。由于底层实现,设置容量并非易事,因此您将其分解为一个单独的函数以提高函数的可读性Enqueue。由于调用者不关心队列的容量(您正在为他们处理),您可以将方法设为私有:调用者不会被多余的方法分散注意力,您不必担心调用者会做一些荒谬的事情到容量,您可以随时更改实现,而不会破坏使用您的类的代码(只要它仍然在您的类定义的有限用例内设置容量)。

于 2010-05-26T14:08:10.210 回答
8

您的最后两点非常准确-您不需要多个开发人员来弄乱您的东西。如果你在一个项目上工作的时间足够长,你会意识到你已经忘记了很多你在开始时所做的事情。

隐藏某些内容的最重要原因之一是您以后可以安全地更改它。如果一个字段是公开的,并且几个月后您想更改它,以便每次该字段更改时都会发生其他事情,那么您就有麻烦了。因为它是公开的,所以无法知道或记住有多少其他地方直接访问了该字段。如果它是私有的,你可以保证它不会在这个类之外被触及。您可能有一个公共方法围绕它,您可以轻松更改该方法的行为。

一般来说,你公开的东西越多,你就越需要担心与其他代码的兼容性。

于 2010-05-26T14:12:22.933 回答
7

这一切都归结为封装。这意味着隐藏类的内部,只关心它的作用。如果你想要一个信用卡处理类,你并不真正关心它“如何”处理信用卡。你只是想能够去:$creditCardProcessor->charge(10.99, $creditCardNumber);并期望它能够工作。

通过将某些方法设为公开,而将其他方法设为私有或受保护,我们为其他人留下了进入方式,以便他们知道从哪里调用代码是安全的。公共方法和变量称为“接口”。

对于任何类,您都有一个implementation。这就是班级履行职责的方式。如果是冰沙制作类,该类如何添加成分,添加什么成分等都是实现的一部分。外部代码不应该知道和/或关心实现。

类的另一面是它的接口。接口是类的开发人员打算由外部代码调用的公共方法。这意味着您应该能够调用任何公共方法并且它将正常工作。

于 2010-05-26T14:16:08.360 回答
5

使用封装有几个原因,其中一个最强的原因是:想象一下使用由其他人编写的大型复杂库。如果每个对象都不受保护,您可能会在不知不觉中访问或更改开发人员从未打算以这种方式操作的值。

隐藏数据使程序更容易概念化和更容易实现。

于 2010-05-26T14:09:27.160 回答
4

这都是关于封装的。方法是私有的,可以完成内部繁琐的工作,同时公开使事情变得简单的优雅功能。例如,您可能有一个 $product->insert() 函数,它利用 4 个内部函数来验证单例 db 对象,使查询安全等 - 这些是不需要公开的内部函数,如果调用,可能会混乱建立其他结构或流程,您,开发人员,已经到位。

于 2010-05-26T14:09:57.713 回答
2

多个开发人员的情况(不要弄乱其他人的工作),或者只是为了避免意外弄乱自己的工作?

主要是这两件事。将方法公开表示“这是其客户应该如何使用该类”,将其设为私有表示“这是一个实现细节,可能会在没有警告的情况下更改,客户不应关心”并迫使客户遵循建议。

对于不熟悉它的人(很可能是它的原作者,在 6 个月内第一次看到它)来说,一个有一些有据可查的公共方法的类比一个所有东西都是公开的,包括所有你不关心的小实现细节。

于 2010-05-26T14:16:04.970 回答
1

它使协作更容易,您告诉类的用户哪些部分不应该经常更改,并且您可以保证如果他们只使用公共方法,您的对象将处于有意义的状态。

它不需要像区分 private/public/whatever 那样严格(我的意思是由语言强制执行)。例如,在 Python 中,这是通过命名约定来完成的。你知道你不应该弄乱任何标记为不公开的东西。

于 2010-05-26T14:16:24.443 回答
0

例如 - 私有/受保护方法可能是在另一个(公共)方法中调用的某个类的一部分。如果该部分在更多公共方法中被调用,那是有道理的。但是您不希望在其他任何地方调用这些方法。

与类属性完全相同。是的,你可以编写所有公开的课程,但那有什么乐趣呢?

于 2010-05-26T14:14:08.513 回答