抽象在编程中意味着啥?

Posted

技术标签:

【中文标题】抽象在编程中意味着啥?【英文标题】:What does abstraction mean in programming?抽象在编程中意味着什么? 【发布时间】:2014-02-08 19:19:58 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

您的示例中抽象一词的用法/含义在编程世界内外都是相同的。 简单:如果您在代码中看到对函数的调用,例如calculateFooBar(x, y),您就知道(或至少知道)该(可能很复杂)代码的作用,而无需关心阅读并理解实现该功能的所有代码。 【参考方案1】:

如wikipedia: Abstraction_(computer_science)所定义

抽象试图从一个常见的模式中提取细节,以便 程序员可以在接近人类思维水平的情况下工作,而忽略 在实践中很重要的细节,但对于正在解决的问题并不重要 解决了。​​

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

【讨论】:

【参考方案2】:

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

该函数应命名为 sendMail(text),而不是 parseTextReadCredentialsInFileConnectToSmtpThenSend(text),因为这样更容易向您自己和在演示时表示它的作用给同事或用户的 API……虽然第二个名字更准确,但第一个是更好的抽象。

【讨论】:

【参考方案3】:

理解抽象的好方法是通过抽象类。

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

但是,所有这些都是房间,因此共享几个属性(门/窗的数量,平方英尺等)但是,房间永远不会单独存在......它总是会有一些 房间类型

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

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

我们希望我们的代码能够代表我们的“心理分块”。它让一切变得更整洁、更容易处理。

【讨论】:

【参考方案4】:

描述事物的最佳方式是使用示例:

函数只不过是完成任务的一系列命令。基本上你可以组织一大块代码来做一件事。这个单一的东西可以通过你的程序一遍又一遍地重复使用。

既然你的函数做了这件事,你应该给它命名,以便立即识别它的作用。一旦你命名了它,你可以通过简单地调用它的名字在整个地方重复使用它。

def bark():
  print "woof!"

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

bark();

如果我们想让它吠叫 4 次会怎样?那么你可以写 bark(); 4 次。

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

或者你可以修改你的函数来接受某种类型的输入,从而改变它的工作方式。

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

那么我们可以只调用一次:

bark(4);

当我们开始谈论面向对象编程 (OOP) 时,抽象意味着不同的东西。你稍后会发现那部分:)

【讨论】:

【参考方案5】:

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

什么是抽象

抽象某事意味着给事物命名,这样名字就抓住了一个函数或整个程序的核心。

你参考的书中给出了一个例子,上面写着

假设我们正在使用海龟,我们需要的常见操作是 画正方形。 “画一个正方形”是一种抽象,或者说是一个心理块, 一些较小的步骤。因此,让我们编写一个函数来捕获 这个“积木”的模式:

暂时忘掉海龟,想想画一个正方形。如果我告诉你画一个正方形(在纸上),你马上就知道该怎么做了:

画一个正方形 => 画一个所有边长相同的矩形。

您可以在没有其他问题的情况下做到这一点,因为您对 正方形 是什么了如指掌,无需我一步一步地告诉您。这里,square这个词是“画一个所有边长相同的矩形”的抽象

抽象深入

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

rectangle => 画两条相互平行、长度相同的线,然后添加另外两条垂直于另外两条线的平行线,同样长度相同,但长度可能与第一条不同二。

当然会一直这样下去——linesparallelperpendicularconnecting都是众所周知的概念的抽象

现在,想象一下,每次您想要绘制一个矩形或正方形时,您都必须给出矩形的完整定义,或者解释直线、平行线、垂直线和连接线——这将花费很长时间这样做。

抽象的真正力量

这是抽象的第一个力量:它们使谈话和完成事情变得更加容易。

抽象的第二个力量来自于可组合性的良好属性:一旦你定义了抽象,你可以组合两个或更多抽象来形成一个新的、更大的抽象: 说你已经厌倦了画正方形,但你真的想画一个房子。假设我们已经定义了三角形,那么我们可以定义:

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

接下来,你想要一个村庄:

村庄 => 绘制多个房屋并排

哦等等,我们想要一个城市——我们有一个新概念街道

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

等等……

这一切如何应用于编程?

如果在计划程序的过程中(称为分析和设计的过程),你发现你试图解决的问题有很好的抽象,你的程序会变得更短,因此更容易编写而且——也许更重要的是——更容易阅读。做到这一点的方法是尝试掌握定义问题的主要概念——就像在(简化的)绘制 house 的示例中,这是 squares 和 三角形,画一个村庄房屋

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

一切的美好

在编程中,抽象可以成就或破坏生产力。这就是为什么经常将常用函数收集到 中,以供其他人重用。这意味着您不必担心细节,您只需要了解如何使用现成的抽象即可。显然,这应该会让您的工作变得更轻松,这样您就可以更快地工作,从而提高工作效率:

示例

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

假设你想创建一个基于上述抽象的程序来绘制一幅漂亮的房子图片,你所要做的就是:

import nicepic
draw_house()

因此,只需两行代码即可获得更详细的信息。这不是很好吗?

希望这会有所帮助。

【讨论】:

你创造了我的概念。 这是一个关于抽象概念的很好的解释,但是我仍然不明白这与python类,函数等有什么关系。请您详细说明一下吗? @miraculix,所以如果我理解正确的话,抽象基本上是封装了一个专用任务的所有实现细节(比如建造房子)。这个任务可能是某人的一个单元/原子/独立的(比如建造村庄的人)或几个其他任务的组合(比如知道如何制作三角形、矩形的人)。 @notilas 您可以使用类/函数来抽象任务,使用此答案中给出的示例,您可能有一个函数drawSquare,它具有绘制正方形的步骤,通过组合抽象你可以有另一个函数drawHouse 使用drawSquaredrawTriangledrawHouse 这里不关心drawSquare 是如何实现的,它只关心结果。 drawVillagedrawCity 也是如此。【参考方案6】:

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

重要性:我们人类不可能一直记住所有的事情。例如,如果您的朋友快速说出 30 个随机数并要求您将它们全部添加,那么您就不可能。原因?您可能无法记住所有这些数字。您可能会在纸上写下这些数字,即使您将一个接一个地添加最右边的数字,一次忽略左边的数字,然后在添加最右边的数字时忽略最右边的数字。

这表明,我们人类有时可以专注在某个特定问题上,而忽略那些已经解决的问题,而将注意力转移到有待解决的问题上。

忽略次要的事情并专注于最重要的事情(暂时并在特定的上下文中)称为抽象

这是抽象在编程中的工作原理。

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

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

int main()

  printf("Hello world\n");
  return 0;

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

这里是严肃的问题

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

gcc -o hello hello.c

它会将你的英语类 C 语言代码转换为二进制代码,你可以通过给出命令来运行该代码:

./你好

因此,要使用 C 程序编写应用程序,您永远不需要知道 C 编译器如何将 C 语言代码转换为二进制代码。所以你使用 GCC 编译器作为抽象。

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

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

要记住的事情:

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

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

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

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

示例 4:许多应用程序都为您提供 API,您可以使用它与该应用程序进行交互。当您使用 API 方法时,您永远不需要知道它们是如何实现的。所以抽象就在那里。

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

【讨论】:

【参考方案7】:

简单的一句话,我可以说:抽象的本质是提取本质属性,省略无关紧要的细节。但是我们为什么要省略无关紧要的细节呢?关键的动力是防止变化的风险。

【讨论】:

以上是关于抽象在编程中意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

可能是把 Java 接口讲得最通俗的一篇文章

magic number 在编程中是啥意思?

23种设计模式:抽象工厂模式

C#中的方法

FLAG1在编程中是啥意思

设计模式