¿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.


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] 

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);

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.


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);

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++)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.