web-dev-qa-db-fra.com

Qu'est-ce que le code idiomatique?

Je serais intéressé par quelques exemples c # avant et après, quelques exemples non idiomatiques vs idiomatiques. Les exemples non c # conviendraient également s'ils transmettaient l'idée. Merci.

80
MrBoJangles

Idiomatique signifie suivre les conventions de la langue. Vous souhaitez trouver les moyens les plus simples et les plus courants d'accomplir une tâche plutôt que de transférer vos connaissances dans une langue différente.

non idiomatique python utilisant une boucle avec append:

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

idiomatique python en utilisant une compréhension de liste:

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

Quelques exemples:

Gestion des ressources, non idiomatique:

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

Idiomatique:

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

Itération, non idiomatique:

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

Également non idiomatique:

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

Idiomatique:

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

Filtrage, non idiomatique:

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

idiomatique:

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

Le code idiomatique est un code qui effectue une tâche commune de la même manière pour votre langue. C'est semblable à un modèle de conception, mais à une échelle beaucoup plus petite. Les idiomes diffèrent considérablement selon la langue. Un idiome en C # pourrait être d'utiliser un itérateur pour parcourir une collection plutôt que de la parcourir en boucle. D'autres langues sans itérateurs peuvent s'appuyer sur l'idiome de boucle.

12
Bill the Lizard

Dans PHP je rencontre parfois du code comme:

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

Qui peut être implémenté idiomatiquement avec:

return array_map('trim', $array);
6
jmoz

Concrètement, cela signifie écrire du code de manière cohérente, c'est-à-dire que tous les développeurs qui travaillent sur votre base de code doivent suivre les mêmes conventions lorsqu'ils écrivent des constructions de code similaires.

Donc, la manière idiomatique est la manière qui correspond au style de l'autre code, la manière non idiomatique signifie que vous écrivez le type de fonction mais d'une manière différente.

par exemple. si vous bouclez un certain nombre d'éléments, vous pouvez écrire la boucle de plusieurs manières:

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

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

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

etc

Le plus important est que le style choisi soit utilisé de manière cohérente. De cette façon, les gens deviennent très familiers et confiants sur la façon de l'utiliser, et lorsque vous espionnez une utilisation qui semble différente, cela peut être le signe d'une erreur introduite, peut-être une erreur d'une erreur, par exemple.

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