2010-05-26 49 views
15

我显然是这些概念的全新。我只是不明白为什么你会限制访问属性或方法。看来你会根据预期的结果编写代码。为什么要创建一个私有方法而不是简单地不调用该方法?是否需要创建迭代对象(如果我正确地说明了这一点),多个开发人员的情况(不要混淆其他人的工作),或者只是为了不意外地搞乱自己的工作?我是OOP/PHP的新手。类的可见性和可扩展性的实用性是什么?

+0

Bah。有很多类似的答案! – 2010-05-26 14:17:54

回答

7

这一切都归结为封装。这意味着隐藏课堂的内部,只关心它的功能。如果你想拥有一个信用卡处理课程,你并不在乎它是如何处理信用卡的。你只是想能够去:$creditCardProcessor->charge(10.99, $creditCardNumber);,并期望它的工作。

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

对于任何职业,你有一个执行。这就是班级如何履行职责。如果是冰沙制作课程,班级如何添加配料,配料的添加等等,都是实施的一部分。外部代码不应该知道和/或关心实施。

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

+0

感谢您提供明确的定义和示例。 – 2010-05-26 14:50:01

8

我们创建私有方法,以便我们类的消费者不必关心实现细节 - 他们可以专注于我们的类为他们提供的几件漂亮的事情。

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

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

5

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

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

4

这是关于封装。方法是私人的,可以做内在的工作,同时暴露优雅的功能,使事情变得简单。例如。你可能有一个$ product-> insert()函数,它使用4个内部函数来验证单例数据库对象,使查询安全等 - 这些内部函数不需要公开,如果调用,可能会搞砸其他结构或流程,您,开发人员已经落实到位。

8

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

隐藏某物的最重要原因之一是,您可以安全地稍后更改。如果一个领域是公开的,几个月后你想改变它,这样每当领域发生变化时,就会发生其他事情,你会遇到麻烦。因为它是公开的,所以没有办法知道或记住有多少其他地方直接访问该字段。如果它是私人的,你有一个保证,它不会在这个班级以外被触及。你可能有一个围绕它的公共方法,你可以很容易地改变该方法的行为。

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

0

例如 - private/protected方法可能是在另一个(公共)方法中调用的某个类的一部分。如果这部分是以更公开的方式被调用的话,这是有道理的。然而你不希望这些方法在其他地方被调用。

这与类属性完全相同。是的,你可以写全民公开课,但最有趣的是什么?

2

多开发情况(不 弄乱其他人的工作),或者只是 所以你不会弄乱自己的工作 意外怎么办?

主要是这两样东西。公开一种方法说:“这就是这个班级应该如何被其客户使用”,使其私人说“这是一个实施细节,可能在没有预警的情况下发生变化,哪些客户不应该关心”,并强迫客户遵循咨询。

一个有一些有据可查的公共方法的类比不熟悉它的人更容易使用(这可能是它的原始作者,在6个月内首次查看它)是公开的,包括所有你不关心的小实现细节。

1

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

它不需要像私人/公共/任何(我的意思是由语言强制)区分那么严格。例如,在Python中,这是通过命名约定来完成的。你知道你不应该混淆标记为不公开的任何东西。