Le but du code est-il «idiomatique» pour réduire les frais généraux cognitifs?


22

J'essaie d'expliquer à quelqu'un que la façon dont il a écrit le code est difficile à comprendre, et si vous le refactorisez, il est plus facile à lire. Ce style de code que je veux utiliser est communément appelé code «idiomatique».

Mais l'expression code idiomatique apporte un bagage d' exactitude morale , qui n'est pas un grand facteur de motivation pour amener les gens à changer leur style de codage. Une façon plus positive de dire cela est un code qui suit le style commun - mais pour un penseur critique qui apparaît comme un raisonnement de mentalité de troupeau.

La façon dont j'ai trouvé l'explication de cette idée d'une manière qui motive les gens à changer leur code est la suivante:

  • écrire le code de manière à réduire les frais cognitifs du lecteur (par exemple, je ne me souviens pas s'il s'agit du premier type de vecteur - ou du 5e type de vecteur)
  • code qui facilite la compréhension de l'intention (par exemple, à quoi sert ce vecteur?)

(Soit dit en passant, je sais que le livre The Joy of Clojure, avant sa première publication, avait le projet de titre Idiomatic Clojure. Il semblerait donc qu'il y ait une raison pour rendre le code «idiomatique», pour «apporter de la joie» au lecteur ).

Ma question est: le but derrière le code est-il «idiomatique» pour réduire les frais généraux cognitifs?


Mon commentaire typique, en ce qui concerne la lecture de code, est que vous écrivez du code pour au moins deux compilateurs: les autres personnes, vous y compris, qui doivent lire le code plus tard. Et le processus que vous exécutez via Ant, Make ou un IDE. Le premier est plus important.

Réponses:


19

Premièrement, je ne suis pas sûr qu'il y ait une sorte de «correction morale» dans le terme «idiomatique». La définition simple du dictionnaire est simplement

propre ou caractéristique d'une langue ou d'un dialecte particulier: le français idiomatique.

Oui, le code idiomatique réduit généralement les frais généraux cognitifs, en particulier au niveau des définitions d'interface où les bibliothèques standard et toutes les bibliothèques tierces dont le projet a besoin sont (virtuellement) toutes idiomatiques.

Comme argument de vente, cependant, je me concentrerais sur ce que la réduction des frais généraux cognitifs fait pour vous. Cela permet aux programmeurs de repérer plus facilement les erreurs car ils n'essaient pas de démêler le code écrit dans un style unique pour comprendre où il est subtilement désactivé par un ou mal gérer un cas de bord. Cela facilite la révision du code d'autres personnes, ce qui rend plus probable que l'équipe fasse de véritables révisions qui identifient les vrais problèmes plutôt que de discuter de la syntaxe.

Au-delà de la réduction des frais généraux cognitifs, le code idiomatique est généralement un code plus efficace. La plupart des idiomes dans une langue particulière évoluent parce que la langue est conçue pour aborder les problèmes d'une manière particulière. Les compilateurs ou interprètes que vous utilisez concentreront leurs optimisations sur le code idiomatique. Si vous utilisez un langage où la récursivité est le moyen idiomatique de structurer un morceau de code, par exemple, vous pouvez être presque certain que votre compilateur implémente la récursivité de queue. Si vous utilisez un langage où la récursivité n'est pas idiomatique, cela est beaucoup moins probable. Il est peu probable que la récursivité de la queue ne puisse pas être implémentée partout, mais la plupart des rédacteurs de compilateurs ne se concentreront pas sur des choses qui ne se produisent pas couramment.


1
Votre réponse, tout à fait raisonnable, inspire cette réaction: français idiomatique, de Paris, Montréal, Côte d'Ivoire? Le code n'est pas si différent. Il n'y a pas d'idiome sans communauté. Si vous parlez de Montréal, vous pouvez vous attendre à provoquer un peu de «surcharge cognitive» à Paris. Probablement le monde sera toujours divisé entre ceux qui pensent qu'il n'y a qu'une seule bonne voie (Python?) Et ceux qui disent Vive la différence! (Javascript?). Maintenant, si nous voulons écrire un langage Javascript que les compilateurs trouvent plus efficace, écrivons tous comme un minifieur / uglifier!
joshp

Heureusement, lorsque V8 est sorti, les concepteurs ont décidé qu'ils ne joueraient plus au jeu des microbenchmarks artificiels et ont créé des benchmarks qui simulent un code idiomatique réel, bien factorisé et bien conçu, et les autres fournisseurs ont maintenant emboîté le pas. Cela a entraîné un renversement de rôle dans le jeu de performance: avant que le programmeur n'écrive son code pour les performances afin que les rédacteurs du compilateur aient un travail facile, maintenant c'est le travail des rédacteurs du compilateur de concevoir leurs compilateurs pour les performances, afin que le programmeur ait un travail facile - ce qui devrait être ainsi.
Jörg W Mittag

Beau hareng rouge, mais les langues parlées partagent une limite géographique, les langages informatiques non. Votre point est donc un peu théorique. Sans oublier de comparer Python vs JavaScript avec les dialectes parisiens vs Montréal. (Je ne sais pas qui prendrait plus d'offenser, les programmeurs Python ou les habitants de Montréal?; D).
Marco

10

Je ne sais pas d'où vous vient l'idée que les idiomes ont une connotation morale. Les idiomes ne sont qu'un moyen d'exprimer des choses. Ce sont des modèles à une échelle plus grande que des mots ou des phrases individuels.

Si je vous disais qu'il faut hurler avec les loups, vous ne sauriez pas ce que je voulais dire, même si c'est un idiome allemand bien connu. Si, OTOH, je vous ai dit, quand à Rome, faites comme les Romains, vous sauriez immédiatement de quoi je parle, parce que j'ai utilisé le bon idiome anglais.

Les langages informatiques ne sont pas différents.

En fait, un autre nom pour "idiome" dans le monde de la programmation est "modèle d'implémentation". Cela relie l'idée à l'idée de modèles, qui vient de l'architecte (brique et mortier et non bits et octets) Christopher Alexander. La plupart des programmeurs connaissent les modèles de conception, certains connaissent les modèles d'architecture, qui sont des modèles à une échelle plus grande que les modèles de conception. Les idiomes sont des modèles à une échelle plus petite que les modèles de conception.


5

La plupart des langues se prêtent intentionnellement à un style particulier. Le code écrit dans ce style est ce qui est idiomatique. Si vous regardez au-delà du fait circonstancié que votre choix d'environnement d'exécution restreint votre choix de langues disponibles, vous devez choisir des langues car le problème à résoudre est facile à exprimer dans les idiomes particuliers d'une langue.

La plupart des gens ne comprennent pas cela. Par exemple, de nombreux programmeurs Java s'efforcent de conserver le même style lorsqu'ils doivent écrire JavaScript (ils auraient pu écrire Java et le compiler de façon croisée, pensez-vous) et réussir dans une certaine mesure - écrire du code idiomatique Java en JavaScript - mais ils auront toujours l'impression de combattre JavaScript. Manquer certaines fonctionnalités ou avoir du mal à les émuler.

Le code idiomatique est bon. C'est difficile pour les étrangers, mais ils peuvent apprendre. En fin de compte, le code doit être maintenu pendant des années, donc si vous pouvez trouver un langage dans les idiomes dont le programme sous-jacent peut être exprimé de manière simple, c'est ce que vous devez faire.

Permettez-moi de préciser qu'il existe certainement une telle chose comme la surutilisation des idiomes (ou les caractéristiques du langage sous-jacent). Si vous utilisez des modèles C ++ pour exécuter des parties importantes de la logique d'application au moment de la compilation, ou si votre programme Lisp complet est un appel à une macro qui se déroule dans la réalité de manière pratiquement imprévisible, si votre solution Java d'un problème simple se gonfle vers les proportions de FizzBuzzEnterpriseEdition ... vous vous trompez.

Les gens disent que le code doit être facile à lire. Ce n'est que la moitié de la vérité. Il doit être facile à comprendre, ce qui nécessite qu'il soit également facile à raisonner. Cela nécessite une utilisation adéquate des abstractions. Comme pour la plupart des choses, il s'agit de trouver le bon équilibre.


J'aimerais pouvoir donner un autre +1 pour ce lien FizzBuzzEnterpriseEdition seul ... :-D
cmaster - rétablir monica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.