因此,当我一直在阅读/学习类及其中的方法时,我几乎没有发现将方法声明为公共与私有之间的实际区别。
我知道区别在于私有类只能在类内访问,而公共方法可以从类外的代码(其他类、函数)中访问。但我真正想知道的是:
- 为什么在部署应用程序时想要/不想以一种或另一种方式声明它?
- 是否有最佳实践可以指导是否将方法声明为公有或私有?
另外,我不知道这是否重要,但我主要在 Web 应用程序环境中学习 VB.Net 和 C#,因此具体说明会有所帮助。
封装意味着您应该将每个类视为提供服务的机器。例如,椅子可以让您坐在上面,或者割草机可以让您修剪草坪。
私有方法与机器的内部工作有关。相反,公共方法与您(其他类)如何与机器交互有关。
示例一: 椅子...
坐在椅子上,你不需要知道填充物的体积或订书钉的数量,你基本上只需要知道它是否被占用,是否稳定。
示例二: 割草机...
对于割草机,您需要知道它是否有足够的燃料(或已插入电源),刀片是否锋利,以及是否能够打开它。
结论:
因此,当您开发时,您将看到的只是...
示例一: Chair.Sit、Chair.IsStable 和 Chair.IsOccupied
或者
示例二:割草机.GetFuelLevel、割草机.IsBladesSharp、割草机.TurnOn、割草机.TurnOff
作为开发人员,您不必考虑室内装潢中的螺纹数量、油箱盖的颜色、刀片的 RPM 数量或椅子是否粘在一起或装订在一起。这种区别使得将您的应用程序放在一起变得更加容易,而不会被细节淹没。此外,它允许程序员只公开必要的信息,从而增加了安全级别。正如约翰所提到的,这可以防止 Person 类在不应该调用 Lawnmower.Combust(fuel) 时调用。
如果该方法是私有的,那么您不必考虑外部类错误地调用它。
这样做的好处之一是它允许将类的接口(它的公共部分)与其实现分开。如果没有人知道你是如何实现你的类的(也就是说,如果没有取决于你如何实现它的代码),那么你可以自由地改变你实现它的方式,而不会破坏任何其他代码。
它是面向对象编程中最重要的原则之一——封装。
一个类通常提供一个(公共)接口。例如(伪代码):
class Rectangle {
private length;
private width;
public getPerimeter() {
// return calculatePerimeterOld();
return calculatePerimeterNew();
}
private calculatePerimeterOld() {
// old variant
}
private calculatePerimeterNew() {
// Here the perimeter is caltulated.
// so: perimeter = 2 * (length + width)
// or so: perimeter = 2 * (length) + 2 * (width)
// or maybe so: perimeter = length + width + length + width - (0.5 * length) + 2 * 0.25 * length)
return perimeter;
}
}
我可以随意更改我的私有方法。我可以用其他方法重命名或替换它们。但是我的公共界面将保持不变——它必须保持不变,因为这是我签署的合同,当我将方法定义为public
. 一切,签署的private
都是我的“黑匣子”,我可以在那里做任何我想做的事。
这是主要原因。另一个原因是,我们不应该向我们类的用户(-s)提供他们不需要的方法/信息。太多(信息)不好。
如果您正在开发一个仅由您维护的一次性网站,您可能会发现公共和私有功能的概念是不必要的。
但是,如果您将软件交付给其他人,并且他们构建在您的软件之上,那么这绝对是一个至关重要的概念。
可以把它想象成一台物理机器,里面有上千个旋钮和开关,但装在一个漂亮的盒子里,外面只有几个清晰标记的旋钮。
但是,如果它是由单个开发人员维护的一次性网站,那么这些差异就不那么重要了。