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



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

510   5  
c#

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

    Ничего не найдено.