Quais são os prós e os contras de um idioma usando espaços em branco vs. {} para indicar o escopo? [fechadas]

17

Parece haver um conflito sobre se é melhor usar espaços em branco ou tokens como colchetes para indicar o escopo. Já vi muitos elogiarem a solução do python para o problema de indentação inconsistente, mas muitos discordam:

Qualquer idioma que tenha espaço em branco como tokens precisa morrer.

postado mais tarde com a mesma resposta:

Eu era uma espécie de anti-espaço em branco como tokens, até que realmente tentei. Provavelmente ajudou o fato de meu layout pessoal de espaço em branco corresponder praticamente ao que todo mundo usa em python-land. Talvez seja que eu seja um pouco minimalista, mas se você vai recuar de qualquer maneira, por que se preocupar com os {} s?

Eu posso ver alguns argumentos claros para cada lado:

usando espaço em branco:

  • ajuda a reduzir o recuo inconsistente no código
  • limpa a tela substituindo os tokens visíveis por espaços em branco para servir ao mesmo propósito

usando tokens:

  • muito mais fácil cortar e colar código em níveis diferentes (você não precisa corrigir o recuo)
  • mais consistente. Alguns editores de texto exibem os espaços em branco de maneira diferente.
  • mais popular atualmente.

Há alguns pontos que eu perdi? Qual você prefere? Alguma palavra de sabedoria depois de ter trabalhado com um ou outro por um longo tempo?


PS. Eu odeio quando os idiomas não usam o mesmo token para cada estrutura de controle. O VB é realmente irritante com suas declarações End Ife End While, a maioria dos outros idiomas usa {} 's para tudo. Mas talvez esse seja um tópico para uma pergunta diferente ...

Gordon Gustafson
fonte
2
Eu não diria que é "muito mais fácil cortar e colar". É apenas um pouco mais fácil.
Kugel
1
Enquanto você manter blocos de código pequeno e organizado, os tokens realmente deve não importa ... pelo caminho, amo a tag 'santa-guerra', lol
Scott
"Alguns editores de texto exibem os espaços em branco de maneira diferente.": ?? "mais popular atualmente.": a popularidade geralmente não está relacionada à qualidade de uma ideia.
Giorgio
Adoro a sintaxe de espaço em branco e adorei a codificação no CoffeeScript e Haskell (sim, eu sei que é difícil). Eu codifiquei um monte de JavaScript e C e simplesmente não consigo voltar para}. No entanto, Lisp s-expressões quando eles são substituídos com divs caixa é melhor embora:)
aoeu256
Eu acho que fica mais difícil detectar erros se você precisar confiar apenas no espaço em branco. Por exemplo: stackoverflow.com/questions/21205836/… A única diferença entre o código do OP e a resposta é o espaço extra. Ter um} para delimitar qual código está dentro do loop for e qual não é é muito mais claro.
AncientElevator9

Respostas:

15

Acho que muitos de nós, programadores (inclusive eu), temos a tendência de "racionalizar" todas as decisões. Tudo bem, mas nem todas as perguntas têm uma resposta lógica. Por exemplo, duvido que os chefs postem perguntas no chefoverflow (se isso existe) pedindo os prós e contras da torta de maçã versus torta de cereja. É uma questão da qual você gosta mais.

Com isso em mente, acho que a resposta mais simples é dizer "Algumas pessoas gostam de aparelho, outras gostam de espaço em branco" e deixam por isso mesmo.

Jason Baker
fonte
6
Aliás: cooking.stackexchange.com
Jon Purdy
Além disso, algo que é um profissional para alguns pode ser um golpe para outros.
Larry Coleman #
Ponto excelente. Pessoalmente, acho que eles trabalham juntos e, desde que o escopo esteja claro, não vou reclamar (muito).
Michael K
8
Eu não concordo com a sua analogia. Existem razões bastante objetivas para acreditar que a sintaxe dependente de espaço em branco dificulta a produtividade do programador, mesmo nos programadores que a amam. É um pouco como dizer que as pessoas simplesmente não gostam do sabor do cianeto - todo mundo está “racionalizando” quando diz que é venenoso. Não. Não importa o quanto você a ama, ainda vai te matar.
Timwi
4
PS A palavra que você está procurando é racionalizar . Além disso, todo mundo tem uma tendência a racionalizar, não apenas os programadores.
Timwi
11

Correndo o risco de parecer um fanboy absoluto, acho que todos que afirmam que o espaço em branco "ajuda a reduzir a indentação inconsistente no código" nunca usaram o Visual Studio. Com um único comando (acho que o atalho padrão é Ctrl + K, D), todo o recuo é instantaneamente consistente¹. Além disso, ao colar o código, o recuo é corrigido instantaneamente sem a necessidade de fazer nada, e o mesmo ocorre quando se escreve um novo código ou quebra de algo em um ifou outro bloco (a reformatação ocorre conforme a }digitação). Além disso, pressionar Enter após uma instrução concluída sempre coloca o cursor no nível de recuo correto para a próxima instrução, mesmo que a instrução anterior tenha sido recuada ainda mais por causa de umifou similar, tornando muito difícil pensar acidentalmente que uma declaração ainda está sob um estado ifem que não está.

O ponto que estou tentando enfatizar não é que o Visual Studio seja ótimo. O ponto que estou tentando enfatizar é que o IDE pode automatizar a correção de indentação (e outros problemas de formatação), mas apenas se o significado do programa não depender de sua formatação. Isso dá ao programador uma oportunidade maior de se concentrar na tarefa de programação real. Uma sintaxe como a de Python é contraproducente: não é possível escrever um IDE que possa "consertar" a indentação do código Python porque a própria indentação especifica algumas das semânticas.


¹ (Eu sei que há um caso especial em que o VS se recusa a reformatar, ou seja, literais de matriz que abrangem várias linhas, mas isso não vem ao caso.)

Timwi
fonte
8
O recuo do Python não precisa ser corrigido porque não é quebrado (sem que alguém perceba!). É impossível escrever Purify (programa que ajuda a detectar vazamentos de memória) para C # também não significa que o gerenciamento de memória C ++ seja superior.
dbkk
2
@ Dean: Por que tantas pessoas pensam que precisam do Reharper para tudo? O que você descreve já está no Visual Studio sem o Resharper.
Timwi
2
@dbkk: Seu recuo é interrompido assim que você adiciona uma iflinha em qualquer lugar. Você deve proceder para corrigir o recuo manualmente.
Timwi
2
você provavelmente não trabalhou em uma equipe em que o recuo era preguiçoso, inconsistente etc., e corrigi-lo foi desencorajado porque impossibilita as diferenças de código.
Kevin
2
@ Kevin: Correto, eu não tenho, e francamente, eu não gostaria. Eu insistiria em corrigir tudo de uma só vez, o que causa apenas uma diferença ilegível que afeta apenas espaços em branco insignificantes e corrige todas as diferenças futuras. Qualquer outra coisa seria contraproducente e prejudicial ao projeto.
Timwi
3

Pessoalmente, acho que preciso da linha em branco introduzida com um token em sua própria linha para fazer minha mente perceber que o código está em outro escopo.

Eu odeio quando em python as pessoas vão:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

enquanto na terra simbólica eu odeio quando as pessoas copiam e colam e não limpam o recuo ,

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

ou não use uma linha separada para o token .

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

Eu sei ler todos os três, mas eles não são como eu esperava e tenho que me esforçar para analisá-los. Como Joel diz, quando as coisas não funcionam como você espera, você fica frustrado.

Dominique McDonnell
fonte
3

Pro: Não há guerras santas no mundo Python, tanto quanto eu sei. Tomar essa decisão em nome dos desenvolvedores provavelmente salvou um pouco de dor.

Contras: funções anônimas são limitadas a uma linha. Parece bom, mas frequentemente me vejo escrevendo lambdas de várias linhas no esquema (principalmente para alimentar em mapou applyem exatamente um lugar, para que não faça sentido declarar separadamente).

Inaimathi
fonte
Expressões de múltiplas linhas são suportadas em Python - basta colocar \ no final de uma linha.
dbkk
8
Para ser justo, a falta de lambdas multilinhas é uma limitação do Python, não do espaço em branco em geral. Na minha linguagem delimitada por espaços em branco, se você introduzir um lambda e seguir um bloco recuado, o bloco será usado como o corpo do lambda.
Nota para auto-pense em um nome
@ Nota - Ok, sim, justo. Python é apenas a única linguagem delimitada por espaço em branco com a qual tenho experiência. @ dbkk então você está dizendo que lambda n: a = n \\na.sort() \\na[0:3] não retornaria um erro de sintaxe? O truque `\` permite espalhar seu lambda de linha única por várias linhas, mas você ainda não recebe mais de uma linha real .
Inaimathi
Haskell, CoffeeScript usa espaço em branco, mas não possui a limitação de linha única lambda.
aoeu256 02/09/19
3

{} adiciona redundância. Muita redundância é ruim, muito pouco é ruim. E entrar manualmente é ruim, esp. se é difícil usá-lo.

Portanto, em tempos de IDE ruim / inexistente, o estilo de espaço em branco pode ser um pouco melhor. Mas com o poderoso IDE, os aparelhos são melhores.

user470365
fonte
1
Você faz um bom argumento sobre redundância, eu acho. Estou pensando sobre a recuperação do analisador para compiladores há um tempo (seguindo as tentativas muito interessantes de Clang de emitir Fix-Its para o código) e o que realmente ajuda aqui é que há redundância. Portanto, acho que nenhuma redundância, embora seja ótima em um mundo perfeito, é realmente prejudicial para a programação do mundo real. Quando fontes de informação normalmente redundantes discordam, pode ser que tenha sido cometido um erro de digitação / erro; sem redundância, esse erro em potencial não é detectado! Dito isto, eu prefiro nenhum aparelho;)
Matthieu M.
"Barulho" foi a palavra que Erik Meijer usou em seus vídeos de Haskell.
user16764
E se você excluir um bloco e esquecer de excluir o} ou {{por engano ao fazer o oposto? A redundância vai contra o DRY IMO.
aoeu256 02/09/19
2

O problema que encontrei com uma linguagem de espaço em branco foi com expressões condicionais de várias páginas. Adicionar uma linha no meio da página dois e sair de um espaço no meio de toda a bagunça pode alterar drasticamente a lógica do seu código. E mesmo que o código de alguém esteja "correto", tentar lê-lo é um péssimo jogo de adivinhação. Para qual "se" é esse 'mais'? Posso contar chaves muito mais fácil do que caracteres em branco invisíveis. E o mecanismo de postagem neste site continua esmagando-os em um único espaço.

IMHO "{{{{{" is more reliable than "     ".
Andy Canfield
fonte
9
Se você usar expressões condicionais de várias páginas, terá outros problemas. Apenas não faça isso. De fato, mesmo com chaves, o código se torna uma bagunça ilegível. Na verdade, esse é outro benefício do recuo de espaço em branco: impede que você escreva um código tão horrível.
Konrad Rudolph
1
Sério, várias páginas condicionais ?
Winston Ewert
2

Eu não acho que é realmente um contra .
Os pitonistas geralmente criticam os programadores de aparelhos ortodônticos como se violassem prontamente o recuo porque podem.
Na verdade, eu sempre usei recuo 100% consistente mesmo antes de conhecer o Python e seu escopo de recuo.

O fato é que as linguagens entre chaves também poderiam impor o recuo correto no compilador e teríamos o melhor dos dois mundos. Vejo? não versus nada.

Os pitonistas argumentariam que o aparelho não serve para nada quando a indentação faz parte da sintaxe, mas não é, o aparelho melhora a legibilidade. Eu tentei programar Python e é uma linguagem muito interessante para mim, mas você já tentou ter if-elifcadeias com mais de 2 ou 3 níveis de indentação? eles não parecem mais tão legais.

PS: Eu escrevi chaves, mas de uma maneira mais geral, quero dizer tokens delimitadores. A chave de abertura pode ser vista como redundante, mas um idioma pode ser assim (na verdade, tenho certeza de que existem idiomas exatamente assim, mas não os conheço bem):

if condition:
    statement
    other_statement()
end

PS2: 2019, 4 anos após esta resposta. Eu aprendi Python e me acostumei totalmente ao seu recuo semântico e não acho difícil ler. Especialmente com o auxílio de IDEs modernos que desenham barras verticais para ajudar na identificação de blocos de recuo.

Petruza
fonte
Eu gosto dessa sintaxe porque é um bom compromisso e evita chaves. Mas é caro para declarações de uma linha, onde, por exemplo, em C, podemos deixar de fora os aparelhos dentários completamente :(
Jo So
em vez de aninhados if ... elif você pode tentar usar dicionários, e / ou, continue, retorno, funções aninhadas ...
aoeu256
@ aoeu256 totalmente não é o ponto da pergunta e minha resposta também.
Petruza 5/09/19