什么是惯用代码?

我会对一些之前和之后的 c # 示例感兴趣,一些非惯用与惯用的示例。非 c # 示例也可以,如果他们能够理解这个想法的话。谢谢。

32951 次浏览

惯用代码是以通用方式为您的语言执行通用任务的代码。它类似于一种设计模式,但规模要小得多。习语因语言的不同而有很大的差异。C # 中的一个习惯用法可能是使用迭代器迭代集合,而不是循环遍历集合。其他没有迭代器的语言可能依赖于循环习惯用法。

习语的意思是遵循语言的惯例。你想找到最简单和最常见的方法来完成一项任务,而不是从不同的语言移植你的知识。

non-idiomatic python using a loop with append:

mylist = [1, 2, 3, 4]
newlist = []
for i in mylist:
newlist.append(i * 2)

使用列表内涵的惯用 python:

mylist = [1, 2, 3, 4]
newlist = [(i * 2) for i in mylist]

Some examples:

资源管理 ,非惯用语:

string content;
StreamReader sr = null;
try {
File.OpenText(path);
content = sr.ReadToEnd();
}
finally {
if (sr != null) {
sr.Close();
}
}

成语:

string content;
using (StreamReader sr = File.OpenText(path)) {
content = sr.ReadToEnd();
}

迭代 ,非惯用语:

for (int i=0;i<list.Count; i++) {
DoSomething(list[i]);
}

同样不成语的还有:

IEnumerator e = list.GetEnumerator();
do {
DoSomenthing(e.Current);
} while (e.MoveNext());

成语:

foreach (Item item in list) {
DoSomething(item);
}

过滤 ,非惯用语:

List<int> list2 = new List<int>();
for (int num in list1) {
if (num>100) list2.Add(num);
}

成语:

var list2 = list1.Where(num=>num>100);

实际上,它意味着以一种一致的方式编写代码,也就是说,在编写类似的代码构造时,所有从事代码库工作的开发人员都应该遵循相同的约定。

所以惯用方式就是与其他代码的风格相匹配的方式,非惯用方式意味着你正在用不同的方式编写函数。

e.g. if you are looping a certain number of items, you could write the loop in several ways:

for (int i = 0; i < itemCount; i++)


for (int i = 1; i <= itemCount; i++)


for (int i = 0; i < itemCount; ++i)

等等

最重要的是所选样式的使用要始终如一。这样人们就会对如何使用它变得非常熟悉和自信,当你发现一个看起来不同的用法时,它可能是一个引入错误的信号,也许是一个错误,例如。

for (int i = 1; i < itemCount; i++)

在 PHP 中,我有时会遇到这样的代码:

foreach ($array as $value) {
$trimmed[] = trim($value);
}
return $trimmed;

习惯用法是:

return array_map('trim', $array);