O que é código idiomático?


86

Eu estaria interessado em alguns exemplos de c # antes e depois, alguns exemplos não idiomáticos versus idiomáticos. Exemplos não-c # também seriam adequados se eles transmitissem a ideia. Obrigado.


3
Os recursos ocultos do C # estão repletos de C # idiomáticos. Nem tudo isso, lembre-se, mas muitas das frases simples com um grande número de votos positivos podem ser consideradas idiomáticas. E algumas respostas também descrevem as alternativas não idiomáticas.
Michiel van Oosterhout

Respostas:


119

Idiomático significa seguir as convenções do idioma. Você deseja encontrar as maneiras mais fáceis e comuns de realizar uma tarefa, em vez de transportar seu conhecimento de um idioma diferente.

python não idiomática usando um loop com append:

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

python idiomática usando uma compreensão de lista:

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

36

Alguns exemplos:

Gerenciamento de recursos , não idiomático:

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

Iteração , não idiomática:

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

Também não idiomático:

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

Idiomático:

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

Filtragem , não idiomática:

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
As chaves são idiomáticas Java ;-)
Mathieu Guindon

15

Código idiomático é o código que executa uma tarefa comum da maneira comum para o seu idioma. É semelhante a um padrão de design, mas em uma escala muito menor. Os idiomas variam amplamente por idioma. Um idioma em C # pode ser usar um iterador para iterar por meio de uma coleção em vez de fazer um loop por ela. Outras linguagens sem iteradores podem contar com o idioma do loop.


6

Em PHP, às vezes encontro códigos como:

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

Que pode ser implementado de forma idiomática com:

return array_map('trim', $array);

5

Na prática, significa escrever código de maneira consistente, ou seja, todos os desenvolvedores que trabalham em sua base de código devem seguir as mesmas convenções ao escrever construções de código semelhantes.

Portanto, a forma idiomática é a maneira que corresponde ao estilo do outro código, a forma não idiomática significa que você está escrevendo o tipo de função, mas de uma maneira diferente.

por exemplo, se você estiver executando um loop de um certo número de itens, poderá escrever o loop de várias maneiras:

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

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

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

etc

O mais importante é que o estilo escolhido seja usado de forma consistente. Dessa forma, as pessoas se familiarizam e confiam em como usá-lo, e quando você vê um uso que parece diferente, pode ser um sinal de que um erro foi introduzido, talvez um erro errado, por exemplo

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

2
Acho que pensei que idiomático significava "a melhor maneira", em oposição a apenas um padrão arbitrário. Mas acho que a melhor maneira está sujeita ao contexto.
MrBoJangles,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.