2008-09-17 17 views
51

Byłbym zainteresowany niektórymi przykładami z przykładu przed i po, przykładami nie idiomatycznymi i idiomatycznymi. Non-C# przykłady byłyby również dobre, jeśli wpadną na ten pomysł. Dzięki.Co to jest kod idiomatyczny?

+4

Jak mogę uzyskać ujemny, jest to cholernie dobre pytanie! – MrBoJangles

+1

Uzgodnione, dobre pytanie z kilkoma miłymi odpowiedziami. –

+3

[Ukryte funkcje C#] (http://stackoverflow.com/q/9033/4830) jest pełen idiomatycznego C#. Nie wszystkim to przeszkadza, ale wiele prostych jednolinijkowych z dużą liczbą przebojów można uznać za idiomatyczne. Niektóre odpowiedzi opisują także nie-idiomatyczne alternatywy. –

Odpowiedz

68

Idiomatic oznacza przestrzeganie konwencji języka. Chcesz znaleźć najprostsze i najczęstsze sposoby wykonania zadania, a nie przenosić swoją wiedzę z innego języka.

non-idiomatyczne python za pomocą pętli ze append:

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

idiomatycznym python przy użyciu wyrażeń listowych:

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

Kod idiomatyczny to kod, który wykonuje typowe zadanie w zwykły sposób dla danego języka. Jest podobny do wzoru projektu, ale w znacznie mniejszej skali. Idiomy różnią się znacznie w zależności od języka. Jednym idiomem w języku C# może być użycie iteratora do iterowania w kolekcji, zamiast przechodzenia przez nią. Inne języki bez iteratorów mogą polegać na idiomie pętli.

23

kilka przykładów:

zarządzania zasobami, nie idiomatyczne:

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

Idiomatic:

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

iteracji, nie idiomatycznym:

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

również nie idiomatycznym:

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

Idiomatic:

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

Filtrowanie, non-idiomatyczne:

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

idiomatyczne:

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

Aparat ortodontyczny to idiomatyczna Java ;-) –

3

Praktycznie rzecz biorąc, oznacza to, pisania kodu w sposób spójny, czyli wszyscy programiści, którzy pracują na podstawie kodu powinny być zgodne te same konwencje podczas pisania podobnych konstrukcji kodu.

Tak więc idiomatyczny sposób jest sposobem, który pasuje do stylu innego kodu, sposób nie-idiomatyczny oznacza, że ​​piszesz ten rodzaj funkcji, ale w inny sposób.

np. jeśli zapętlenie pewną liczbę elementów, można 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

Co najważniejsze jest to, że wybrany styl jest stosowany konsekwentnie. W ten sposób ludzie stają się bardzo obeznani i pewni, jak z nich korzystać, a kiedy szpiegujesz użycie, które wygląda inaczej, może być oznaką błędu, być może spowodowanego jednym błędem, np.

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

Myślę, że myślałem, że idiomatyczny oznacza "najlepszy sposób" w przeciwieństwie do arbitralnego standardu. Ale myślę, że najlepszy sposób podlega kontekstowi. – MrBoJangles

4

W PHP I czasami spotkać kod jak:

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

Które idiomatically mogą być realizowane z:

return array_map('trim', $array);