Подтвердить что ты не робот

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

Мне были бы интересны некоторые примеры до и после С#, некоторые неидиоматические идиоматические примеры. Примеры не-С# также были бы хороши, если бы они поняли эту идею. Спасибо.

4b9b3361

Ответ 1

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

non-idiomatic python с использованием цикла с добавлением:

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] 

Ответ 2

Некоторые примеры:

Управление ресурсами, без идиоматических:

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

Ответ 3

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

Ответ 4

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