过程化和面向对象封装



我搜索了关于封装概念的完整描述,我发现找到的答案在某种程度上就像拼图的碎片,必须放在一起。我发现这个概念的描述如下:

封装是使类中的字段为私有的技术并通过公共方法提供对字段的访问。如果一个字段是声明为私有,它不能被类外的任何人访问,从而隐藏类中的字段。出于这个原因,封装也被称为数据隐藏。(源tutorialspoint)

一种语言机制,用于限制对某些对象的访问一种便于数据捆绑的语言结构使用对该数据进行操作的方法(或其他函数)。(源维基百科)

封装允许一个对象将它的接口与它的接口分离实现。对象的数据和实现代码都隐藏在它的接口后面。

封装是一种技术。这可能是帮助,也可能不是抽象,但它肯定是关于信息隐藏和/或组织。它要求以某种方式对数据和功能进行分组当然,好的OOP实践要求它们应该按照抽象。然而,还有其他的用途只是帮助
可维护性等(source stackoverflow)

在过程编程中,我认为主要是相同的,这里最好的例子是FILE结构体,它仅由文件函数创建或修改。

我想知道还可以添加什么来完整地了解这个编程概念,因为了解它非常有用,特别是在设计API或面试问题时。

你是对的:封装是一种通用的技术,它允许实现信息隐藏的原则,因此在计算机科学的各个部分,甚至在其他领域。

您已经提到了FILE指针。另一个简单的C示例是任何API都需要一个指向结构体的指针而不声明它。接口用户不需要知道这个结构体是如何实现的,只有接口实现需要知道。因此,通过将所需的操作(传递结构体的信息)封装到传递指针的操作中,可以隐藏结构体的信息。

另一个例子是网络协议:当请求这个页面时,浏览器使用HTTP,而HTTP又使用传输控制协议TCP。在下一层,只有带有效载荷的互联网协议IP,没有TCP。在这种情况下,TCP只是封装在IP有效负载中的一些不需要的信息。在更低的层次上,没有IP,只有MAC, IP是封装在MAC负载中的一些不需要的信息。

和一个可能稍微牵强的现实例子:通过邮件发送一个泰迪熊。邮政服务的接口需要一个包含地址信息的框。它不会往盒子里看,也不会看到熊。当收件人收到包裹时,他会打开它,他可以拥抱熊。现在想象一下,邮政服务计划给你寄泰迪熊。这个接口(bear + address)的可重用性如何?少。相反,我们应用抽象并创建一个接口(盒子+地址)。我们通过把我们的泰迪熊放进一个盒子来进行封装,隐藏我们实际发送给泰迪熊的信息。可怜的泰迪。

封装就是将您的系统/应用程序拆分为定义良好的高内聚部分。创建函数/过程的简单事实就是封装。

OOP语言通常提供改进/实现封装的方法,例如可见性修饰符(信息隐藏原则)。

封装是OO所基于的关键原则之一,因此许多人错误地认为它是OO独有的特性。

还有一件事,这是错误的:

封装是使类中的字段私有并通过公共方法提供对这些字段的访问的技术。

这是信息隐藏原理

我将用一个愚蠢的简单示例来展示它。让我们定义一个circle类:

public class Circle {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    public double getRadius() {
        return radius;
    }
    public double getPerimeter() {
        return 2 * radius * Math.PI;
    }
}

请注意,radius是一个私有字段,不能从外部直接访问。这是封装。封装允许在类已经被其他类设计和使用之后改变主意,而不会破坏这些其他类和客户端:

public class Circle {
    private double diameter;
    public Circle(double radius) {
        this.diameter = radius * 2;
    }
    public double getRadius() {
        return diameter / 2;
    }
    public double getPerimeter() {
        return diameter * Math.PI;
    }
}

对象的状态现在以不同的方式表示。但是由于这个状态被封装到对象中,并且对象的接口(公共方法)没有改变,客户端仍然可以像什么都没有改变一样使用对象。

如果没有使用封装,并且半径字段是公共的,你不能通过删除半径并用直径替换它来改变类的实现,因为每个已经使用类的人都会使用半径字段

最新更新