- Programar da esquerda para a direita significa que, assim que o código é digitado, o programa permanece em um estado válido, maximizando o suporte das ferramentas, como o autocompletar do editor
- As list comprehensions do Python atrapalham o autocompletar por causa de variáveis não declaradas e da ausência de inferência de tipos
- Rust e JavaScript permitem compor o programa naturalmente da esquerda para a direita, tornando mais intuitivos o uso de variáveis e a descoberta de métodos
- O estilo funcional em C e Python prejudica uma experiência de codificação eficiente por causa da baixa descobribilidade dos nomes de funções ou da estrutura
- Em lógicas mais complexas, o código desenvolvido da esquerda para a direita é mais fácil de ler e oferece melhor manutenção e extensibilidade
Programar da esquerda para a direita
O código precisa ser válido no momento em que é digitado
Limitações das list comprehensions em Python
- A sintaxe de list comprehension do Python
words_on_lines = [line.split() for line in text.splitlines()] exige acessar uma variável não declarada (line), o que faz com que o editor não consiga oferecer autocompletar nem inferência de tipos de forma adequada
- Durante o processo de digitação parcial do código
- ao digitar algo como
words_on_lines = [line.sp, o editor não sabe o tipo de line e não consegue sugerir métodos
- também fica mais difícil detectar erros em potencial, como um typo no nome da variável (
lime, por exemplo)
- Para receber sugestões corretas, é preciso escrever código incompleto, o que torna o processo pouco intuitivo e incômodo
Composição da esquerda para a direita em Rust
- No exemplo em Rust (
let words_on_lines = text.lines().map(|line| line.split_whitespace());),
- no momento em que a variável (
line) aparece pela primeira vez junto com a declaração da função anônima, ela já é tratada como declarada, permitindo autocompletar e sugestão de métodos imediatamente
- na prática, até o método
split_whitespace pôde ser encontrado facilmente graças às sugestões automáticas
- Como o programa permanece sempre em um estado parcialmente válido, a IDE ou o editor consegue oferecer suporte à codificação em tempo real
Divulgação progressiva (Progressive Disclosure) e usabilidade de APIs
- Divulgação progressiva (Progressive Disclosure) é um princípio de design em que o usuário só encontra a complexidade na medida em que precisa dela, e isso também pode ser aplicado à programação
- Ex.: semelhante à UX de um processador de texto em que opções relacionadas só aparecem ao adicionar uma imagem
- A linguagem C oferece pouco desse suporte
- como nem todas as funções relacionadas a
FILE *file podem ser exploradas via file., é preciso decorar padrões de nomes de função (fread, fclose etc.), e fica difícil descobrir funcionalidades
- já em uma linguagem ideal, as sugestões de métodos via
file. permitiriam descobrir progressivamente os recursos relacionados com facilidade
Diferença na descobribilidade de funções e métodos
- Comparação entre os exemplos
map(len, text.split()) em Python e text.split(" ").map(word => word.length) em JavaScript
- em Python, como nomes de função como
len, length ou size não são previsíveis, é preciso tentar várias opções para descobrir qual realmente funciona
- em JavaScript, basta digitar
.l depois de word. para o editor sugerir métodos como length, o que dá alta descobribilidade
- até funções de ordem superior como
map deixam claros de imediato o valor retornado e o tipo de dado
Quanto mais complexa a lógica, maior a vantagem da escrita estruturada
- Em lógicas mais complexas (código longo em Python com
filter e lambda aninhados),
- é preciso verificar repetidamente o início e o fim do código, e surgem problemas de legibilidade reduzida e dificuldade de compreensão em condições e pareamento de parênteses
- Na versão equivalente em JavaScript, é possível ler e entender o código sequencialmente, de cima para baixo e da esquerda para a direita
Princípio central
O código precisa ser válido em cada momento da digitação
- Mesmo ao digitar apenas
text, o programa continua em um estado válido
- Mesmo após escrever
text.split(" "), e depois continuar com .map(word => word.length), o estado intermediário do programa permanece sempre válido
- Esse padrão de codificação aumenta a possibilidade de suporte em tempo real pelo editor e, em um ambiente REPL, também permite verificar os resultados imediatamente
Conclusão
- O design de APIs e linguagens deve dar suporte para que o código possa ser digitado naturalmente da esquerda para a direita, formando um programa válido em cada etapa intermediária
- Um bom design de API é a chave para melhorar essa experiência de codificação
Ainda não há comentários.