Мне были бы интересны некоторые примеры до и после С#, некоторые неидиоматические идиоматические примеры. Примеры не-С# также были бы хороши, если бы они поняли эту идею. Спасибо.
Что такое идиоматический код?
Ответ 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++)