Co to jest kod idiomatyczny?


86

Byłbym zainteresowany kilkoma przykładami języka C # przed i po, przykładami nieidiomatycznymi i idiomatycznymi. Przykłady inne niż C # byłyby również w porządku, jeśli przekażą pomysł. Dzięki.


3
Ukryte funkcje języka C # są pełne idiomatycznego języka C #. Nie wszystkim to przeszkadza, ale wiele prostych, jednostronnych odpowiedzi z dużą liczbą głosów za można uznać za idiomatyczne. Niektóre odpowiedzi opisują również nieidiomatyczne alternatywy.
Michiel van Oosterhout

Odpowiedzi:


119

Idiomatyczny oznacza zgodny z konwencjami języka. Chcesz znaleźć najłatwiejsze i najczęstsze sposoby wykonania zadania, zamiast przenosić swoją wiedzę z innego języka.

nieidiomatyczny python używający pętli z dopiskiem:

mylist = [1, 2, 3, 4]
newlist = []
for i in mylist:
    newlist.append(i * 2)

idiomatyczny Python używający rozumienia list:

mylist = [1, 2, 3, 4]
newlist = [(i * 2) for i in mylist] 

36

Kilka przykładów:

Zarządzanie zasobami , nie idiomatyczne:

string content;
StreamReader sr = null;
try {
    File.OpenText(path);
    content = sr.ReadToEnd();
}
finally {
    if (sr != null) {
        sr.Close();
    }
}

Idiomatyczny:

string content;
using (StreamReader sr = File.OpenText(path)) {
    content = sr.ReadToEnd();
}

Iteracja , nie idiomatyczna:

for (int i=0;i<list.Count; i++) {
   DoSomething(list[i]);
}

Również nie idiomatyczny:

IEnumerator e = list.GetEnumerator();
do {
   DoSomenthing(e.Current);
} while (e.MoveNext());

Idiomatyczny:

foreach (Item item in list) {
   DoSomething(item);
}

Filtrowanie , nie idiomatyczne:

List<int> list2 = new List<int>();
for (int num in list1) {
  if (num>100) list2.Add(num);
}

idiomatyczny:

var list2 = list1.Where(num=>num>100);

13
Szelki są idiomatyczne w Javie ;-)
Mathieu Guindon

15

Kod idiomatyczny to kod, który wykonuje typowe zadania w typowy sposób dla Twojego języka. Jest podobny do wzorca projektowego, ale w znacznie mniejszej skali. Idiomy różnią się znacznie w zależności od języka. Jednym z idiomów w C # może być użycie iteratora do iteracji w kolekcji, zamiast przechodzenia przez nią. Inne języki bez iteratorów mogą polegać na idiomie pętli.


6

W PHP czasami napotykam kod taki jak:

foreach ($array as $value) {
    $trimmed[] = trim($value);
}
return $trimmed;

Które idiomatycznie można zaimplementować za pomocą:

return array_map('trim', $array);

5

W praktyce oznacza to pisanie kodu w spójny sposób, tzn. Wszyscy programiści pracujący na bazie Twojego kodu powinni przestrzegać tych samych konwencji podczas pisania podobnych konstrukcji kodu.

Więc idiomatyczny sposób to sposób, który pasuje do stylu innego kodu, nieidiomatyczny sposób oznacza, że ​​piszesz rodzaj funkcji, ale w inny sposób.

np. jeśli zapętlasz określoną liczbę elementów, możesz napisać pętlę na kilka sposobów:

for (int i = 0; i < itemCount; i++)

for (int i = 1; i <= itemCount; i++)

for (int i = 0; i < itemCount; ++i)

itp

Najważniejsze jest konsekwentne stosowanie wybranego stylu. W ten sposób ludzie stają się bardzo zaznajomieni i pewni, jak go używać, a kiedy szpiegujesz użycie, które wygląda inaczej, może to być oznaką wprowadzenia błędu, być może pomyłką o jeden błąd, np.

for (int i = 1; i < itemCount; i++)

2
Myślę, że myślałem, że idiomatyczność oznacza „najlepszy sposób”, w przeciwieństwie do arbitralnego standardu. Ale myślę, że najlepszy sposób zależy od kontekstu.
MrBoJangles,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.