2008-09-17 12 views
51

Me interesarían algunos ejemplos de C# antes y después, algunos ejemplos idiomáticos y no idiomáticos. Los ejemplos que no sean C# también estarían bien si transmiten la idea. Gracias.¿Qué es el código idiomático?

+4

¿Cómo consigo un negativo, esta es una buena pregunta maldito! – MrBoJangles

+1

De acuerdo, buena pregunta con algunas buenas respuestas. –

+3

[Funciones ocultas de C#] (http://stackoverflow.com/q/9033/4830) está lleno de C# idiomático. No todo esto te importa, pero muchos de los simples de una línea con un alto número de upvotes podrían considerarse idiomáticos. Y algunas respuestas describen las alternativas no idiomáticas también. –

Respuesta

68

Idiomático significa seguir las convenciones del idioma. Desea encontrar las formas más sencillas y comunes de realizar una tarea en lugar de trasladar su conocimiento desde un idioma diferente.

pitón

no idiomática usando un bucle con append:

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

pitón idiomática usando una lista por comprensión:

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

El código idiomático es un código que realiza una tarea común de la manera común para su idioma. Es similar a un patrón de diseño, pero a una escala mucho más pequeña. Los modismos difieren ampliamente por idioma. Una expresión en C# podría ser utilizar un iterador para iterar a través de una colección en lugar de recorrerlo. Otros lenguajes sin iteradores pueden confiar en el idioma del bucle.

23

Algunos ejemplos:

gestión de recursos de, no idiomática:

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, no idiomática:

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

también no idiomática:

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

Idiomatic:

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

Filtrado, no idiomática:

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

idiomática:

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

Las llaves son idiomáticas de Java ;-) –

3

En términos prácticos, esto significa que la escritura de código de una manera coherente, es decir, todos los desarrolladores que trabajan en su base de código deben seguir las mismas convenciones al escribir construcciones de código similares.

Así que la forma idiomática es la que coincide con el estilo del otro código, la forma no idiomática significa que está escribiendo el tipo de función pero de una manera diferente.

p. Ej. Si se recorre un cierto número de elementos, se podría escribir el bucle de varias maneras:

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

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

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

etc

Lo que es más importante es que el estilo elegido se utiliza constantemente. De esta forma, la gente se familiarizará con la forma de usarla y se sentirá segura de sí misma, y ​​cuando ve un uso que se ve diferente, puede ser una señal de que se ha introducido un error, por ejemplo, un error "por un error", p.

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

Creo que pensé que idiomático significaba "la mejor manera" en lugar de simplemente un estándar arbitrario. Pero creo que la mejor manera está sujeta al contexto. – MrBoJangles

4

En PHP a veces me encuentro con un código como:

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

Qué idiomáticamente puede ser implementado con:

return array_map('trim', $array); 
Cuestiones relacionadas