web-dev-qa-db-ja.com

慣用コードとは何ですか?

私はいくつかの前後のc#の例、いくつかの非慣用的な例と慣用的な例に興味があります。 c#以外の例でも、アイデアがわかれば問題ありません。ありがとう。

80
MrBoJangles

慣用句とは、言語の慣習に従うことを意味します。別の言語から知識を移植するのではなく、タスクを実行する最も簡単で最も一般的な方法を見つけたいと考えています。

非慣用的python追加でループを使用:

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] 
107
Corey Goldberg

いくつかの例:

リソース管理、非慣用的:

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);
31
JacquesB

慣用コードは、言語に共通の方法で共通のタスクを実行するコードです。これは設計パターンに似ていますが、はるかに小規模です。イディオムは言語によって大きく異なります。 C#の1つのイディオムは、コレクションをループするのではなく、イテレータを使用してコレクションを反復することです。イテレータのない他の言語は、ループイディオムに依存する場合があります。

12
Bill the Lizard

PHPで、私は時々次のようなコードに遭遇します:

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

慣用的にこれで実装できるもの:

return array_map('trim', $array);
6
jmoz

実際には、それは一貫した方法でコードを書くことを意味します。つまり、コードベースで作業するすべての開発者は、同様のコード構造を書くときに同じ規則に従う必要があります。

したがって、慣用的な方法は他のコードのスタイルと一致する方法であり、非慣用的な方法は、ある種の関数を別の方法で記述していることを意味します。

例えば特定の数のアイテムをループしている場合、いくつかの方法でループを記述できます。

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++)
5
RickL