Atualmente estou refatorando vários milhares de linhas de código em um grande projeto AngularJS. Uma das maiores dificuldades é descobrir o contrato exato de uma determinada função. Às vezes, acabei lendo a documentação da API porque os elementos da resposta bruta da API foram atribuídos a variáveis que passaram por seis camadas de código antes de serem modificadas e retornadas por mais seis camadas de código.
Meu primeiro conselho é projetar por contrato . Obtenha informações específicas, produza resultados específicos, evite efeitos colaterais e documente essas expectativas usando o TypeScript ou pelo menos o JSDoc.
Meu segundo conselho é implementar tantas verificações quanto possível. Seguimos o padrão AirBnB e usamos eslint em toda a nossa base de código. Ganchos de confirmação confirmam que sempre seguimos o padrão. Naturalmente, temos uma bateria de testes unitários e de aceitação, e todos os commits devem ser revisados por um colega.
A mudança de um editor de texto (Sublime Text) para um IDE (WebStorm) também facilitou muito o trabalho com o código em geral. O WebStorm usará o JSDoc para dar dicas sobre os tipos de parâmetros esperados e aumentar o erro se você fornecer o tipo errado ou usar um valor de retorno errado.
Em JavaScript, novos recursos como símbolos e getter / setters podem ajudar a impor um certo nível de qualidade adicionando asserções à atribuição de variáveis (por exemplo, certifique-se de que o inteiro esteja dentro do intervalo ou que o objeto de dados tenha determinados atributos). / p>
Infelizmente, não acho que exista uma solução verdadeira para evitar erros dinâmicos de linguagem, apenas uma série de medidas que podem ajudar a reduzir sua frequência.