当我们谈论抽象时,我们在谈论什么
依据词性不同,抽象主要有两种意思:
1:作为一个动词(严格说应该是抽象化):抽取出某个实体或者非实体概念的某个或者某些属性。
2:作为一个形容词:与具体是反义词,概念分为实体概念和非实体概念,实体概念在物理世界中有对应的实体,非实体概念则没有。只有非实体概念才可以用抽象这个形容词来描述,实体概念则不能描述,比如我可以说心灵这个非实体概念抽象,但我不能说足球这个实体概念抽象。抽象的概念不能通过实体接触来把握,只能通过逻辑思维进行处理。
在科学和工程中我们谈论的抽象通常是第一种意义,在日常生活中通常是第二种意义,在此主要分析作为动词的抽象,即抽象化。 所有抽象的主要目的都是减轻复杂度 。根据对对象所抽取出的属性的不同可以分为以下几种。
1:黑箱化。即仅抽取出对象的输入接口以及接口能够接受的输入方式、输出结果(预期目标)、输入输出的关系这三个属性,隐藏起从输入到输出的实现细节。例子有:
风扇就是一个黑箱,输入接口是按钮,接口的输入方式是按压,输出结果是扇风。
编程中封装即是一种典型的黑箱化。
复杂系统减少复杂度的基本方法:创造基本元素→组合基本元素形成复合对象→将复合对象黑箱化(命名,确定输入接口以及输入方式,输出结果,输入输出关系)。编程语言的过程抽象和数据抽象均采用此方法,比如将求平方根的过程定义为一个函数,在使用时就不必考虑输入的数据是如何从基本四则运算一步一步得到最终结果。电路系统的形成也是采用此方法,利用基本电子元器件构造出复杂元器件,然后将其抽象黑箱化。
相关知识见附注1和附注2
2:抽取 多个 事物的 共有的 性形成一种新事物并对新事物进行 命名(即归类) ,同时还需提供对新事物添加属性的方式从而能够通过添加特性来得到原事物。比如篮球,足球,乒乓球共性是其形状,抽取形状可以形成球的概念,通过对球添加不同的颜色,大小,表面花纹的属性可以得到三类原事物。新事物和原事物的关系只能用 包含/包含于 来描述,而不能用组成/被组成来描述(组合体并非由组件抽象出共性所得,比如黑箱和其组件的关系就只能用组成/被组成来描述)。这种抽象的目的也是为了减轻复杂度,比如有5个事物,各自具有5个属性,那需要掌握5个事物和25个属性,抽象这5个事物的3个共有属性形成新事物后只需要掌握6个事物和13个属性,从而使知识 层次化(树状结构) ,能够从更低复杂度的层次上把握大量的事物。比如有三个大型函数,它们除了在某一步调用了不同的函数来处理某一个数据以外其他部分都相同(比如),那么可以将这三个大型函数的共同部分写成一个新函数,而将那一步所调用的函数所谓新函数的参数,在使用时其传递所需的函数即可。大部分科学定律也是从大量的现象中用这种抽象得到的。这种抽象本质上是对某个属性的限制条件进行 泛化 以便更加形成具有一般性的概念,比如C语言中函数参数的取值限制为数据,在C++,Java,Python,lisp等进一步发展的语言中放宽了这个限制,函数也可以作为参数,即对取值要求进行了泛化,形成了高阶函数的概念,而C语言中的函数则作为高阶函数参数 特化 的一个概念。
3: 根据目标 抽取 单个 事物的某些属性( 黑箱是一种特例 )。最常用于对现实进行建模,根据模型的目的选择所抽取的性质,比如要对小球进行建模从而模拟小球的运动状态,只需抽象出小球的质量,速度,加速度这几个性质即可。
附注1:维基百科中黑箱的定义
黑箱指一个仅知道 输入输出关系 而不知道 内部结构 的系统或设备。与之相反的是白箱。 例子有:
- 物理学 / 电子工业 中,指未知内部结构,只露出若干接头的 电路 ,如 二端口网络 ;
- 计算机科学 中,指内部工作方法不清楚的 程序 。(也许是 闭源软件 )
- 系统工程学 中指一个系统只能根据其外部表征来推测其系统功能,而不能了解其内部详细构造。例如 中医 就是一个黑箱系统,尤其是经络结构。
附注2:维基百科中计算机科学对抽象的定义。