提问人:mwilliams 提问时间:10/25/2008 最后编辑:MathieuFmwilliams 更新时间:6/17/2012 访问量:1983
foo bar,还是不 foo bar:这是个问题
To foo bar, or not to foo bar: that is the question
问:
这是查尔斯·布莱恩·奎因(Charles Brian Quinn)在acts_as_conference大书牧场(Big Nerd Ranch)的一次演讲中讨论过的问题。他正在讨论他从指导Ruby on Rails训练营中学到的东西,这些人包括编程新手和Rails新手。
一张特别突出的幻灯片是,在尝试教某人编程时,从不使用 foo 和 bar 作为示例。他的推理很简单。
哪个更容易理解?
baz = foo + bar
或
answer = first_number + second_number
我自己在解释某事时发生过很多次,我立即跳转到 foo bar 占位符,但随后意识到我的错误,并使用真实世界的场景使示例更有意义。
这在试图教一个没有接触过编程的人时尤其适用,你最终需要解释 foo 和 bar 才能解释你实际想教的东西。
然而,对于有经验的程序员来说,使用 foo 和 bar 似乎是可以的,尽管我个人认为,和 Charles 一样,这是需要改变的。
快速搜索“foo”会返回 20 多页的结果,其中 foo 的使用方式更多,我能理解。在某些情况下,我正在阅读有关特定语言的问题,我这样做是为了帮助更好地理解该语言。如果使用适用的变量名称而不是 foo 和 bar,则更容易理解和解释问题。因此,对于经验丰富的开发人员来说,这种结构似乎也存在一些缺陷。
这是一个永远可以被踢掉的习惯吗?为什么选择 foo bar 或不 foo bar?
答:
在与非程序员交谈时,我可以看到这一点,但是当你在白板上与一些团队成员讨论问题时......我会想念我的傻瓜和我的酒吧。我认为 foo/bar 的流行是大多数程序员抽象思考能力的一个例子。
如果你在训练场上,可能是一个更大的问题。
评论
我有时会使用它们。但前提是“真实”姓名无关紧要。
这完全取决于你想教什么。有时,在展示一个编程示例时,你必须声明一些东西,只是为了让代码片段“完整”,而这几件事并不是你所展示的核心。
例如,如果你想展示如何抛出异常,我相信可以呈现一个像这样的片段
public void foo() {
// Do some things
if (errorCondition) {
throw new Exception("Error message");
}
}
由于其中的重点是显示异常,因此没有必要关心方法名称,因此 foo 在这种情况下是“合法的”,或者至少对我来说是这样。
我不会接受的(在同一个例子中)是
public void foo() {
// Do some things
if (bar) {
throw new Exception(baz);
}
}
因为它掩盖了你试图教的东西。
每当我的听众对手头的概念足够熟悉时,我就会选择不喋喋不休,这会损害他们的理解。
唯一应该使用 Foo 和 Bar 的时候是当你谈论的东西太抽象了,以至于添加上下文需要额外的讨论时。然后 Foo 和 Bar 比 x、y 和 z 等替代方案更具可读性和创建的代码更易于遵循。
在演示“foo”和“bar”的任何值就足够时,我使用它们,例如“您可以使用 sizeof(foo) 获取对象的大小”。它很方便让人们理解一般概念,而不仅仅是细节。例如,如果我说“你可以用 sizeof(int) 之类的东西来获得对象的大小”,那么几乎可以肯定有人会问这是否也适用于浮点数。
我是编程新手,或多或少是自学成才的。我在网上阅读了很多示例代码,一开始发现自己用更相关的名称替换了 foo 和 bar &c.,例如上面的 firstnumber 和 secondnumber 示例。
我现在更喜欢 x,y,z,i...因为 foo 和 bar 似乎在我的脑海中激发了语言冲动,可以分散我对日常工作的注意力,而且我已经在某种程度上发展了一种能力,可以在我的脑海中保留一大堆不同的变量并记住它们是什么。但我仍然绝对建议在教别人时使用相关的命名,尤其是在向不编程但需要了解程序如何工作的人解释代码时。
我认为这是由于许多程序员的讽刺天性,或者可能不是那么温和。虽然许多人试图在 foo/bar 上赋予不同的含义,但大多数人,或者至少很多人,都会想到“FUBAR”,F**K Up Beyond All Recognition。这是“有经验的”人对其他人发表冷嘲热讽的一种方式。
正因为如此,我从不将它用于非程序员,即使与有经验的程序员也很少使用它。如果我确实使用,你可以打赌我正在隐晦地提及手头的主题。
评论
foo
bar
spam
eggs
spam_and_eggs
除了避免像 foo 和 bar 这样的无意义词之外,我发现为具有相同关系的实际场景提供代码示例更为重要。这确实有助于学习者正确理解主题并防止误解。例如,如果我正在教授依赖注入,并展示示例代码,其中 Car 类的实例被注入到 Driver 类中,没有人会感到困惑并认为“这意味着 Car 控制了 Driver?
对于全新的程序员,我不得不说术语 foo 和 bar 可能并不为人所知。我以为它们是特定于语言的东西(即 C),但在 che 维基百科之后,我现在知道它们只是抽象的占位符。 因此,如果你的听众由不知道他们含义的人组成,那么其他事情就更清楚了。此外,first_number so 告诉人们,这些都是数字,无论它们是如何呈现的,而不是其他东西。
我认为在示例中使用 和 还有另一个重要原因。这些名称清楚地表明您没有调用任何神奇的关键字。每当我阅读一些文档或代码示例时,我都喜欢将示例的任意部分与必要的部分清楚地区分开来。foo
bar
如果你用这个无意义的词来代替它在示例代码中通常表示的内容,你最终可能会得到一些看起来很像你试图解释的关键字、类或方法的名称。“my”前缀,如 ,是一个很好的折衷方案,它使名称脱颖而出,因为它是任意的。myNumber
myFunction
上一个:C++ 中的变量命名约定
下一个:在多个页面上使用 PHP 变量
评论