Elevar condicionais para fora da função
- Se houver uma condicional
if dentro de uma função, considere movê-la para o chamador (caller).
- Em vez de a função verificar internamente as pré-condições e "não fazer nada" quando elas não forem atendidas, faça o chamador verificar as pré-condições para que o sistema de tipos garanta que elas foram satisfeitas.
- Em especial, ao "elevar" as pré-condições, pode-se reduzir a quantidade total de verificações, e essa é uma das motivações desta regra.
Rebaixar laços de repetição
- Regra vinda do pensamento orientado a dados: introduz o conceito de "lote" (
batch) do objeto, toma as operações em lote como caso padrão e trata a versão escalar como um caso especial da versão em lote.
- O principal benefício é o ganho de desempenho, pois é possível diluir o custo inicial e ter flexibilidade na ordem de processamento.
- Por exemplo, na multiplicação de polinômios baseada em FFT, avaliar polinômios em vários pontos ao mesmo tempo pode ser mais rápido do que avaliações individuais.
Opinião do GN⁺
- O ponto mais importante deste texto são duas regras de programação para melhorar o desempenho e a clareza do código no desenvolvimento de software: "elevar condicionais" e "rebaixar laços de repetição".
- Essas regras ajudam a aumentar a legibilidade do código, otimizar o desempenho e reduzir a possibilidade de bugs.
- Como oferece insights sobre como lidar com a complexidade da engenharia de software e escrever código eficiente, este texto é interessante e útil para muitos desenvolvedores.
1 comentários
Comentários do Hacker News
ifefor.forpode reduzir o tempo de execução de uma simulação de 1 semana para 1 hora. Quem tem esse tipo de formação tende a otimizar intuitivamente a ordem deforeif.ifpara cima, pois isso faz com que as pré-condições e pós-condições da função deixem de ser visíveis diretamente na definição da função. Em projetos grandes, essas funções podem ser reutilizadas fora do contexto pretendido, causando bugs. Usar um framework de contratos pode ser uma solução, mas isso exige escrever as condições duas vezes, nos contratos e no código.ifdevem ficar no topo da função, não no final, e os erros devem ser propagados corretamente.fore instruçõesifsão ambos operações de controle de fluxo, então algumas afirmações do artigo parecem sem sentido. A alegação sobre desempenho é a mais forte, mas, como preocupação em relação a conselhos gerais, deveria ser considerada por último.ifpara cima quando a condição depende do operadorwalrus.ifde pré-condição para o chamador é uma ideia terrível. Em casos especiais, pode ser uma boa ideia, mas no caso geral isso não é desejável. Em bibliotecas, as pré-condições devem ser verificadas nas fronteiras externas para que a implementação interna possa seguir sem depender de suposições internas. Depender de verificações feitas pelo chamador anula esse propósito.