Что такое идиоматический код?


86

Мне были бы интересны некоторые примеры C # до и после, некоторые неидиоматические и идиоматические примеры. Примеры не на C # тоже подойдут, если они дадут идею. Спасибо.


3
Скрытые возможности C # полны идиоматики C #. Не все это имейте в виду, но многие простые однострочные сообщения с большим количеством голосов можно считать идиоматическими. И некоторые ответы также описывают неидиоматические альтернативы.
Michiel van Oosterhout

Ответы:


119

Идиоматический означает следование условностям языка. Вы хотите найти самые простые и распространенные способы выполнения задачи, а не переносить свои знания с другого языка.

неидиоматический питон с использованием цикла с добавлением:

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

идиоматический питон, использующий понимание списка:

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

15

Идиоматический код - это код, который выполняет общую задачу обычным для вашего языка способом. Это похоже на шаблон проектирования, но в гораздо меньшем масштабе. Идиомы сильно различаются в зависимости от языка. Одна идиома в C # может заключаться в использовании итератора для итерации по коллекции, а не для ее выполнения. Другие языки без итераторов могут полагаться на идиому цикла.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.