编程中抽象是什么意思?

我正在学习python,但不确定是否理解以下语句:“该函数(包括其名称)可以捕获我们对问题的看法或抽象。”

这是我不理解编程含义的粗体部分。 引用来自[http://www.openbookproject.net/thinkcs/python/english3e/functions.html]

像计算机科学家一样思考,第3版。

谢谢 !

copper asked 2020-07-04T03:42:44Z
7个解决方案
140 votes

抽象是所有计算机科学中的核心概念。 没有抽象,我们仍将使用机器代码进行编程,或者更糟糕的是首先没有计算机。 所以恕我直言,这是一个非常好的问题。

什么是抽象

抽象事物意味着给事物命名,以便该名称抓住函数或整个程序的核心作用。

您参考的书中给出了一个示例,其中说

假设我们正在使用海龟,而我们需要执行的一项常见操作是 画正方形。 “画一个正方形”是一种抽象或思想上的块, 一些较小的步骤。 因此,让我们编写一个函数来捕获 这种“基本要素”的模式:

暂时忘掉海龟,只想画一个正方形即可。 如果我告诉您在纸上画一个正方形,您会立即知道该怎么做:

  • 绘制一个正方形=>绘制一个所有边长均相同的矩形。

您可以执行此操作而无需其他问题,因为您完全知道正方形是什么,而无需我逐步告诉您。 在这里,“正方形”一词是“绘制所有边长均相同的矩形”的抽象。

抽象深入

但是等等,你怎么知道什么是矩形? 好吧,这是以下内容的另一种抽象:

  • 矩形=>绘制两条长度相同的彼此平行的线,然后添加两条垂直于其他两条直线的平行线,它们的长度也相同,但长度可能与前两条长度不同。

当然,它不断进行-线,平行,垂直,连接都是众所周知概念的抽象。

现在,想象一下,每次要绘制矩形或正方形时,都必须给出矩形的完整定义,或者说明直线,平行线,垂直线和连接线-这样做花费的时间太长。

抽象的真正力量

那是抽象的第一个力量:它们使交谈和完成事情变得容易得多。

抽象的第二种力量来自于可组合性的出色特性:定义了抽象之后,就可以组成两个或更多个抽象以形成一个新的更大的抽象:说您已经厌倦了绘制正方形,但是您确实想绘制一所房子 。 假设我们已经定义了三角形,那么我们可以定义:

  • 房子=>画一个正方形,上面有一个三角形

接下来,您要一个村庄:

  • 村庄=>挨着画多栋房子

哦,等等,我们想要一个城市-我们有一条新的概念街:

  • city =>吸引许多彼此靠近的村庄,用更多的房屋填充空白空间,但为街道留出空间
  • 街道=>(街道的某些定义)

等等...

这一切如何适用于编程?

如果在计划程序(称为分析和设计的过程)的过程中,您找到了要解决的问题的良好抽象,那么程序就会变得更短,因此更容易编写,而且也许更重要的是,它更易于阅读。 这样做的方法是尝试掌握定义问题的主要概念,例如在绘制房屋的(简化)示例中,这是正方形和三角形,在绘制乡村的过程中是房屋。

在编程中,我们将抽象定义为函数(以及其他一些构造,如类和模块,但现在让我们集中讨论函数)。 函数本质上是命名一组单条语句,因此函数本质上是一种抽象-有关详细信息,请参见本书中的示例。

这一切的美丽

在编程中,抽象会影响生产力。 这就是为什么通常将常用功能收集到库中以供其他人重用的原因。 这意味着您不必担心细节,只需要了解如何使用现成的抽象即可。 显然,这应该会使您更轻松,因此您可以更快地工作,从而提高工作效率:

例:

想象有一个名为“ nicepic”的图形库,其中包含上述所有抽象的预定义功能:矩形,正方形,三角形,房屋,村庄。

假设您要基于上述抽象来创建一个程序,该程序可以绘制一幅漂亮的房子图,那么您所要做的就是:

import nicepic
draw_house()

因此,仅需两行代码即可进行更详细的说明。 那不只是美好的吗?

希望这可以帮助。

miraculixx answered 2020-07-04T03:45:17Z
6 votes

了解抽象的一种好方法是通过抽象类。

假设我们正在编写一个模拟房屋的程序。 房子将有几个不同的房间,我们将它们表示为对象。 我们为浴室,厨房,客厅,饭厅等定义一个类。

但是,所有这些都是“房间”,因此共享多个属性(门/窗户的数量,平方英尺等),但是,“房间”不可能永远独立存在……它总是某种类型的房间。

然后有意义的是创建一个名为Room的抽象类,它将包含所有房间共享的属性,然后让Kitchen,Living Room等类继承该抽象类Room。

房间的概念是抽象的,仅存在于我们的脑海中,因为实际存在的任何房间都不只是一个房间,而是一个房间。 它是一间卧室,一间客厅或一间教室。

我们希望我们的代码能够代表“心理分块”。 它使一切变得更加整洁和易于处理。

dursk answered 2020-07-04T03:46:00Z
3 votes

维基百科上定义:Abstraction_(computer_science)

抽象试图从通用模式中排除细节,以便 程序员可以接近人类思想水平工作,而省去了 细节在实践中很重要,但不存在问题 解决了。

基本上是删除问题的细节。 例如,绘制一个正方形需要几个步骤,但是我只想要一个绘制正方形的函数。

Justin Poehnelt answered 2020-07-04T03:46:29Z
1 votes

假设您编写了一个函数,该函数接收一堆文本作为参数,然后读取配置文件中的凭据,然后使用这些凭据连接到SMTP服务器并使用该文本发送邮件。

该函数应命名为sendMail(text),而不是parseTextReadCredentialsInFileConnectToSmtpThenSend(text),因为它可以更轻松地向您自己以及向同事或用户展示API时以这种方式表示其功能……即使第二个名称更准确 ,第一个是更好的抽象。

bedane answered 2020-07-04T03:46:53Z
1 votes

描述事物的最好方法是使用示例:

函数不过是一系列完成任务的命令。 基本上,您可以组织执行单项操作的代码块。 可以通过您的程序一遍又一遍地重复使用那件事。

现在,您的函数可以执行此操作,您应该对其进行命名,以便可以立即识别其功能。 命名后,只需调用其名称即可在所有地方重复使用它。

def bark():
  print "woof!"

然后,要使用该功能,您可以执行以下操作:

bark();

如果我们希望它吠叫四次会怎样? 好吧,你可以写bark(); 4次。

bark();
bark();
bark();
bark();

或者,您可以修改函数以接受某种类型的输入,以更改其工作方式。

def bark(times):
    i=0
    while i < times:
        i = i + 1
        print "woof"

然后我们可以只调用一次:

bark(4);

当我们开始谈论面向对象编程(OOP)时,抽象的含义有所不同。 稍后您会发现该部分:)

Steven Leggett answered 2020-07-04T03:47:45Z
0 votes

抽象:在硬件和软件上都是一个非常重要的概念。

重要性:我们人类无法始终记住所有事物。 例如,如果您的朋友快速讲出30个随机数字,并要求您将所有数字都加起来,那么您将不可能。 原因? 您可能无法记住所有这些数字。 即使您将这些数字写在纸上,也可能一次累加最右边的数字,一次忽略左边的数字,然后又忽略最右边的数字,再加上最右边的数字。

它表明,人类一次可以将注意力集中在某个特定问题上,而忽略那些已经解决的问题,而将焦点转移到尚待解决的问题上。

忽略不太重要的事情并专注于最重要的事情(暂时,特别是上下文)称为抽象

这是抽象在编程中的工作方式。

以下是世界著名的C语言hello世界程序:

//C hello world example hello.c
#include <stdio.h>

int main()
{
  printf("Hello world\n");
  return 0;
}

这是最简单的程序,通常是程序员编写的第一个计算机程序。 当您在命令提示符下编译并运行该程序时,输出可能如下所示:

enter image description here

这是严重的问题

  1. 计算机只了解二进制代码,它如何运行类似英语的代码? 您可能会说您是使用编译器将代码编译为二进制的。 您是否编写了编译器以使程序正常工作? 不,您不需要。 您在Linux系统上安装了GNU C编译器,并通过给出以下命令来使用它:

gcc -o你好hello.c

它将您的英语(如C语言)代码转换为二进制代码,您可以通过提供以下命令来运行该代码:

。/你好

因此,对于用C程序编写应用程序,您无需知道C编译器如何将C语言代码转换为二进制代码。 因此,您使用了GCC编译器作为抽象。

  1. 您是否为main()和printf()函数编写了代码? 否。两者都已经被其他人用C语言定义。 当我们运行C程序时,它将寻找main()函数作为程序的起点,而printf()函数在计算机屏幕上打印输出,并且已经在stdio.h中定义了,因此我们必须将其包含在程序中。 如果尚未编写这两个功能,我们就必须自己编写它们以打印两个单词,而计算机将是地球上最无聊的机器。 再次在这里使用抽象,即您不需要知道printf如何在监视器上打印文本,而您只需要知道如何将输入提供给printf函数,从而显示所需的输出即可。

为了简单起见,我没有扩展对操作系统,内核,固件和硬件抽象的答案。

要记住的事情:

在进行编程时,您可以通过多种方式使用抽象来简化程序。

示例1:您可以在程序中使用常量来抽象PI 3.14159的值,因为对于程序的其余部分而言,PI比3.14159更容易记住

示例2:您可以编写一个返回给定数字平方的函数,然后包括您在内的任何人都可以使用该函数,方法是将其输入作为参数并从中获取返回值。

示例3:在类似于Java的面向对象编程(OOP)中,您可以定义一个封装数据和方法的对象,并且可以通过调用其方法来使用该对象。

示例4:许多应用程序为您提供API,您可以使用该API与该应用程序进行交互。 使用API方法时,您无需知道如何实现它们。 这样就存在抽象。

通过所有示例,您可以认识到抽象的重要性以及如何在编程中实现抽象。 要记住的关键一件事是抽象是上下文的,即根据上下文不断变化

Bubba Yakoza answered 2020-07-04T03:49:40Z
0 votes

简单地说,我可以说:抽象的本质是在提取必要的属性的同时省略不必要的细节。 但是,为什么我们要忽略无关紧要的细节呢? 关键动机是防止变更的风险。

Alireza Rahmani Khalili answered 2020-07-04T03:50:01Z
translate from https://stackoverflow.com:/questions/21220155/what-does-abstraction-mean-in-programming