Що таке ідіоматичний код?


85

Мене зацікавлять деякі приклади до та після c #, деякі неідіоматичні та ідіоматичні приклади. Приклади, не пов’язані з c #, також непогані, якщо вони донесуть ідею. Дякую.


3
Приховані функції C # наповнені ідіоматичним C #. Не все це заперечує, але багато простих одноклассників з великою кількістю голосів можна вважати ідіоматичними. А деякі відповіді описують і неідіоматичні альтернативи.
Michiel van Oosterhout

Відповіді:


119

Ідіоматичні засоби відповідають умовним мовам. Ви хочете знайти найпростіші та найпоширеніші способи виконання завдання, а не переносити свої знання з іншої мови.

неідіоматичний 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] 

36

Кілька прикладів:

Управління ресурсами , не ідіоматично:

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

13
Брекети - це ідіоматична Java ;-)
Матьє Гіндон

15

Ідіоматичний код - це код, який виконує загальне завдання загальноприйнятою для вашої мови. Це схоже на шаблон дизайну, але в значно меншому масштабі. Ідіоми сильно відрізняються залежно від мови. Однією з ідіом у C # може бути використання ітератора для ітерації колекції, а не циклічне її проходження. Інші мови без ітераторів можуть покладатися на ідіому циклу.


6

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

2
Я думаю, я думав, що ідіоматика означає "найкращий спосіб", на відміну від довільного стандарту. Але, мабуть, найкращий спосіб залежить від контексту.
MrBoJangles
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.