1

我读过其他讨论抽象和封装的帖子,但我不确定我是否理解它们;或者也许我理解他们,但对他们内容的清晰性感到不满意。以下是我对抽象和封装的理解。它们在哪些方面准确/不准确/完整/不完整?

“抽象是程序员创建的数据类型,用于在原始数据类型不足时扩展语言。与原始数据类型一样,抽象具有列出它们所需的输入和返回的输出的规范,但规范并没有让程序员不知所措。函数和用于对输入进行操作的变量。类是抽象的一个例子。API 是抽象的另一个例子。

“封装是抽象数据类型(即类)彼此隔离的状态,因此它们的方法、函数和变量不会相互冲突,因此程序员可以轻松地在其他程序中重用现有的类,而不必担心这样做所以会干扰程序的其余部分(假设程序员正确地提供了所需的输入并正确处理了获得返回的数据)。”

4

3 回答 3

2

我更喜欢 Robert C. Martin 在APPP中的定义:

抽象是对无关事物的消除和对本质的放大。

于 2015-06-14T17:52:13.220 回答
0

我想说你的理解是正确的......所以,我犹豫要更具体地发表评论。

但是,如果我要评论,我可能会说“数据类型可用于实现抽象......”,而不是“抽象是数据类型......”,因为抽象可以存在于软件之外(这让我很伤心比如说 :-)。

但这只是吹毛求疵。我想你明白了。我希望我能做到,经过 36 年的编码……主要是使用支持合理抽象级别的语言(PL/1、Pascal、C、C++、Java)。

然而,工业界有很多聪明的人,他们没有软件抽象的概念,并认为它自命不凡。

就个人而言,我认为良好的清晰无误称的抽象是可靠软件工程的关键技术成分。

于 2015-06-14T00:06:42.880 回答
0

我以前从未遇到过封装的定义。这个定义听起来更像是命名空间的用途。我总是读到封装纯粹是关于限制对代码某些组件的访问的能力,例如 OOP 语言中的访问修饰符。但是,维基百科上似乎有两种封装定义,这对我来说是个新闻:

封装是将数据和功能打包成单个组件。在大多数面向对象的编程语言中,使用类支持封装特性,但也存在其他替代方案。它允许通过构建不可穿透的墙来选择性地隐藏对象中的属性和方法,以保护代码免受意外损坏。

在编程语言中,封装用于指代两个相关但不同的概念之一,有时指的是它们的组合:

  1. 一种用于限制对某些对象组件的访问的语言机制。
  2. 一种语言结构,有助于将数据与操作该数据的方法(或其他功能)捆绑在一起。

一些编程语言研究人员和学者单独使用第一个含义或与第二个含义结合使用作为面向对象编程的显着特征,而其他提供词法闭包的编程语言将封装视为与面向对象正交的语言的一个特征。

第二个定义的动机是,在许多 OOP 语言中,组件的隐藏不是自动的,也不是可以被覆盖的。因此,喜欢第二种定义的人将信息隐藏定义为一个单独的概念。 资源

所以,我想我一直根据第 1 点来定义封装,但看起来有些人将其定义为将方法和数据捆绑在一起的能力,以及第 1 点“信息隐藏”。

于 2015-06-14T15:26:07.130 回答