什么是编程习语?


75

我看到“编程习惯用法”一词泛滥,好像人们通常都理解它一样。但是,在搜索结果和stackoverflow中,我看到了所有内容...

从微:

  • 递增变量
  • 代表无限循环
  • 交换变量值

到中等:

到宏:

是否有一个统一的“编程习惯用法”定义?由于“编程习惯用语”在许多范围内使用:

  • 微观:句法差异或通用语法
  • 媒介:常见样式和样式
  • 宏:将编程范例作为习惯用法

在任何这些范围中使用该短语是否有效?到目前为止,答案集中在句法成语上。其他人也有效吗?


编程习语是用编程语言编写的习语
jaco0646 '18 -10-12

Answers:


58

编程习惯用法是用特定语言编写任务的常用方法。例如,经常在C中这样编写循环:

for (i=0; i<10; i++)

PHP将了解类似的构造:

for ($i = 1; $i <= 10; $i++)

但是在PHP中不建议使用它遍历数组。在这种情况下,您将使用:

foreach ($arr as $value)

而在Ruby中,您将使用:

(1..10).each

循环,或:

array.each

用这些语言编写循环有很多可能性。使用该习语可以使经验丰富的读者立即识别出该习语。然后,他们可以将时间花在更重要的问题上。


22

(非编程)语言中的“成语”是特定语言所特有的一种说法或表达。通常,某些不遵循语言的“规则”而存在的原因是,以母语为母语的人“只知道”它的意思。(例如,在英语中,我们说“一致”,但“出来线” -这将是惯用语)

将其移到编程领域,我们得到如下信息:

 if(c=GetValue())
 {...}

实际上意味着:

 c = GetValue();
 if (c != 0)
 {....}

每个C / C ++程序员都能理解的语言,但完全会使来自不同编程语言的人感到困惑。


1
-1虽然成语可能会受到语法的影响,但我认为它们还有很多。
Thomas Eding

2
我喜欢这个答案。用自然语言来说,成语是一种其含义不能从其构成术语的含义来构造的东西。换句话说,即使从句法上讲它是可以分割的,它在语义上也是一个不可分割的原子。因此,在编程中,成语是您不需要质疑的事情,而只是死记硬背并可以提高工作效率。
Sridhar Sarnobat '16

13

参见http://en.wikipedia.org/wiki/Programming_idiom

编程习惯用法是一种模式,算法或结构化代码的方式。谈论编程习惯用法就是谈论那些在代码中经常出现的模式或提出新的模式。

熟悉习惯用法(尤其是较大的习惯用法)的好处是,在查看代码时,您可以看到几行代码,但是由于它是一个特定的习惯用法,因此您可以从心理上表示并认为该代码是单个习惯用法,而不是必须分别阅读和理解每一行。

说代码不是惯用语,就是说它没有以允许人类读者有效思考代码的方式来构造自身。


3

成语是语言学的术语。这是一组单词,从字面上看并不是说什么。例如,当某人感觉不舒服时说某人“处于天气之下”。这个特殊的短语来自于水手谈论乘客的话题,晕船的乘客会进入“天气”甲板以下,而船舶的运动较少。但是我们大多数人都不是水手,也不知道这句话的字面意思。

在编程中,即使大多数指令都是英语单词,但大多数公众也不理解。例如“ for循环”。尽管它们对程序员有意义,但对大多数其他人却没有。


4
-1:编程习惯与非编程习惯不同。
Thomas Eding

1
...但事实并非如此。
杰森·S

3

由于大型程序是从小型程序中成长而来的,因此至关重要的是,我们开发出一个标准程序结构的库,这些程序的正确性已得到我们的确认(我们称它们为“成语”),并学会使用经证明具有价值的组织技术将它们组合成较大的结构。

程序员应掌握良好的算法和习惯用法。

Alan J. Perlis- SICP前言



2

习惯用法是可以在多个地方识别“模式”。

我不会说这与特定的编程语言有关。

Iterator foo;
foo.reset();
while (foo.next())
{
    print(foo.value());
}

这就是我所说的“为每个”的成语的摘要,它在多种语言中略有不同。

成语的另一个很好的例子是Socket。所有声称具有套接字的平台在概念上都以相同的方式工作,也就是说,它们都具有大致相同的接口。


1
当我听到“套接字”时,我认为是“ I / O模式”。我不认为这是一种习语-模式存在于各种语言中,而(正如大多数其他答复者所描述的)习语往往是特定于语言的。
汤姆(Tom)

我没有给出我的特定答案,试图区分“成语”和“模式”,如果您阅读前五个单词,这应该很清楚。它的意思是提供信息和解释。
Zuu


1

尽早陷入困境:以相同的方式执行相同的过程。积累习语。标准化。莎士比亚与您之间的唯一区别(!)是他的成语列表的大小,而不是他的词汇量。

  • ALAN PERLIS,编程中的Epigrams

http://www.cs.yale.edu/quotes.html


0

它来自惯用,可以将编程中的“成语”一词的含义概括为带有含义和含义的短语,而这些短语的含义和含义比单词的总和还重要。在编程中,大多数代码片段实际上都是惯用语。“保持或符合语言的自然表达方式

可以将编程习语描述为可转移到不同情况的一类解决方案。考虑while { ... }VSdo {} while这些都是惯用的,它们包含了同样的话,但顺序进行的一个重要区别。确切的措词会因语言而异,但是基本含义和含义会有所不同。例如do {} while,无论使用哪种语言或语句来实现它,都将始终执行一次。作为惯用语,它是思想的可移植形状。它可以在许多情况下使用,并用不同的词(语句/命令)表达,但基本结果始终是相同的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.