程序和OO封装

时间:2013-05-20 08:23:04

标签: design-patterns encapsulation

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

  

封装是将类中的字段设为私有的技术   并通过公共方法提供对田地的访问。如果是一个领域   声明私有,它不能被课外的任何人访问,   从而隐藏了班级中的字段。为此原因,   封装也称为数据隐藏。 (资源   tutorialspoint

     

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

     

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

     

封装是一种技术。它可能是也可能不是为了帮助   抽象,但它肯定是关于信息隐藏和/或   组织。它要求数据和功能以某种方式分组 -   当然,良好的OOP实践要求将它们归为一类   抽象。但是,还有其他用途可以帮助   可维护性等(来源stackoverflow

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

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

3 个答案:

答案 0 :(得分:3)

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

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

另一个例子是网络协议:当您请求此页面时,您的浏览器使用HTTP,而HTTP又使用传输控制协议TCP。在下面的级别上,只有具有有效负载的Internet协议IP,没有TCP。在那里,TCP只是封装在IP有效载荷中的一些不需要的信息。在下面的级别上,没有IP,但MAC和IP是封装在MAC有效负载中的一些不需要的信息。

可能略微牵强附近的现实生活中的例子: 通过邮件发送泰迪熊。邮政服务的界面需要一个包含地址信息的方框。它不会看到盒子,也不会看到熊。当收件人收到包裹时,他会打开它,他可以抱着熊。现在想象邮政服务计划送你泰迪熊。这个接口(熊+地址)的可重用性如何?小。相反,我们应用抽象并创建一个接口(框+地址)。我们通过将我们的泰迪熊放入一个盒子中来应用封装,隐藏了我们实际发送泰迪熊的信息。可怜的泰迪。

答案 1 :(得分:2)

封装就是将您的系统/应用程序拆分为明确定义的高粘性部分。创建函数/过程的简单事实是封装。

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

封装是OO所基于的关键原则之一,因此很多人误以为它是一个专有的OO功能。

另一件事,这是错误的:

  

封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术。

这是信息隐藏原则

答案 2 :(得分:0)

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

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;
    }
}

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

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;
    }
}

现在,对象的状态表示不同。但是由于此状态被封装到对象中,并且对象的接口(公共方法)不会更改,因此客户端仍然可以使用该对象,就像没有任何更改一样。

如果未使用封装,并且radius字段是公共的,则无法通过删除半径来更改类的实现,并且替换为直径,因为已经使用该类的每个人都将使用radius字段。 / p>