反对“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