2.6 — 函数为何有用,以及如何有效使用它们

既然我们已经介绍了函数是什么以及它们的一些基本功能,现在让我们更深入地了解它们为何有用。

为什么要使用函数?

新程序员经常会问:“我们不能把所有代码都放在 main 函数中吗?” 对于简单的程序,你当然可以。然而,函数提供了许多好处,使得它们在非简单长度或复杂度的程序中极其有用。

  • 组织性 -- 随着程序的复杂性增加,将所有代码都放在 main() 函数中会变得越来越复杂。函数几乎就像一个迷你程序,我们可以将其与主程序分开编写,而无需在编写时考虑程序的其余部分。这使我们能够将复杂的程序分解成更小、更易于管理的块,从而降低程序的整体复杂性。
  • 可重用性 -- 一旦函数被编写,它可以在程序中被多次调用。这避免了重复代码(“不要重复你自己”)并最大限度地减少了复制/粘贴错误的发生概率。函数也可以与其他程序共享,减少了每次都必须从头开始编写(和重新测试)的代码量。
  • 测试 -- 由于函数减少了代码冗余,首先需要测试的代码量就减少了。此外,由于函数是自包含的,一旦我们测试过一个函数以确保其正常工作,除非我们更改它,否则我们无需再次测试。这减少了我们一次需要测试的代码量,使得查找错误(或从一开始就避免错误)变得容易得多。
  • 可扩展性 -- 当我们需要扩展程序以处理以前未处理的情况时,函数允许我们在一个地方进行更改,并使该更改在每次调用函数时生效。
  • 抽象性 -- 要使用一个函数,你只需要知道它的名称、输入、输出以及它在哪里。你不需要知道它是如何工作的,或者它依赖于其他哪些代码才能使用它。这降低了使用他人代码(包括标准库中的所有内容)所需的知识量。

有效使用函数

新程序员遇到的最大挑战之一(除了学习语言本身)是理解何时以及如何有效使用函数。以下是一些编写函数的基本准则:

  • 程序中出现两次或更多次的语句组通常应该被封装成一个函数。例如,如果我们以相同的方式多次从用户那里读取输入,那是一个很好的函数候选。如果我们在多个地方以相同的方式输出内容,那也是一个很好的函数候选。
  • 具有明确输入和输出集(特别是如果它很复杂)的代码是函数的好候选。例如,如果我们有一个想要排序的项列表,用于排序的代码将是一个很好的函数,即使它只执行一次。输入是未排序的列表,输出是已排序的列表。另一个好的潜在函数是模拟六面骰子掷骰的代码。你当前的程序可能只在一个地方使用它,但如果你将它变成一个函数,那么如果你以后扩展你的程序或在未来的程序中,它就可以随时重用了。
  • 一个函数通常应该只执行一个任务。
  • 当一个函数变得太长、太复杂或难以理解时,它可以被拆分成多个子函数。这被称为重构。我们将在3.10 — 在问题出现之前发现问题一课中详细讨论重构。

通常,在学习C++时,你会编写许多涉及3个子任务的程序

  1. 从用户读取输入
  2. 根据输入计算一个值
  3. 打印计算出的值

对于简单的程序(例如,少于20行代码),这些任务中的部分或全部可以在 main 函数中完成。然而,对于更长的程序(或仅仅为了练习),每个任务都是一个独立的函数的好候选。

新程序员经常将计算值和打印计算值组合到一个函数中。然而,这违反了函数“一个任务”的经验法则。一个计算值的函数应该将值返回给调用者,并让调用者决定如何处理计算出的值(例如调用另一个函数来打印该值)。

guest
您的电子邮箱地址将不会被显示
发现错误?请在上方留言!
与勘误相关的评论在处理后将被删除,以帮助减少混乱。感谢您帮助使网站对每个人都更好!
来自 https://gravatar.com/ 的头像与您提供的电子邮箱地址相关联。
有回复时通知我:  
148 评论
最新
最早 最多投票
内联反馈
查看所有评论