Logo
Section 1 / 10

编程范式

现代编程范式的入门介绍。

检查点

编程范式

现代编程范式的入门介绍。

Bash 是一种过程式编程语言。过程式语言允许我们将程序划分为逻辑上独立的部分,称为子程序。子程序是一段独立的代码块,用于解决特定的任务。当程序需要时,就可以调用这些子程序。

“子程序”这一术语已过时,现代编程语言中通常称之为函数。我们在学习 declare Bash 内建命令时已经接触过函数的概念。现在,是时候深入研究函数了。

函数

我们首先从术语入手,这将帮助我们理解函数的引入原因以及它们解决了哪些问题。

那么,什么是过程式编程?它是软件开发中的范式之一。范式是指定义如何编写程序的一套思想、方法和原则。

目前主要有两种主流范式,大多数现代编程语言都遵循这两种范式:

  1. 命令式编程:开发者明确指定计算机如何改变程序的状态。换句话说,他们编写完整的算法来计算结果。

  2. 声明式编程:开发者只描述期望结果的属性,而不指定具体的计算算法。

Bash 属于第一种范式,是一种命令式语言。

命令式与声明式范式定义了编写程序的基本原则。在同一范式下,还存在不同的方法论或实现方式,每种方法论提供特定的编程技术。

命令式范式包含两种主要的方法论:

  1. 过程式编程
  2. 面向对象编程

这两种方法论分别建议了不同的程序源代码组织方式。Bash 采用的是第一种方法论。

过程式编程

让我们更深入地了解过程式编程。这种方法论提出了一些将程序指令组合成独立代码块的特性。这些代码块被称为子程序或函数。

我们可以在程序的任意位置调用函数。函数可以接收输入参数,这种机制类似于向脚本传递命令行参数。这也是为什么函数有时被称为“程序中的程序”的原因。

函数的主要作用是管理源代码的复杂性。代码越庞大,维护就越困难。重复的代码片段会使情况更加糟糕——它们分散在程序各处,可能包含错误。修复一处错误后,还需要找到并修正所有其他重复的地方。如果将重复的代码封装成函数,只需在一个地方修复即可。

下面是一个重复代码片段的例子。假设我们正在编写一个大型程序,每当发生错误时,程序都会将相应的错误信息输出到标准错误流。这种做法会导致源代码中大量重复使用 echo 命令。典型的调用形式如下:

1>&2 echo "第 N 个错误发生了"

后来,我们决定将所有错误信息写入日志文件,以便更好地调试潜在问题。用户也可以自行将错误流重定向到日志文件。这是一个好主意,但有些用户并不清楚如何使用重定向。因此,我们的程序必须自动将消息写入日志文件。

这意味着我们需要检查程序中所有输出错误信息的位置,并逐一修改 echo 调用,改为:

1echo "第 N 个错误发生了" >> debug.log

如果某处不小心遗漏了一个 echo 调用,其输出就不会进入日志文件。而这条输出可能是调试的关键信息。缺少它,我们就无法弄清程序在用户端失败的原因。

我们讨论的是程序维护中的多个问题之一。维护意味着要修改现有源代码。如果我们违背了不要重复自己(DRY) 的开发原则,就会陷入诸多麻烦。我们必须牢记一条简单规则:绝不复制程序中的相同代码块。

函数正是为解决代码重复问题而设计的。它们在某种程度上类似于循环。区别在于,循环在程序的某个位置反复执行一段代码;而函数则在程序的不同位置执行同一段代码。

使用函数能显著提升源代码的可读性。函数将一组命令整合为一个整体块。如果我们为这个块赋予一个具有描述性的名称,其功能就一目了然。之后,我们只需通过名称调用函数,就能让程序更易阅读。原本需要十几行代码才能表达的内容,现在只需一个函数名即可替代。

Quiz

多选题

(选择所有适用项)Bash 是一种什么类型的语言?

1 / 2

循环操作符

在 Shell 中使用函数