5 ответов:
идиоматическое означает следование условностям языка. Вы хотите найти самые простые и распространенные способы выполнения задачи, а не переносить свои знания с другого языка.
неидиоматический 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]
примеры:
управление ресурсами, не идиоматические:
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);
идиоматический код-это код, который выполняет общую задачу общим способом для вашего языка. Это похоже на шаблон дизайна, но в гораздо меньшем масштабе. Идиомы сильно отличаются по языку. Одной из идиом в C# может быть использование итератора для итерации по коллекции, а не циклическое ее прохождение. Другие языки без итераторов могут полагаться на идиому цикла.
в PHP я иногда встречаю код типа:
foreach ($array as $value) { $trimmed[] = trim($value); } return $trimmed;который идиоматически может быть реализован с помощью:
return array_map('trim', $array);
практически говоря, это означает последовательное написание кода, т. е. все разработчики, которые работают над вашей базой кода, должны следовать одним и тем же соглашениям при написании аналогичных конструкций кода.
например, если вы зацикливаете определенное количество элементов, вы можете написать цикл в нескольких способы:
for (int i = 0; i < itemCount; i++) for (int i = 1; i <= itemCount; i++) for (int i = 0; i < itemCount; ++i)etc
самое главное, что выбранный стиль используется последовательно. Таким образом, люди становятся очень знакомы и уверены в том, как его использовать, и когда вы шпионите за использованием, которое выглядит по-другому, это может быть признаком ошибки, возможно, от одной ошибки, например
for (int i = 1; i < itemCount; i++)
Comments