发布于 2026-01-06 3 阅读
0

Against 'foo' (and 'bar' too) Here is what ‘foo’ means: Here’s why you should never ever use ‘foo’ How to avoid using ‘foo’ We write to be understood

反对“foo”(以及“bar”)

“foo”的含义如下:

这就是你永远不应该使用“foo”的原因

如何避免使用“foo”

我们写作是为了让人理解。

大约一半的代码示例都包含术语“foo”,以下是它的含义以及为什么你永远不应该在你的示例中使用它。

“foo”的含义如下:

“Foo”本身没有任何意义,它只是一个常用的变量示例名称。

在编程中,我们经常需要给变量命名。变量是存储值的容器,为了便于使用,变量名应该有助于提高代码的可读性。在实际代码中,我可能会使用类似 `$1` 这样的变量名,user_height以便在代码内部轻松引用该值。

变量名在这里就foo派上用场了。有时候我们需要引用一个变量,却不知道它应该叫什么。假设我们要描述一个函数,用英语来说就是:“这个函数接受你提供的任何变量,并把它打印两次。”我们的变量可能叫 `a` user_height,也可能叫 `b` user_first_name,甚至可能叫 `c` user_updated_legacy_variable_setting_LOCKED_v2_updated_index!我们只想表达的是,无论你给它什么变量,它都会把它打印两次。在很多例子中,`a` 都foo被用作示例变量名。

如果我们在数学课上,我们会把这个变量叫做“x”,然后说“这个函数是这样工作的:打印 X,然后再打印 X”。我们会立刻明白 X 是什么并不重要,我们不会举手问“如果我把变量名从 X 改成 Q,这个函数还能用吗?”答案是肯定的!变量的名字并不重要。

这就是你永远不应该使用“foo”的原因

让我们先退一步,假设你刚才并没有阅读 foo 的定义。让我来解释一下为什么在你的例子中使用它真的不是一个好主意。

编程的通用性令人惊讶。大多数编程语言看起来都非常相似。比如,看看这段 C 语言的代码片段,而我并不了解 C 语言:

#include <stdio.h>

int main() {
   const char *foo = "Hello";
   const char *bar = "World!";
   fprintf(stdout, "%s %s\n", foo, bar);

   return 0;
}

看起来挺容易读懂的!我基本能明白它的作用。咱们一步一步来吧!

#include <stdio.h>

好的,我们可能正在使用 include 引入所需的软件包,软件包的名称是 studio 吗?哦不,是 Standard Input/Output > Standard I/O > stdio,明白了。

int main() {

肯定是在定义一个函数,很可能是默认运行的 `main` 函数。我这里要稍微作弊一下,凭借我对 C 语言重视类型的知识(至少 C 语言比 JavaScript 更重视类型),我猜int这个函数会返回一个整数,而 `return 0` 似乎也印证了我的猜测。

   const char *foo = "Hello";

声明一个常量,它是 'char' 类型,这可能意味着它是 'character' 类型。C 语言不是有字符串吗?算了。我看到它被设置为“Hello”,所以字符串肯定是用 char 类型存储的。可是为什么呢foo

   const char *bar = "World!";

为什么是 *bar?

   fprintf(stdout, "%s %s\n", foo, bar);

Fprintf 的打印方式有点奇怪,不过它的确会输出到“标准输出”,根据我的经验,这通常意味着控制台。它还会打印一些特殊字符,比如空格“%s”和换行符“\n”,以及“foo”和“bar”。

   return 0;

必须返回某个值,我猜应该是一个整数。

}

好的,除了 foo 和 bar 之外,其他的我都定义了。我相信我们能解决这个问题,我们来查阅C 语言参考手册,看看 'foo' 的定义。

……

嗯。

“Foo”在C语言参考手册中出现了70多次,但我能找到的最接近定义的解释是:

“小写字母和大写字母是不同的,例如 foo 和 FOO 是两个不同的标识符。”

就这? foo到底什么鬼?

再说一遍,“foo”和“bar”都是毫无意义的无意义词语,用来表示“任何随机标签都可以用于这个变量、方法等等,我选择这个是为了说明无意义的词语也能奏效”。

在代码示例中使用“foo”可以追溯到20世纪60年代,这是个糟糕的做法。将“foo”用作“一个没有任何意义的名称”会使学生更难理解和使用你的代码。

我们有责任让我们的工作成果易于获取,使其可读且实用。当我们编写用于生产环境的代码时,代码本身及其相关文档都必须易于他人理解,因为难以阅读的代码几乎毫无用处。

只为有经验的人写作确实能节省时间吗?当然可以。我经常写关于 Heroku 的文章,我有时也会想直接用“Heroku CLI”而不是“命令行界面”,但使用一大堆缩写会让文章更难理解。

Foo 会阻碍人们理解你的示例,虽然所有代码都应该易于理解,但你的示例应该是最容易阅读的部分!

如何避免使用“foo”

在文章中多使用“CLI”、“npm”和“TDD”,你就能节省10分钟的写作时间,同时还能写出一篇新手开发者根本看不懂的文章。虽然输入每个缩写词(比如“TDD”)会多花几个字母,但如果能提高可访问性,那就值得。同样的道理也适用于“foo”。让我们来修改一下这个例子:

#include <stdio.h>
int main() {
   /* of course, these variable names can be whatever you like */
   const char *first_word = "Hello";
   const char *second_word = "World!";
   fprintf(stdout, "%s %s\n", first_word, second_word);

   return 0;
}

我们再来一次,这次用随机数生成器替换“foo”和“bar”。

#include <stdio.h>
#include <stdlib.h>

int main() {
  int count, randomNumber;



  printf("Ten random numbers in [1,100]\n");

  for (count = 1; count <= 10; count++) {
    randomNumber = rand() % 100 + 1;
    printf("%d\n", randomNumber);
  }

  return 0;
}

就这样!我们完成了。加个注释,改个名字。而且你猜怎么着:我们几个小时就能把 C 语言手册里的所有例子都重写一遍。

最终得到的代码每一行都更易读。

需要考虑的关键点:

  • 变量可以随意命名有关系吗?
  • 这条评论能帮到这里的新手程序员吗?
  • 变量名能否更好地描述这里发生的事情?

我们写作是为了让人理解。

我们都有责任编写易于理解的信息。沟通并非个人之事。下次当你着手编写示例帮助他人时,不妨想想,阅读此文的人很可能正处于编程的初级阶段。他们正在上网搜索解决方案,当他们找到易于理解的范例时,会感到鼓舞、充满活力,并充满信心。使用有意义的变量名就能让他们感受到这一点。

文章来源:https://dev.to/heroku/against-foo-and-bar-too-4hp5