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


85

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


3
C#の隠された機能は、慣用的なC#でいっぱいです。すべてが気になるわけではありませんが、賛成票の数が多い単純なワンライナーの多くは慣用的なものと見なすことができます。また、一部の回答では、非慣用的な代替案についても説明しています。
Michiel van Oosterhout 2013年

回答:


119

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

追加のあるループを使用する非慣用的な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] 

36

いくつかの例:

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

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

13
中括弧は慣用的なJavaです;
Mathieu Guindon 2015年

15

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


6

PHPでは、次のようなコードに遭遇することがあります。

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

慣用的に実装できるのは次のとおりです。

return array_map('trim', $array);

5

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

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

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

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

2
慣用句は、単なる恣意的な基準ではなく、「最良の方法」を意味すると思いました。しかし、最善の方法は状況に左右されると思います。
MrBoJangles 2008
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.