Мне были бы интересны некоторые примеры C # до и после, некоторые неидиоматические и идиоматические примеры. Примеры не на C # тоже подойдут, если они дадут идею. Спасибо.
Мне были бы интересны некоторые примеры C # до и после, некоторые неидиоматические и идиоматические примеры. Примеры не на C # тоже подойдут, если они дадут идею. Спасибо.
Ответы:
Идиоматический означает следование условностям языка. Вы хотите найти самые простые и распространенные способы выполнения задачи, а не переносить свои знания с другого языка.
неидиоматический питон с использованием цикла с добавлением:
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]
Некоторые примеры:
Управление ресурсами , не идиоматическое:
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 # может заключаться в использовании итератора для итерации по коллекции, а не для ее выполнения. Другие языки без итераторов могут полагаться на идиому цикла.
С практической точки зрения это означает последовательное написание кода, т.е. все разработчики, работающие с вашей кодовой базой, должны следовать одним и тем же соглашениям при написании аналогичных конструкций кода.
Таким образом, идиоматический способ - это способ, который соответствует стилю другого кода, неидиоматический способ означает, что вы пишете такую функцию, но другим способом.
например, если вы зацикливаете определенное количество элементов, вы можете написать цикл несколькими способами:
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++)