2008-09-17 4 views
51

Ich würde mich für einige Vorher-Nachher-Beispiele interessieren, einige nicht-idiomatische vs idiomatische Beispiele. Nicht-C# Beispiele wären auch gut, wenn sie die Idee vermitteln. Vielen Dank.Was ist idiomatischer Code?

+4

Wie ich eine negative erhalten tun, das ist eine verdammt gute Frage! – MrBoJangles

+1

Einverstanden, gute Frage mit ein paar netten Antworten. –

+3

[Versteckte Funktionen von C#] (http://StackOverflow.com/q/9033/4830) ist voll von idiomatischen C#. Nicht Sie alle, aber viele der einfachen Einzeiler mit einer hohen Anzahl von Upvotes könnten als idiomatisch betrachtet werden. Und einige Antworten beschreiben auch die nicht-idiomatischen Alternativen. –

Antwort

68

Idiomatisch bedeutet, den Konventionen der Sprache zu folgen. Sie möchten die einfachsten und gebräuchlichsten Methoden zum Ausführen einer Aufgabe finden, anstatt Ihr Wissen aus einer anderen Sprache zu portieren.

nicht-idiomatische Python eine Schleife mit append mit:

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

idiomatische Python eine Liste Verständnis mit:

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

Idiomatischer Code ist ein Code, der eine allgemeine Aufgabe für Ihre Sprache erfüllt. Es ist ähnlich einem Designmuster, aber in einem viel kleineren Maßstab. Idiome unterscheiden sich stark nach Sprache. Ein Idiom in C# könnte darin bestehen, einen Iterator zu verwenden, um eine Sammlung zu durchlaufen, anstatt sie zu durchlaufen. Andere Sprachen ohne Iteratoren können sich auf das Schleifen-Idiom verlassen.

23

Einige Beispiele:

Ressourcenmanagement, nicht idiomatischen:

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

Iteration, nicht idiomatischen:

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

Auch nicht-idiomatische:

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

Idiomatic:

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

Filtern, nicht-idiomatische:

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

idiomatische:

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

Die Zahnspange ist idiomatisch Java ;-) –

3

Praktisch bedeutet es Code in einer konsistenten Art und Weise zu schreiben, dh alle Entwickler, die sollten auf Ihrer Code-Basis arbeiten folgen die gleichen Konventionen beim Schreiben ähnlicher Code-Konstrukte.

So ist die idiomatische Art und Weise, die den Stil des anderen Codes entspricht, bedeutet nicht-idiomatische Weise, dass Sie die Art der Funktion aber auf eine andere Weise schreiben.

z.B. wenn Sie eine bestimmte Anzahl von Elementen sind Looping, könnten Sie die Schleife auf verschiedene Weise schreiben:

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

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

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

etc

Was am wichtigsten ist, dass der gewählte Stil konsequent verwendet wird. Auf diese Weise werden die Leute sehr vertraut und vertraut mit ihrer Verwendung, und wenn Sie eine Verwendung ausspionieren, die anders aussieht, kann dies ein Zeichen dafür sein, dass ein Fehler eingeführt wird, vielleicht ein Fehler nach dem anderen, z.

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

Ich denke, ich dachte, idiomatische bedeutet "der beste Weg" im Gegensatz zu nur einem willkürlichen Standard. Aber ich denke, der beste Weg hängt vom Kontext ab. – MrBoJangles

4

In PHP begegne ich manchmal Code wie:

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

die mit idiomatisch umgesetzt werden können:

return array_map('trim', $array);