Was ist idiomatischer Code?


85

Ich würde mich für einige Vorher-Nachher-c # -Beispiele interessieren, einige nicht-idiomatische oder idiomatische Beispiele. Nicht-c # -Beispiele wären ebenfalls in Ordnung, wenn sie die Idee vermitteln würden. Vielen Dank.


3
Versteckte Funktionen von C # sind voller idiomatischer C #. Nicht alles dagegen, aber viele der einfachen Einzeiler mit einer hohen Anzahl von Upvotes könnten als idiomatisch angesehen werden. Einige Antworten beschreiben auch die nicht-idiomatischen Alternativen.
Michiel van Oosterhout

Antworten:


119

Idiomatisch bedeutet, den Konventionen der Sprache zu folgen. Sie möchten die einfachsten und gebräuchlichsten Wege finden, um eine Aufgabe zu erfüllen, anstatt Ihr Wissen aus einer anderen Sprache zu portieren.

Nicht-idiomatische Python mit einer Schleife mit Anhängen:

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

idiomatische Python mit einem Listenverständnis:

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

36

Einige Beispiele:

Ressourcenmanagement , nicht idiomatisch:

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

Idiomatisch:

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

Iteration , nicht idiomatisch:

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

Auch nicht idiomatisch:

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

Idiomatisch:

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

Filtern , nicht idiomatisch:

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

idiomatisch:

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

13
Die Klammern sind idiomatisch Java ;-)
Mathieu Guindon

15

Idiomatischer Code ist Code, der eine gemeinsame Aufgabe auf die für Ihre Sprache übliche Weise ausführt. Es ähnelt einem Designmuster, ist jedoch viel kleiner. Die Redewendungen unterscheiden sich stark je nach Sprache. Eine Redewendung in C # könnte darin bestehen, einen Iterator zu verwenden, um eine Sammlung zu durchlaufen, anstatt sie zu durchlaufen. Andere Sprachen ohne Iteratoren stützen sich möglicherweise auf die Schleifensprache.


6

In PHP stoße ich manchmal auf Code wie:

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

Was idiomatisch umgesetzt werden kann mit:

return array_map('trim', $array);

5

In der Praxis bedeutet dies, Code auf konsistente Weise zu schreiben. Das heißt, alle Entwickler, die an Ihrer Codebasis arbeiten, sollten beim Schreiben ähnlicher Codekonstrukte dieselben Konventionen befolgen.

Der idiomatische Weg ist also der Weg, der dem Stil des anderen Codes entspricht. Der nicht-idiomatische Weg bedeutet, dass Sie die Art der Funktion schreiben, aber auf eine andere Weise.

Wenn Sie beispielsweise eine bestimmte Anzahl von Elementen in einer Schleife ausführen, können Sie die Schleife auf verschiedene Arten schreiben:

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

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

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

etc

Am wichtigsten ist, dass der gewählte Stil konsequent verwendet wird. Auf diese Weise werden die Leute sehr vertraut und sicher mit der Verwendung, und wenn Sie eine Verwendung ausspionieren, die anders aussieht, kann dies ein Zeichen dafür sein, dass ein Fehler eingeführt wurde, möglicherweise ein Fehler, z

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

2
Ich denke, ich dachte, idiomatisch bedeutet "der beste Weg" im Gegensatz zu nur einem willkürlichen Standard. Aber ich denke, ein bester Weg hängt vom Kontext ab.
MrBoJangles
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.