¿Qué es el código idiomático?

86

Me interesaría algunos ejemplos de c # antes y después, algunos ejemplos no idiomáticos vs idiomáticos. Los ejemplos que no sean de C # también estarían bien si transmiten la idea. Gracias.

MrBoJangles
fuente
3
Las características ocultas de C # están llenas de C # idiomático. No todo eso le importa, pero muchas de las frases sencillas con una gran cantidad de votos positivos podrían considerarse idiomáticas. Y algunas respuestas también describen las alternativas no idiomáticas.
Michiel van Oosterhout

Respuestas:

119

Idiomático significa seguir las convenciones del idioma. Desea encontrar las formas más fáciles y comunes de realizar una tarea en lugar de transferir sus conocimientos de un idioma diferente.

Python no idiomático usando un bucle con agregar:

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

Python idiomático usando una lista de comprensión:

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

Algunos ejemplos:

Gestión de recursos , no idiomática:

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

Idiomático:

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

Iteración , no idiomática:

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

También no idiomático:

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

Idiomático:

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

Filtrado , no idiomático:

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

idiomático:

var list2 = list1.Where(num=>num>100);
JacquesB
fuente
13
Las llaves son idiomáticas Java ;-)
Mathieu Guindon
15

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 menor. Los modismos difieren ampliamente según el idioma. Un modismo en C # podría ser usar un iterador para iterar a través de una colección en lugar de recorrerla. Otros lenguajes sin iteradores pueden depender del lenguaje de bucle.

Bill el lagarto
fuente
6

En PHP, a veces encuentro código como:

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

Que idiomáticamente se puede implementar con:

return array_map('trim', $array);
jmoz
fuente
5

En términos prácticos, significa escribir código de forma 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.

Entonces, la forma idiomática es la forma 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.

Por ejemplo, si está repitiendo un cierto número de elementos, puede escribir el bucle de varias formas:

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

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

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

etc

Lo más importante es que el estilo elegido se utilice de forma coherente. De esa manera, las personas se familiarizan y se sienten más seguras de cómo usarlo, y cuando espías un uso que se ve diferente, puede ser una señal de que se está introduciendo un error, tal vez un error por un error, p.

for (int i = 1; i < itemCount; i++)
RickL
fuente
2
Supongo que pensé que idiomático significaba "la mejor manera" en lugar de un estándar arbitrario. Pero supongo que la mejor forma está sujeta al contexto.
MrBoJangles