O que é idiomático?


19

Entendo que um "idioma" seja uma operação ou padrão comum que, em um idioma específico, não seja simplificado pela sintaxe do idioma principal, como incremento inteiro:

i = i + 1;

No C ++, esse idioma é simplificado por um operador:

++i;

No entanto, quando alguém usa o termo "idiomático", não sei como entendê-lo. O que torna um pedaço de código "idiomático"?


Isso pertence tanto a english.stackexchange.com quanto aqui.
31511 S.Lott

@ perl.j: Esclarecedor. Você realmente esclareceu por que a definição de "Idiomatic" não pertence a english.stackexchange.com. Muito útil.
22411 S.Lott

Respostas:


24

Uma maneira idiomática de escrever algum código é quando você o escreve de uma maneira muito específica, devido a idiomas específicos de idioma que outros idiomas não possuem.

Por exemplo, em C ++, a exploração do idioma RAII leva a maneiras de escrever código C ++, gerenciando recursos idiomáticos.

Outro exemplo seria usar a compreensão de lista no Python para gerar listas. É idiomático porque você teria usado a compreensão da lista no Python idiomático, mas poderia ter feito o mesmo usando uma função de gerador em qualquer outra linguagem ou até mesmo no Python.

Geralmente, alguém que tenta um novo idioma sem usar os idiomas específicos para esse idioma não escreve código idiomático.


Excelente descrição. Então, em C #, se eu criar um método de extensão chamado TryAdd()na Dictionaryclasse Generic para verificar primeiro !Contains()e depois chamar Add(), isso seria idiomático? Estou usando um recurso específico para métodos de extensão c #.
void.pointer

1
Não sei exatamente como o codificador C ++ mais experiente diria para você escrever funções gratuitas para estender classes em vez de adicionar membros, sempre que possível. Não é o mesmo que métodos de extensão C #, mas é bastante próximo e disponível para qualquer idioma que permita funções gratuitas. O que tenho certeza é que escrever "set / getters" em C # usando as propriedades é idiomático.
21411 Klaim

Mas como não é C ++, o uso da "maneira C ++" pode não ser suficientemente idiomático. O uso de um método de extensão aqui é razoável e muito parecido com C #. De qualquer forma, foi um exemplo, mas os métodos de extensão são muito idiomáticos para o C #.
void.pointer

Sim, foi por isso que disse "Não tenho certeza", parece idiomático, mas é tão próximo a outros recursos básicos de outros idiomas que não tenho certeza (porque não sou um desenvolvedor de C #). Eu tenho outro exemplo: o loop é feito por recursão em todas as linguagens funcionais. Você pode fazer isso em outros idiomas, mas claramente é idiomático para idiomas funcionais. Não tenho certeza se isso ajuda.
21411 Klaim

1
É claro que o python vai um passo além ao ter uma maneira idiomática de se referir ao código idiomático, ou seja, python. * 8 ')
Mark Booth

12

Definição Normal

Usando, contendo ou denotando expressões naturais para um falante nativo

Definição de Programação

Usando, contendo, ou que denota expressões que são naturais para um [Insert Language] programador


1
Se eu achasse que as definições "google" para este termo eram úteis, não teria postado aqui. Eu queria uma descrição melhor (tipo tutorial) com exemplos.
void.pointer

3
@ Robert - Acho que não entendo por que você não entende.
ChaosPandion

2
Eu li sua resposta primeiro, não estava muito claro. Depois de ler a resposta que agora está marcada como minha resposta, ficou muito claro o que "idiomático" significava e agora eu o entendo. Agora que li sua resposta, faz sentido. No entanto, você não me mostrou exemplos e cenários diferentes, e é por isso que acho que sua resposta não foi tão útil. Você deu uma resposta "webster" que é tecnicamente correta, mas não é útil na medida em que me ajuda a entender. Agradeço sua ajuda.
void.pointer

7

Idiomatic no contexto da programação geralmente pode ser definido como "a maneira mais natural de expressar algo em uma linguagem"

Vejo a palavra idiomática surgir particularmente em Ruby. No Ruby, existem enormes recursos de metaprogramação e, para escrever código Ruby idiomático, você geralmente deve usá-los.

Observe que apenas porque um pedaço de código é idiomático, não significa que ele seja limpo ou mesmo conciso. Muitas vezes você deve fazer compromissos.

Então, basicamente, idiomático se refere mais comumente à maneira mais comum de escrever algo em um idioma, muitas vezes incluindo "gírias" (expressões idiomáticas). Se um pedaço de código não for idiomático, ele pode ser perfeitamente legível, conciso, limpo e correto, mas pode parecer / parecer estranho no idioma usado. É preferível saber se reescrever um pedaço de código desse idioma seria realmente uma coisa boa e deve ser julgado caso a caso

O inglês linguístico, por exemplo, pode depender da região. bumProvavelmente, é necessário usar a palavra para o inglês idiomático do Reino Unido, enquanto butté mais apropriado para o inglês dos EUA. (Eu não sei muito inglês inglês do Reino Unido: /)


Obrigado (votado), acho que sua definição foi acertada no momento certo para mim!
Ashaman Kingpin 19/11

3

O melhor exemplo que posso conceber, de cabeça para baixo, para algo idiomático, vem de Ruby.

Em vários idiomas, você pode iterar com:

for( start; end; increment){
    code;
}

Ou algo muito semelhante. Muitos idiomas também têm uma foreach(x in SetOfXes)construção. Mas a iteração idiomática para Ruby inclui coisas como:

collection.each do |current|
  current.do_stuff
end

e até mesmo

10.times do |x|
  puts x
end

Eu os vejo como idiomáticos, porque representam uma maneira de fazer algo menos comum e que representa algo no cerne da filosofia de seu domínio. Ruby tem uma filosofia sobre a interação com objetos que, embora não sejam únicos, não são onipresentes.

Em uma nota semântica, sempre que ouço a palavra idiomática, meu cérebro automaticamente conclui o pensamento como "idiomático para ..." - apenas o analiso em relação a um assunto específico.


Qual é a collection.each do |current|diferença foreach(current in collection)? Ambos são construções de loop definidas currentpara cada elemento de collection.
precisa saber é o seguinte

2

Os idiomas geralmente são a melhor maneira possível de expressar uma situação comum e relativamente complexa em um idioma. Incrementar não é um idioma nem nada do tipo. Usando incremento de prefixo em vez de postfix, você pode argumentar ser um idioma C ++.

Os idiomas são a melhor maneira de usar um idioma, conforme determinado por usuários especializados. Um idioma C ++ real seria um objeto de função. Outro idioma seria RAII. Não há nada no idioma dizendo que você deve liberar recursos no destruidor. Mas é idiomático fazê-lo. Outro exemplo é o de modelos - é idiomático usar modelos para, bem, tudo o que você pode, mas não há nada que o impeça de usar a herança.


A Wikipedia usou o incremento como exemplo, por isso mencionei na minha pergunta. Por que os idiomas precisam ser complexos? Isso não parece fazer parte da definição com base nas outras respostas.
void.pointer

4
@Robert Dailey: Como o incremento pode ser uma expressão idiomática? Faz parte do idioma . Os idiomas são criados pelos usuários de um idioma, eles mudam com o tempo. Incrementar não é um idioma, é uma funcionalidade básica da linguagem. Seguindo essa lógica, eu poderia dizer que qualquer outra função básica da linguagem é uma expressão idiomática e, portanto, todo programa é idiomático, o que não é.
DeadMG

2

Sua definição não me parece correta. Um idioma é uma maneira de escrever algo que pode ou não ser possível em outros idiomas, mas que é comum nesse idioma. Geralmente, é mais curto que a alternativa, mas isso não é realmente um requisito.

Pode ser mais fácil explicá-lo falando sobre o que não é idiomático. No C ++, é bastante idiomático escrever:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p)
{
 // whatever
}

É ainda mais idiomático escrever:

Foo* p; 
if(p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
{
 // whatever
}

Esse código faz exatamente a mesma coisa - algumas pessoas que são novas no C ++ podem lê-lo como teste para ver se p é igual ao que a função retorna, mas não é isso que ele faz.

Compare com o que alguém pode escrever, de maneira não-linguística, que veio de outro idioma:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p !=NULL)
{
 // whatever
}

Você também verá essas coisas como não-idiomáticas:

if (x>0)
  return true;
else
 return false;

Como a abordagem idiomática é

return (x>0);

As formas não-idiomáticas não estão erradas, mas geralmente levam mais tempo para digitar e sempre para ler, para quem conhece os idiomas. Se eu te chamo de "o garoto que chorou lobo" e você conhece a história, é mais rápido do que se eu explique sobre como os alarmes falsos fazem com que as pessoas o ignorem. O problema, é claro, é se você não conhece a história e não sabe o que os lobos têm a ver com o que estamos falando. Da mesma forma, pode ser um problema se você nunca viu return x<y;antes e realmente não sabe o que faz.


1
A abordagem idiomática certamente seria declarar o ponteiro na condição if, para que ele nunca possa ser acessado se não for NULL. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG

mm, provavelmente. Ou mil linhas antes, porque é usado em todo este bloco. Ou em um arquivo de cabeçalho porque é uma variável de membro. Eu apenas o declarei para que os leitores saibam que é um Foo *, você está certo que na vida real não seria declarado lá.
22711 Kate

1

Quando existem várias maneiras de expressar algo, a maneira mais comum ou comumente aceita. Por exemplo, usando uma instrução estruturada em C em vez do equivalente exato usando instruções goto.

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.