抽象是计算机科学中的核心概念。没有抽象,我们仍然会编写机器码或者更糟糕的是根本没有计算机。所以在我看来,这是一个非常好的问题。
什么是抽象?
将某物进行抽象意味着给一些事物命名,使得这个名称捕捉到了函数或整个程序所做的核心内容。
你引用的书中提供了一个例子:
假设我们正在与海龟(turtles)一起工作,而我们需要完成的常见操作之一是绘制正方形。“绘制正方形”是一个抽象,或者说是一个“心理块”,它由许多较小的步骤组成。因此,让我们编写一个函数来捕获这个“构建块”的模式:
暂时忘记海龟,想象一下在纸上画一个正方形。如果我告诉你画一个正方形,你马上就知道该怎么做:
你可以毫不犹豫地完成这个任务,因为你学过什么是正方形,而不需要我一步步地告诉你。这里,“正方形”这个词就是“画一个所有边长相等的矩形”的抽象。
抽象深入人心
但是,你怎么知道什么是“矩形”呢?这又是根据以下概念的抽象:
当然这个过程还可以继续下去——线段、平行、垂直、连接都是众所周知的概念的抽象。
现在,想象每次要画一个矩形或正方形时,你都必须提供一个完整的定义,或者解释线段,平行线段,垂线和连接线——那会花费太多时间了。
抽象的真正力量
这就是抽象的第一个力量:它们使交流和完成任务变得更容易。
抽象的第二个力量来自于其好的组合性质:一旦你定义了抽象,你可以将两个或多个抽象合并成一个新的、更大的抽象:例如,假设你厌倦了画正方形,但真的想画一座房子。假设我们已经定义了“三角形”,那么我们可以这样定义:
接下来,你想要一个村庄:
哦对了,我们还需要一个城市——而且我们有一个新概念街道:import nicepic
draw_house()
这只需要两行代码,就可以获得更为复杂的东西。这不是很棒吗?
drawSquare
的函数,它将具有绘制正方形的步骤,通过组合抽象,你可以有另一个函数drawHouse
,它使用drawSquare
和drawTriangle
,drawHouse
不关心drawSquare
是如何实现的,它只关心结果。对于drawVillage
和drawCity
也是一样的。 - Spoody简单来说,抽象的本质是提取必要的属性,省略不必要的细节。但为什么我们需要省略不必要的细节呢?关键原因是为了防止变化的风险。
描述某事的最好方法是使用示例:
函数只不过是一系列命令,用于完成任务。基本上,您可以组织一段代码块,执行单个操作。该单个操作可以在整个程序中重复使用多次。
现在,您的函数执行此操作,应将其命名,以便立即识别其功能。一旦命名,您只需通过调用其名称即可在各处重复使用它。
def bark():
print "woof!"
bark();
bark();
bark();
bark();
bark();
或者您可以修改函数以接受某种类型的输入,从而改变其工作方式。
def bark(times):
i=0
while i < times:
i = i + 1
print "woof"
然后我们只需要调用一次:
bark(4);
当我们开始谈论面向对象编程(OOP)时,抽象化指的是一些不同的东西。您稍后会发现这一部分 :)
抽象:在硬件和软件中都是非常重要的概念。
重要性:我们人类无法一直记住所有事情。例如,如果你的朋友迅速说出30个随机数字并让你将它们全部相加,你可能做不到。原因?你可能无法记住所有这些数字。即使你将这些数字写在纸上,你也会逐个添加最右边的数字,忽略左边的数字,并在另一次忽略最右边的数字,以添加最右边的数字。
这表明在某个时刻,我们人类可以关注某些特定问题,同时忽略已经解决的问题,将注意力转向未解决的问题。
忽略不重要的事情,集中精力处理最重要的事情(暂时和特定情境下)被称为抽象
以下是程序中如何使用抽象。
下面是世界著名的C语言hello world程序:
//C hello world example hello.c
#include <stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
以下是重要的问题
gcc -o hello hello.c
它将你的类似英语的C语言代码转换为二进制代码,然后你可以通过以下命令运行该代码:
./hello
因此,编写C程序应用程序时,你不需要知道C编译器如何将C语言代码转换为二进制代码。所以你使用GCC编译器作为抽象层。
出于简单起见,我没有展开操作系统、内核、固件和硬件的抽象概念。
需要记住的事情:
在编程时,您可以使用各种方式来使用抽象化使程序简单易用。
示例1:您可以使用一个常量来抽象化PI值3.14159,因为PI比3.14159更容易记忆。
例子2:你可以编写一个函数,返回给定数字的平方,然后任何人,包括你自己,都可以通过将其输入作为参数并从中获取返回值来使用该函数。
calculateFooBar(x, y)
,你就知道(或者至少有一些想法)这个(可能很复杂的)代码是做什么的,而不需要去阅读和理解实现该函数的所有代码。 - tobias_k