Qu'est-ce qui est idiomatique?

19

Je comprends qu'un "idiome" est une opération ou un modèle courant qui, dans une langue particulière, n'est pas simplifié par la syntaxe du langage de base, comme l'incrément entier:

i = i + 1;

En C ++, cet idiome est simplifié par un opérateur:

++i;

Cependant, lorsque quelqu'un utilise le terme "idiomatique", je ne sais pas comment le comprendre. Qu'est-ce qui rend un morceau de code "idiomatique"?

void.pointer
la source
Cela appartient autant à english.stackexchange.com qu'ici.
S.Lott
@ perl.j: perspicace. Vous avez vraiment expliqué pourquoi la définition de "idiomatique" n'appartient pas à english.stackexchange.com. Très utile.
S.Lott

Réponses:

24

Une façon idiomatique d'écrire du code consiste à l'écrire de manière très spécifique en raison d'idiomes spécifiques à une langue que d'autres langues n'ont pas.

Par exemple, en C ++, l'exploitation de l'idiome RAII conduit à des façons d'écrire du code C ++ gérant des ressources idiomatiques.

Un autre exemple serait d'utiliser des compréhensions de liste en Python pour générer des listes. C'est idiomatique parce que vous auriez utilisé la compréhension de liste en Python idiomatique mais vous auriez pu faire la même chose en utilisant une fonction de générateur dans n'importe quel autre langage ou même en Python.

Souvent, quelqu'un qui essaie une nouvelle langue sans utiliser les idiomes spécifiques à cette langue n'écrira pas de code idiomatique.

Klaim
la source
Excellente description. Donc, en C #, si je crée une méthode d'extension appelée TryAdd()sur la Dictionaryclasse Generic pour vérifier d'abord !Contains(), puis appeler Add(), ce serait idiomatique? J'utilise une fonctionnalité spécifique aux méthodes d'extension C #.
void.pointer
1
Je ne suis pas sûr exactement comme le codeur C ++ le plus expérimenté vous dirait d'écrire des fonctions gratuites pour étendre les classes au lieu d'ajouter des membres, si possible. Ce n'est pas la même chose que les méthodes d'extension C # mais elle est assez proche et disponible pour tous les langages qui permettent des fonctions gratuites. Ce dont je suis sûr, c'est que l'écriture de "set / getters" en C # en utilisant les propriétés EST idiomatique.
Klaim
Mais ce n'est pas du C ++, donc utiliser la "façon C ++" peut ne pas être assez "idiomatique". L'utilisation d'une méthode d'extension ici est raisonnable et ressemble beaucoup à C #. En tout cas, c'était un exemple mais les méthodes d'extension sont très idiomatiques en C #.
void.pointer
Oui, c'est pourquoi j'ai dit "Je ne suis pas sûr", cela semble idiomatique, mais il est si proche des autres fonctionnalités de base d'autres langages que je ne suis pas sûr (parce que je ne suis pas un développeur C #). J'ai un autre exemple: le bouclage se fait par récursivité dans tous les langages fonctionnels. Vous pouvez le faire dans d'autres langues, mais c'est clairement idiomatique aux langages fonctionnels. Je ne sais pas si cela aide.
Klaim
1
Bien sûr, python va encore plus loin en ayant une manière idiomatique de se référer au code idiomatique, c'est-à-dire pythonique. * 8 ')
Mark Booth
12

Définition normale

Utilisation, contenant ou dénotant des expressions naturelles pour un locuteur natif

Définition de la programmation

L' utilisation, contenant ou dénotant expressions qui sont naturelles à [Insérer la langue] programmeur

ChaosPandion
la source
1
Si je pensais que les définitions de "google" pour ce terme étaient utiles, je n'aurais pas posté ici. Je voulais une meilleure description (comme un tutoriel) avec des exemples.
void.pointer
3
@Robert - Je suppose que je ne comprends pas pourquoi vous ne comprenez pas.
ChaosPandion
2
J'ai lu votre réponse en premier, elle n'était pas tout à fait claire. Après avoir lu la réponse qui est maintenant marquée comme ma réponse, il est devenu très clair ce que signifiait «idiomatique» et je le comprends maintenant. Maintenant que j'ai lu votre réponse, cela a du sens. Cependant, vous ne m'avez pas expliqué les exemples et les différents scénarios, c'est pourquoi je pense que votre réponse n'était pas aussi utile. Vous avez donné une réponse "webster" qui est techniquement correcte mais pas utile pour m'aider à comprendre. J'apprécie votre aide.
void.pointer
7

L'idiomatique dans le contexte de la programmation peut généralement être défini comme «la manière la plus naturelle d'exprimer quelque chose dans une langue»

Je vois que le mot idiomatique revient beaucoup en Ruby. Dans Ruby, il existe d'énormes capacités de méta-programmation, et pour écrire du code Ruby idiomatique, vous devez généralement les utiliser.

Notez que ce n'est pas parce qu'un morceau de code est idiomatique qu'il est propre ou même concis. Plusieurs fois, vous devez faire des compromis.

Donc, fondamentalement, idiomatique se réfère le plus souvent à la façon la plus courante d'écrire quelque chose dans une langue, souvent en incluant "l'argot" (idiomes). Si un morceau de code n'est pas idiomatique, il peut être parfaitement lisible, concis, propre et correct, mais il peut sembler / sembler gênant dans la langue utilisée. C'est une préférence de goût de savoir si la réécriture idiomatique d'un tel morceau de code serait réellement une bonne chose et doit être jugée au cas par cas.

L'anglais idiomatique par exemple peut dépendre de la région. L'utilisation du mot bumest probablement requise pour l'anglais britannique idiomatique, mais buttest plus appropriée pour l'anglais américain. (Je ne connais pas beaucoup l'anglais britannique malheureusement: /)

Earlz
la source
Merci (vote positif), je pense que votre définition l'a frappé directement pour moi!
Ashaman Kingpin
3

Le meilleur exemple que je puisse imaginer, du haut de ma tête, pour quelque chose qui est idiomatique, vient de Ruby.

Dans une multitude de langues, vous pouvez répéter avec:

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

Ou quelque chose de très similaire. De nombreuses langues ont également une foreach(x in SetOfXes)construction. Mais l'itération qui est idiomatique pour Ruby comprend des choses comme:

collection.each do |current|
  current.do_stuff
end

et même

10.times do |x|
  puts x
end

Je les vois comme idiomatiques parce qu'ils représentent une façon de faire quelque chose qui est moins commun, et qui représente quelque chose au cœur de la philosophie de son domaine. Ruby a une philosophie d'interaction avec des objets qui, bien que n'étant pas unique, n'est pas omniprésente.

Sur une note sémantique, chaque fois que j'entends le mot idiomatique, mon cerveau achève automatiquement la pensée comme "idiomatique à ..." - Je l'analyse par réflexe comme se rapportant à un sujet spécifique.

jachères
la source
En quoi est-ce collection.each do |current|différent de foreach(current in collection)? Les deux sont des constructions de boucles qui sont définies currentpour chaque élément de collection.
MSalters
2

Les idiomes sont généralement la meilleure façon d'exprimer une situation commune et relativement complexe dans une langue. L'incrémentation n'est pas un idiome ou quelque chose du genre. En utilisant l'incrément de préfixe au lieu de postfix, vous pourriez prétendre être un idiome C ++.

Les idiomes sont le meilleur moyen d'utiliser une langue, tel que déterminé par les utilisateurs experts. Un véritable idiome C ++ serait des objets de fonction. Un autre idiome serait RAII. Rien dans le langage ne vous dit que vous devez libérer des ressources dans le destructeur. Mais c'est idiomatique de le faire. Un autre exemple est celui des modèles - il est idiomatique d'utiliser des modèles pour tout ce que vous pouvez, mais rien ne vous empêche de sur-utiliser l'héritage.

DeadMG
la source
Wikipedia a utilisé l'incrémentation comme exemple, c'est pourquoi je l'ai mentionné dans ma question. Pourquoi les idiomes doivent-ils être complexes? Cela ne semble pas faire partie de la définition basée sur les autres réponses.
void.pointer
4
@Robert Dailey: Comment l'incrémentation pourrait-elle être un idiome? Cela fait partie de la langue . Les idiomes sont faits par les utilisateurs d'une langue, ils changent avec le temps. L'incrémentation n'est pas un idiome, c'est une fonctionnalité de base du langage. Prenant cette logique, je pourrais dire que toute autre fonction de langage de base est un idiome, et donc chaque programme est idiomatique, ce qui n'est pas le cas.
DeadMG
2

Votre définition ne me semble pas correcte. Un idiome est un moyen d'écrire quelque chose qui peut ou non être possible dans d'autres langues, mais qui est courant dans cette langue. Habituellement, c'est plus court que l'alternative, mais ce n'est pas vraiment une exigence.

Il pourrait être plus facile de l'expliquer en parlant de ce qui n'est pas idiomatique. En C ++, c'est assez idiomatique d'écrire:

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

C'est encore plus idiomatique d'écrire:

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

Ce code fait exactement la même chose - certaines personnes qui débutent en C ++ peuvent le lire comme un test pour voir si p est égal à ce que renvoie la fonction, mais ce n'est pas ce qu'il fait.

Comparez ce que quelqu'un pourrait écrire, de façon très non idiomatique, qui est venu d'une autre langue:

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

Vous verrez également ce truc comme non idiomatique:

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

Parce que l'approche idiomatique est

return (x>0);

Les manières non idiomatiques ne sont pas mauvaises, mais elles prennent généralement plus de temps à taper et elles prennent toujours plus de temps à lire, pour ceux qui connaissent les idiomes. Si je vous appelle "le garçon qui a crié au loup" et que vous connaissez l'histoire, c'est plus rapide que si je vous explique comment les fausses alarmes font que les gens vous ignorent. Le problème, bien sûr, est que si vous ne connaissez pas l'histoire et ne savez pas ce que les loups ont à voir avec ce dont nous parlons. De même, cela peut être un problème si vous ne l'avez jamais vu return x<y;auparavant et que vous ne savez vraiment pas ce qu'il fait.

Kate Gregory
la source
1
L'approche idiomatique serait sûrement de déclarer le pointeur dans la condition if, afin qu'il ne soit jamais accessible s'il n'est pas NULL. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG
mm, probablement. Ou mille lignes plus tôt car il est utilisé tout au long de ce bloc. Ou dans un fichier d'en-tête car il s'agit d'une variable membre. Je l'ai seulement déclaré pour que les lecteurs sachent que c'était un Foo *, vous avez raison de dire que dans la vraie vie, il ne serait pas déclaré là-bas.
Kate Gregory
1

Lorsqu'il existe plusieurs façons d'exprimer quelque chose, la manière la plus courante ou communément acceptée. Par exemple, en utilisant une instruction structurée en C au lieu de l'équivalent exact en utilisant des instructions goto.

hotpaw2
la source