2008-09-17 11 views
51

Je serais intéressé par quelques exemples de C# avant-après, certains exemples non-idiomatiques vs idiomatiques. Des exemples non-C# seraient bien aussi s'ils ont l'idée de l'autre côté. Merci.Qu'est-ce qu'un code idiomatique?

+4

Comment puis-je obtenir un négatif, c'est une sacrément bonne question! – MrBoJangles

+1

D'accord, bonne question avec quelques bonnes réponses. –

+3

[Les fonctionnalités cachées de C#] (http://stackoverflow.com/q/9033/4830) sont pleines de C# idiomatiques. Cela ne vous dérange pas tous, mais la plupart des simples doublures avec un nombre élevé de upvotes pourraient être considérées idiomatiques. Et certaines réponses décrivent également les alternatives non-idiomatiques. –

Répondre

68

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

python non idiomatiques en utilisant une boucle avec append:

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

python idiomatiques en utilisant une compréhension de la liste:

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

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

23

Quelques exemples:

Gestion des ressources, non idiomatiques:

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

idiomatiques:

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

Iteration, non idiomatiques:

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

également non idiomatiques:

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

idiomatiques:

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

Filtrage, non idiomatiques:

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

idiomatiques:

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

Les accolades sont idiomatiques Java ;-) –

3

En pratique, cela signifie que le code écrit de manière cohérente, à savoir tous les développeurs qui travaillent sur votre base de code devraient suivre les mêmes conventions lors de l'écriture de constructions de code similaires.

Ainsi, la manière idiomatique correspond au style de l'autre code. Une manière non-idiomatique signifie que vous écrivez le type de fonction mais de manière différente.

par exemple. si vous Looping un certain nombre d'éléments, vous pouvez écrire la boucle de plusieurs façons:

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

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

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

etc

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

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

Je suppose que je pensais que idiomatique signifiait "la meilleure façon" par opposition à un standard arbitraire. Mais je suppose que la meilleure façon de faire dépend du contexte. – MrBoJangles

4

En PHP je rencontre parfois du code comme:

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

Ce qui peut être mis en œuvre avec idiomatiques:

return array_map('trim', $array); 
Questions connexes