Uma linguagem de programação pode impor “código limpo”? [fechadas]

19

Então, eu estou codificando meus primeiros projetos em C ++ e parece que é preciso mais esforço para tornar o código "limpo", em vez de simplesmente funcionar. Ou seja, parece que o C ++ "permite" escrever código feio, mas funcional.

O que me fez pensar,

Uma linguagem de programação pode impor código limpo por design? Já existem esses idiomas?

Além disso, como isso é incorporado como princípios de design no desenvolvimento / teoria da linguagem de programação? Que tipo de medidas são usadas?

mavavilj
fonte
14
Muitos idiomas já tentaram. Ninguém conseguiu remotamente minha opinião.
Gort o robô
5
Infelizmente, isso é totalmente baseado em opiniões, pois não há uma definição objetiva de "código limpo". No entanto, sinta-se à vontade para discuti-lo em nossa sala de bate-papo , tenho certeza que todos terão algumas opiniões para compartilhar.
Ixrec
9
Não, você pode escrever FORTRAN em qualquer idioma.
Whatsisname
4
Você está perguntando se é possível à prova de idiotas um idioma. Como se costuma dizer, os idiotas são engenhosos .
Gort the Robot
2
Quais características o "código limpo" possui para os fins desta pergunta? Você precisa definir isso; caso contrário, qualquer resposta com qualquer justificativa poderá ser válida.
Theodoros Chatzigiannakis

Respostas:

20

O principal efeito que o design da linguagem tem no "código limpo" é no nível sintático. Idiomas com muitas abreviações e operadores obscuros (Perl / APL) se prestam ao código "sujo", enquanto idiomas com um conjunto menor de elementos (digamos, Python) se prestam a um código mais limpo.

A semântica, no entanto, é um animal muito diferente. Não há como impor que a semântica de uma linguagem seja usada de maneira limpa, principalmente porque você não pode, como compilador, saber o que o usuário da linguagem está tentando realizar. Uma ferramenta poderosa é simplesmente isso - uma ferramenta poderosa, para o bem ou para o mal.

No final do dia, a semântica é mais importante que a sintaxe. Também é a parte mais difícil de descobrir como desenvolvedor de manutenção (por exemplo, "o que esse código realmente significa? Entendo o que ele faz ...").

Conseqüentemente, eu diria que não existe um design para impor código limpo, mas você pode escrever uma sintaxe simples com semântica limpa que facilita isso. Para melhor ou pior, o código limpo é principalmente uma questão de conhecimento, motivação, disciplina e habilidade do desenvolvedor.

Michael
fonte
2
Eu diria que o sistema de tipos pode percorrer um longo caminho para impor a semântica correta. Por exemplo, idiomas de tipo forte garantem que as variáveis ​​recebam valores dos tipos aplicáveis. Uma linguagem que torna os tipos baratos e fáceis incentiva a codificação de mais semântica nos tipos. Uma linguagem fortemente tipada faz com que os programadores expressem intenção sobre a conversão de tipos. Uma linguagem que obscurece a semântica com clichê também dificulta o raciocínio sobre a semântica. Agora, quanto ao que é a semântica "limpa", não está claro. Mas eu imagino que tenha uma sobreposição significativa com a semântica correta.
Restabeleça Monica
7

Os idiomas podem forçar ou incentivar os programadores a abordar determinadas classes de bugs, o que faz parte da definição de código limpo. Por exemplo, vários idiomas fazem um trabalho relativamente decente de endereçamento:

  • Exceções de ponteiro nulo.
  • Bugs de estado compartilhado.
  • Problemas de simultaneidade.
  • Exceções não verificadas.

Isso apenas leva você a parte do caminho, porque o código limpo se refere principalmente à comunicação entre seres humanos . As linguagens de programação realmente têm apenas uma alavanca para ajudar nisso, e esse é seu poder expressivo . É um termo realmente difícil de definir, mas basicamente é mais fácil para os bons programadores escrever código mais limpo em linguagens mais expressivas. Eles têm mais ferramentas disponíveis para expressar facilmente um algoritmo em termos que se comunicam bem com outros seres humanos. Não me interpretem mal, você pode escrever um código limpo em ( quase ) qualquer linguagem de programação. São apenas alguns idiomas que facilitam e têm um melhor resultado relativo.

No entanto, você não pode simplesmente aumentar a expressividade e magicamente as pessoas começarão a escrever um código melhor. Com a maioria dos programadores, você dá a eles mais botões para ativar o idioma deles, e eles não sabem como usá-los adequadamente; portanto, o código deles acaba realmente pior. É preciso disciplina e boa orientação para melhorar a qualidade do seu código. Não há balas de prata.

Karl Bielefeldt
fonte
6

Até certo ponto. Muitas linguagens são deliberadamente projetadas para incentivar algumas formas de código limpo, de acordo com os ideais dos designers de linguagem. Certamente é possível escrever código feio e incompreensível em qualquer idioma, mas alguns idiomas se esforçam mais para desencorajá-lo.

Como exemplo, o Python obriga a recuar blocos de acordo com a estrutura semântica da linguagem, enquanto muitas outras linguagens permitem que você recue totalmente de forma aleatória ou nenhuma. Este é um exemplo de uma linguagem que encoraja ativamente um certo ideal de limpeza.

JacquesB
fonte
3

Se você puder quantificá-lo, poderá criar um idioma que possa otimizá-lo.

Embora eu não conheça nenhum idioma específico que realmente imponha uma política de "código limpo", os policiais de estilo executados na compilação são bastante comuns.

A principal razão pela qual essa é uma etapa separada da inserção no idioma é em grande parte uma função das prioridades. É no melhor interesse de uma linguagem de programação permitir maior flexibilidade aos programadores para obter o nível mais amplo de adoção. Existem tantas linguagens de programação e DSLs diferentes que restringir artificialmente a base de usuários, sendo exigente e opinativo sobre qual entrada é permitida, provavelmente atrapalha a adoção mais ampla.

Por exemplo, não é do melhor interesse do C # forçar as pessoas a escrever

if (condition)
{

ao invés de

if (condition) {

Mas os damas de estilo podem ser exigentes, porque é para isso que eles foram projetados.

Então, para responder à pergunta

Uma linguagem de programação pode impor código limpo por design?

ênfase minha

Absolutamente, desde que você forneça uma definição forte para o que significa "código limpo".

Por exemplo, eu posso definir "código limpo" como:

  • comprimento da linha não superior a 80 caracteres
  • funções compostas de não mais que 100 linhas
  • recuo deve ser de dois espaços
  • chaves abertas devem seguir no final da linha precedido por exatamente um espaço
  • não mais que dois operadores por linha

e você pode discordar de algumas ou de todas essas convenções, mas no final do dia elas são quantificáveis ​​e podem ser aplicadas programaticamente.

zzzzBov
fonte
1

Não, não no sentido que você descreve. A detecção de "feiúra" não pode ser feita automaticamente!

No entanto, os designers de linguagem podem fazer coisas para incentivar um bom código (não quero dizer "limpo" porque às vezes o código bom e seguro também é longo e "feio"). Por exemplo, os projetistas da linguagem Rust examinaram as coisas que os programadores disciplinados em C ++ costumam fazer (como atribuir aos valores alocados na pilha um único "proprietário") e facilitaram a execução de algumas dessas coisas. Isso inclui o fornecimento de um typechecker que você pode usar para verificar se não cometeu certos erros comuns.

Eu diria que um bom design de linguagem geralmente é reativo: os designers analisam o que os bons programadores fazem e tentam tornar isso mais fácil e "mais bonito".

Paul Stansifer
fonte