Quels sont les avantages et les inconvénients d'une langue utilisant des espaces par rapport aux {} pour indiquer la portée? [fermé]

17

Il semble y avoir un conflit sur l'opportunité d'utiliser des espaces ou des jetons comme des crochets pour indiquer la portée. J'ai vu de nombreux éloges de la solution de python au problème d'indentation incohérente, mais beaucoup ne sont pas d'accord:

Toute langue comportant des espaces comme jetons doit mourir.

posté plus tard sur la même réponse:

J'étais en quelque sorte anti-espaces blancs en tant que jetons, jusqu'à ce que je l'essaie. Cela a probablement aidé que ma disposition d'espace blanc personnelle corresponde à peu près à ce que tout le monde utilise en python-land. C'est peut-être que je suis un peu minimaliste, mais si vous allez quand même mettre en retrait, pourquoi s'embêter avec les {} s?

Je peux voir des arguments clairs pour chaque côté:

en utilisant des espaces:

  • aide à réduire l'indentation incohérente dans le code
  • efface l'écran en remplaçant les jetons visibles par des espaces pour servir le même objectif

en utilisant des jetons:

  • beaucoup plus facile à couper et coller du code à différents niveaux (vous n'avez pas à corriger l'indentation)
  • plus cohérent. Certains éditeurs de texte affichent les espaces différemment.
  • plus populaire actuellement.

Y a-t-il des points que j'ai manqués? Lequel préfères-tu? Des paroles de sagesse après avoir longtemps travaillé avec l'un ou l'autre?


PS. Je déteste quand les langues n'utilisent pas le même jeton pour chaque structure de contrôle. VB est vraiment ennuyeux avec ses instructions End Ifet End While, la plupart des autres langues utilisent simplement {} pour tout. Mais c'est peut-être un sujet pour une question différente ...

Gordon Gustafson
la source
2
Je ne dirais pas que c'est "beaucoup plus facile à couper et coller". C'est à peine plus facile.
Kugel
1
Tant que vous gardez des blocs de code petits et organisés, les jetons ne devraient vraiment pas avoir d'importance ... au fait, adorez la balise `` guerre sainte '', lol
Scott
"Certains éditeurs de texte affichent les espaces différemment.": ?? "plus populaire actuellement.": La popularité n'est souvent pas liée à la qualité d'une idée.
Giorgio
J'adore la syntaxe des espaces blancs et j'ai adoré le codage en CoffeeScript et Haskell (ouais je sais que c'est dur). J'ai codé un tas de code JavaScript et C, et je ne peux tout simplement pas revenir à}. Cependant, les expressions s Lisp lorsqu'elles sont remplacées par des divs de boîte sont les meilleures
:)
Je pense qu'il est plus difficile de repérer les erreurs si vous devez vous fier uniquement aux espaces blancs. Par exemple: stackoverflow.com/questions/21205836/… La seule différence entre le code de l'OP et la réponse est l'espace supplémentaire. Avoir un} pour délimiter le code qui se trouve dans la boucle for et ce qui ne l'est pas est beaucoup plus clair.
AncientElevator9

Réponses:

15

Je pense que beaucoup de programmeurs (moi y compris) ont tendance à "logiser" chaque décision. C'est bien, mais toutes les questions n'ont pas de réponse logique. Par exemple, je doute que les chefs posent des questions sur chefoverflow (si une telle chose existe) pour demander les avantages et les inconvénients de la tarte aux pommes par rapport à la tarte aux cerises. C'est une question que vous préférez.

Avec cela à l'esprit, je pense que la réponse la plus simple est de dire "Certaines personnes aiment les accolades, certaines personnes comme les espaces blancs" et en rester là.

Jason Baker
la source
6
Incidemment: cooking.stackexchange.com
Jon Purdy
En outre, quelque chose qui est un avantage pour certains pourrait être un inconvénient pour d'autres.
Larry Coleman
Excellent point. Personnellement, je pense qu'ils travaillent ensemble, et tant que la situation est claire, je ne me plaindrai pas (beaucoup).
Michael K
8
Je ne suis pas d'accord avec votre analogie. Il y a des raisons assez objectives de croire que la syntaxe dépendante des espaces entrave la productivité du programmeur, même chez les programmeurs qui l'aiment. C'est un peu comme dire que les gens n'aiment tout simplement pas le goût du cyanure - tout le monde est juste «en train de se loguer» quand ils disent que c'est toxique. Non, peu importe combien vous l'aimez, ça va toujours vous tuer.
Timwi
4
PS Le mot que vous cherchez en réalité est rationaliser . De plus, tout le monde a tendance à rationaliser, pas seulement les programmeurs.
Timwi
11

Au risque de ressembler à un fanboy absolu, je pense que tous ceux qui prétendent que les espaces blancs «aident à réduire l'indentation incohérente dans le code» n'ont jamais utilisé Visual Studio. Avec une seule commande (je pense que le raccourci par défaut est Ctrl + K, D), toute l'indentation est instantanément cohérente¹. De plus, lorsque vous collez du code, l'indentation est instantanément corrigée sans rien faire du tout, et il en va de même lors de l'écriture de nouveau code ou lors de l'encapsulation de quelque chose dans un ifou un autre bloc (le reformatage se produit au fur et à mesure de la }frappe). En outre, appuyer sur Entrée après une instruction terminée place toujours le curseur au niveau d'indentation correct pour l'instruction suivante, même si l'instruction précédente a été indentée davantage en raison d'unifou similaire, ce qui rend très difficile de penser accidentellement qu’une déclaration est encore sous un ifmoment où elle ne l’est pas.

Le point que j'essaye de faire n'est pas que Visual Studio est génial. Le point que j'essaye de faire est que l'EDI peut automatiser la correction de l'indentation (et d'autres problèmes de formatage), mais seulement si la signification du programme ne dépend pas de son formatage. Cela donne au programmeur une plus grande opportunité de se concentrer sur la tâche de programmation réelle. Une syntaxe comme celle de Python est contre-productive: il n'est pas possible d'écrire un IDE qui puisse «corriger» l'indentation du code Python car l'indentation elle-même spécifie une partie de la sémantique.


¹ (Je sais qu'il existe un cas spécial que VS refuse de reformater, à savoir les littéraux de tableau qui s'étendent sur plusieurs lignes, mais ce n'est pas la question.)

Timwi
la source
8
L'indentation Python n'a pas besoin d'être corrigée car elle ne se casse pas (sans que quelqu'un s'en aperçoive!). Il est impossible d'écrire Purify (programme qui aide à détecter les fuites de mémoire) pour C # non plus, ne signifie pas que la gestion de la mémoire C ++ est supérieure.
dbkk
2
@Dean: Pourquoi tant de gens pensent-ils avoir besoin de Resharper pour tout? Ce que vous décrivez est déjà dans Visual Studio sans Resharper.
Timwi
2
@dbkk: votre retrait est rompu dès que vous ajoutez une ifligne n'importe où. Vous devez ensuite procéder à la correction manuelle de l'indentation.
Timwi
2
vous n'avez probablement pas travaillé sur une équipe où l'indentation était paresseuse, incohérente, etc. et la corriger était découragée car elle rend les différences de code impossibles.
Kevin
2
@Kevin: Correct, je ne l'ai pas fait et franchement, je ne voudrais pas. J'insisterais pour tout réparer en une seule fois, ce qui ne cause qu'un seul diff illisible qui n'affecte que les espaces insignifiants et corrige tous les futurs diff. Tout le reste serait contre-productif et nuisible au projet.
Timwi
3

Personnellement, je trouve que j'ai besoin de la ligne vierge introduite en ayant un jeton sur sa propre ligne pour me faire comprendre que le code est dans une autre portée.

Je déteste quand en python les gens vont:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

alors qu'en terre symbolique, je déteste quand les gens copient et collent et ne nettoient pas le retrait ,

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

ou n'utilisez pas de ligne distincte pour le jeton .

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

Je peux lire les trois, mais ils ne sont pas comme je m'y attendais et je dois faire des efforts pour les analyser et comme le dit Joel lorsque les choses ne fonctionnent pas comme vous vous y attendez, cela vous rend frustré.

Dominique McDonnell
la source
3

Pro: Il n'y a pas de guerres sacrées par indentation / accolade-placement dans le monde Python pour autant que je sache. Prendre cette décision au nom des développeurs a probablement sauvé une certaine douleur.

Con: les fonctions anonymes sont limitées à une ligne. Cela semble correct, mais je me retrouve souvent à écrire des lignes multiples lambdadans Scheme (principalement pour alimenter mapou applyexactement à un endroit, il ne serait donc pas logique de déclarer séparément).

Inaimathi
la source
Les expressions multilignes sont prises en charge en Python - il suffit de mettre \ à la fin d'une ligne.
dbkk
8
Pour être honnête, le manque de lambdas multilignes est une limitation de Python, pas des espaces en général. Dans mon langage délimité par des espaces, si vous introduisez un lambda et un bloc indenté suit, le bloc est utilisé comme corps lambda.
Note à soi-même - pensez à un nom
@Note - Ok, oui, juste. Python est juste le seul langage délimité par des espaces avec lequel j'ai une expérience. @dbkk donc vous dites que lambda n: a = n \\na.sort() \\na[0:3] cela ne retournerait pas une erreur de syntaxe? L'astuce `\` vous permet de répartir votre lambda sur une seule ligne sur plusieurs lignes, mais vous n'obtenez toujours pas plus d'une ligne réelle .
Inaimathi
Haskell, CoffeeScript utilise des espaces mais n'a pas de limitation lambda sur une seule ligne.
aoeu256
3

{} ajoute de la redondance. Trop de redondance est mauvaise, trop peu est mauvaise. Et entrer manuellement est mauvais, surtout. s'il est difficile de l'utiliser.

Ainsi, en cas de mauvais / pas d'IDE, le style des espaces blancs pourrait être légèrement meilleur. Mais avec un IDE puissant, les accolades sont meilleures.

user470365
la source
1
Vous faites un bon point sur la redondance je pense. J'ai réfléchi à la récupération de l'analyseur pour les compilateurs pendant un certain temps (après les tentatives très intéressantes de Clang pour publier des correctifs pour le code) et ce qui aide vraiment ici, c'est qu'il y a redondance. Par conséquent, je pense qu'aucune redondance, même si elle est excellente dans un monde parfait, est en fait nuisible à la programmation du monde réel. Lorsque des sources d'informations normalement redondantes sont en désaccord, il se peut alors qu'une faute de frappe / erreur ait été commise; sans redondance, cette erreur potentielle passe inaperçue! Cela étant dit, je ne préfère aucun appareil dentaire;)
Matthieu M.
"Bruit" était le mot utilisé par Erik Meijer dans ses vidéos Haskell.
user16764
Que faire si vous supprimez un bloc et que vous oubliez de supprimer le} ou supprimez le {par erreur en faisant le contraire? La redondance va à l'encontre de DRY IMO.
aoeu256
2

Le problème que j'ai trouvé avec un langage d'espaces blancs était lié aux expressions conditionnelles multipages. L'ajout d'une ligne au milieu de la page deux et la suppression d'un espace au milieu de tous les dégâts peuvent modifier radicalement la logique de votre code. Et même si le code de quelqu'un est "correct", essayer de le lire fait un terrible jeu de devinettes. Pour quel "si" est-ce "autre"? Je peux compter les accolades beaucoup plus facilement que les caractères vides invisibles. Et les machines d'affichage sur ce site ne cessent de les briser dans un seul espace.

IMHO "{{{{{" is more reliable than "     ".
Andy Canfield
la source
9
Si vous utilisez des expressions conditionnelles multipages, vous rencontrez d'autres problèmes. Ne le fais pas. En fait, même avec des accolades, le code devient un gâchis illisible. C'est en fait un autre avantage de l'indentation des espaces: il vous empêche d'écrire un code aussi horrible.
Konrad Rudolph
1
Sérieusement, une longue durée conditionnelle de plusieurs pages ?
Winston Ewert
2

Je ne pense pas que ce soit vraiment un contre .
Les pythoners critiquent souvent les programmeurs d'accolades comme s'ils violeraient facilement l'indentation parce qu'ils le peuvent.
En fait, j'ai toujours utilisé une indentation cohérente à 100% avant même de connaître Python et sa portée d'indentation.

Le fait est que les langages d'accolades pourraient également imposer une indentation correcte dans le compilateur et nous aurions le meilleur des deux mondes. Voir? non contre du tout.

Les pythoners diraient que les accolades sont inutiles lorsque l'indentation fait partie de la syntaxe, mais ce n'est pas le cas, les accolades améliorent la lisibilité. J'ai essayé de programmer Python et c'est un langage très intéressant pour moi, mais avez-vous essayé d'avoir des if-elifchaînes de plus de 2 ou 3 niveaux d'indentation? ils n'ont plus l'air si soignés.

PS: J'ai écrit des accolades mais d'une manière plus générale, je veux dire des jetons de délimitation. L'accolade d'ouverture peut être considérée comme redondante, mais une langue pourrait aller comme ça (en fait, je suis sûr qu'il y a des langues exactement comme ça mais je ne les connais pas bien):

if condition:
    statement
    other_statement()
end

PS2: 2019, 4 ans après cette réponse. J'ai appris Python et je me suis totalement habitué à son indentation sémantique et je n'ai pas du tout de difficulté à lire. Surtout à l'aide d'IDE modernes qui dessinent des barres verticales pour aider à identifier les blocs de retrait.

Petruza
la source
J'aime cette syntaxe car c'est un bon compromis et évite les accolades. Mais cela coûte cher pour les instructions sur une seule ligne, où, par exemple, en C, nous pouvons laisser complètement les accolades :(
Jo So
au lieu d'imbriqué si ... elif vous pouvez essayer d'utiliser des dictionnaires, et / ou, continuer, retourner, des fonctions imbriquées ...
aoeu256
@ aoeu256 totalement pas le point de la question et ma réponse non plus.
Petruza