Recentemente, dediquei algumas horas ao JavaScript porque queria me beneficiar da enorme base de usuários. Fazendo isso, notei um padrão que a maioria das pessoas atribui a linguagens dinâmicas. Você faz as coisas funcionarem rapidamente, mas quando seu código atinge um determinado tamanho, você perde muito tempo com erros de digitação, ortografia e refatoração em geral. Erros que um compilador normalmente me pouparia. E não me fazer procurar erros na lógica quando acabei de digitar outro módulo.
Considerando o incrível JavaScript a seguir e outras linguagens de tipo dinâmico, sou levado a acreditar que há algo errado com minha abordagem. Ou este é apenas o preço que você tem que pagar?
Para colocar de forma mais concisa:
- Como você aborda um projeto JavaScript (ou qualquer outra linguagem dinâmica) com ~ 2000 LOC?
- Existem ferramentas para me impedir de cometer esses erros? Eu tentei o fluxo pelo Facebook e JSHint, que de alguma forma ajudam, mas não capturam erros de digitação.
Respostas:
Especificamente falando de JavaScript, você pode usar o TypeScript . Ele oferece algumas das coisas às quais você está se referindo. Citando o site:
E é apenas um superconjunto de JS, o que significa que parte do seu código existente funcionará perfeitamente com o TS:
fonte
foo(x) { return x.bar;}
ou algo assim. Como não há informações de tipo e a função é pública (portanto, você não pode conhecer todos os chamadores), é impossível descobrir se a barra deve ser renomeada para baz se você renomear alguma classe.Existem algumas abordagens que podem ajudar:
Teste de unidade
Escreva testes de unidade sempre que possível. Confiar unicamente em testes manuais ou encontrar bugs na natureza é um sucesso.
Usar estruturas
Em vez de criar o seu próprio e arriscar a introdução de bugs, use estruturas estabelecidas sempre que possível.
Prefira CSS / idiomas de alto nível
Onde você pode ceder a funcionalidade para CSS ou qualquer linguagem de alto nível em que está escrevendo.
Refatorar
Refatorar para reduzir a quantidade de código. Menos código = menos lugares para as coisas darem errado.
Reuso
Reutilize o código existente onde você puder. Mesmo que o código não seja uma correspondência exata, pode ser melhor copiar, colar e modificar, em vez de escrever algo novamente.
IDEs
Os IDEs modernos geralmente têm pelo menos algum suporte a Javascript. Alguns editores de texto também têm conhecimento de Javascript.
fonte
Uma ferramenta que ainda não foi mencionada é a pesquisa de texto simples, local de arquivo ou em todo o projeto .
Parece simples, mas quando você inclui algumas expressões regulares, pode fazer uma filtragem básica ou avançada, por exemplo, procurar palavras localizadas na documentação ou no código-fonte.
Foi uma ferramenta eficaz para mim (além dos analisadores estáticos) e, dado o tamanho do seu projeto de 2k LOC, o que não é particularmente grande na minha opinião, espero que funcione maravilhosamente.
fonte
grep
percorre um longo caminho. A menos que você não faça coisas dinâmicas muito estranhas, ele funciona. No entanto, parece muito manual se você estiver acostumado a IDEs para idiomas de tipo estático.Atualmente, estou refatorando vários milhares de linhas de código em um grande projeto AngularJS. Um dos maiores problemas é 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 6 camadas de código antes de serem modificadas e retornadas por mais 6 camadas de código.
Meu primeiro conselho é projetar por contrato . Obtenha entradas específicas, produza saídas específicas, evite efeitos colaterais e documente essas expectativas usando o TypeScript ou pelo menos o JSDoc.
Meu segundo conselho é implementar o maior número possível de verificações. Seguimos o padrão AirBnB e usamos eslint em toda a nossa base de códigos. Os ganchos de confirmação confirmam que sempre seguimos o padrão. Naturalmente, temos uma bateria de testes de unidade e aceitação e todos os commits devem ser revisados por um colega.
Mudar de um editor de texto (Sublime Text) para um IDE adequado (WebStorm) também facilitou muito o trabalho com o código em geral. O WebStorm usará o JSDoc para fornecer dicas sobre os tipos de parâmetros esperados e gerar erros se você fornecer o tipo errado ou usar o valor de retorno da maneira errada.
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, verifique se o número inteiro está dentro do intervalo ou se o objeto de dados tem certos atributos).
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.
fonte
Minha resposta para a pergunta "Como você aborda um projeto JavaScript (ou qualquer outra linguagem dinâmica) com ~ 2000 LOC?"
Desenvolvo aplicativos de formulário PDF. Abordo o meu projeto de desenvolvimento de software JavaScript (independentemente do tamanho do código-fonte) usando os elementos de rede e anotações de Petri. O método não está vinculado a nenhuma tecnologia específica da linguagem de programação. Assim, pode ser usado para outras "linguagens de programação".
Eu crio um diagrama da lógica do aplicativo. Para manter o diagrama organizado, eu adiciono a maioria das minhas anotações a um formulário que eu uso com o diagrama. As entradas no formulário incluem referências a propriedades ou funções. Em seguida, escrevo o código-fonte com base nas informações no diagrama e nas entradas no formulário. O método é sistemático, pois todo código-fonte escrito é mapeado diretamente no diagrama e nas entradas do formulário. O código-fonte pode ser facilmente verificado porque também sigo as convenções de nomeação e codificação quando escrevo o código.
Por exemplo, escolhi uma convenção de que todas as funções são protótipos. Se o desempenho se tornar um problema, ele poderá ser aprimorado declarando as funções no construtor. Para algumas propriedades, uso matrizes. Novamente, se o desempenho se tornar um problema, ele poderá ser aprimorado usando referências diretas.
Eu também uso eval. Isso pode reduzir bastante o tamanho do código fonte. Devido a problemas de desempenho, eu uso eval no início ou na parte de inicialização do meu aplicativo; Eu nunca o uso na “lógica de tempo de execução” - essa é outra convenção de codificação que sigo.
fonte