Como um programador usado para linguagens estáticas lida com a falta de ferramentas Javascript

28

Programei praticamente exclusivamente em linguagens compiladas, principalmente Java, durante a maior parte da minha carreira. Uma das minhas coisas favoritas sobre Java é o quão produtivo você pode ser e o pouco código necessário para escrever ao usar ferramentas como o Eclipse.

Você pode:

  • Refatorar seus métodos e classes de maneira fácil e automática
  • Visualize instantaneamente todos os locais em que um método é chamado ou uma constante é usada (Hierarquia de chamadas em aberto / Mostrar referências)
  • A digitação estática significa que você pode usar o preenchimento de código para mostrar todos os parâmetros / funções disponíveis em um objeto
  • Clique com a tecla Control pressionada no nome de uma função / membro / classe para ir direto à sua definição

Todas essas instalações me fazem sentir que o IDE é meu melhor amigo. Escrever código Java e entender particularmente os programas de outras pessoas se torna muito mais fácil.

No entanto, estou sendo chamado cada vez mais a usar Javascript, e minha experiência até agora tem sido bastante negativa.

Em particular:

  • Não há maneira imediata de localizar o ponto de entrada de uma função (exceto uma pesquisa de texto sem formatação, que pode resultar em pesquisas subsequentes de métodos além da hierarquia de chamadas, depois de duas ou três das quais você esqueceu por onde começou)

  • Os parâmetros são passados ​​para funções, sem maneira de saber quais propriedades e funções estão disponíveis nesse parâmetro (além de executar o programa, navegar até o ponto em que a função é chamada e usar console.logs para gerar todas as propriedades acessível)

  • O uso comum de funções anônimas como retornos de chamada, que freqüentemente levam a um espaguete de caminhos de código confusos, pelos quais você não pode navegar rapidamente.

  • E, com certeza, o JSLint detecta alguns erros antes do tempo de execução, mas mesmo assim não é tão útil quanto ter linhas onduladas vermelhas sob seu código diretamente no navegador.

O resultado é que você praticamente precisa ter o programa inteiro em sua cabeça o tempo todo. Isso aumenta enormemente a carga cognitiva para escrever programas complexos. E todo esse material extra para me preocupar deixa menos espaço no meu cérebro para criatividade e solução de problemas reais.

Claro, é mais rápido juntar um objeto em vez de escrever uma definição formal de classe inteira. Mas, embora os programas possam ser um pouco mais fáceis e rápidos de escrever, na minha experiência, eles são muito mais difíceis de ler e depurar.

Minha pergunta é: como outros programadores lidam com esses problemas? O Javascript está claramente crescendo em popularidade, e os blogs que leio são sobre como as pessoas são produtivas com ele, em vez de tentar desesperadamente encontrar soluções para esses problemas.

O GWT permite que você escreva código para um ambiente Javascript em Java, mas não parece ser tão amplamente usado quanto eu esperava; as pessoas parecem preferir Javascript para programas complexos.

o que estou perdendo?

funkybro
fonte
8
Meu conselho para todos os desenvolvedores Java que estão tendo dificuldades com o JS é aprender outra linguagem que não tenha uma sintaxe baseada em C. Isso o ajudará a superar a semelhança de sintaxe quando você voltar ao JS e poderá ajudá-lo a começar a analisar as coisas em termos de desvantagens do design da linguagem, em vez de ver as coisas em termos da única maneira verdadeira de escrever todo o código e o modo todo mundo está errado. E se você tiver a idéia de escrever uma estrutura de interface do usuário, aprenda JavaScript antes de nos deparar com mais um pedaço de lixo em cascata de classe que é inexplicavelmente fácil de comercializar para CTOs sem noção.
Erik Reppen
5
Cara, que esnobe há 2 anos atrás. Tentarei ser um pouco mais útil agora que bati mais forte no Java recentemente. IDE? Confira o Jetbrains Webstorm (eu ainda uso o Scite principalmente, mas o WS não é ruim), mas para a Web do lado do cliente, as ferramentas de desenvolvimento do Chrome fazem um bom trabalho ao cobri-lo na depuração e, na verdade, executam autopreenchimentos ao escrever trechos de código no console. Além disso, gaste muito tempo pensando em POO. OMI, classes não opcionais e IDEs como um substituto para a legibilidade humana absolutamente mataram todo o ponto de OOP em muitos Java por aí.
Erik Reppen
2
Eu sinto sua dor. O menu suspenso em javascript é a versão da web do menu suspenso na linguagem assembly no lado do cliente. Certamente pode ser divertido, mas os conjuntos de ferramentas são fracos e a produtividade diminui definitivamente com todo o trabalho extra que você precisa fazer. Essa é a vida na programação. Nem tudo é feito no mais alto nível de abstração. :-)
Brian Knoblauch
2
@ErikReppen Comecei como desenvolvedor Java, mas sou fluente em Obj-C, programado em Ruby, Delphi, C ++, C #, Prolog, PHP, bash e ainda acho o javascript o pior para ler e manter.
Sulthan
2
Dê uma olhada no TypeScript. Depois que comecei a usá-lo, acho que a codificação do lado do cliente é muito mais produtiva e agradável. Difícil de vencer os avisos intellisense adequados e os primeiros compiladores.
Evgeni 5/05

Respostas:

22

As sutilezas baseadas no IDE não estão disponíveis * em uma linguagem dinâmica como o javascript. Você tem que aprender a ficar sem eles. Você precisará substituir o suporte da ferramenta por um design melhor.

Use um padrão de módulo - manualmente ou com uma ferramenta como requirejs . Mantenha os módulos pequenos, para que você possa argumentar sobre eles facilmente.

Não defina quantos tipos - use objetos anônimos criados perto do ponto de chamada. Então você pode olhar para o chamador e o chamado e saber o que está acontecendo.

Tente evitar o acoplamento do seu código ao DOM - tente limitar a quantidade de manipulação do DOM que você faz no seu código. Se você pode passar seletores ou coleções de jQuery, faça isso em vez de informar seu código sobre a estrutura da página.

* Se você estiver usando uma biblioteca popular, poderá obter um preenchimento automático falso, mas é mais como "mostrar todos os métodos jquery" do que "quais propriedades esse objeto possui". Ele economiza digitação, mas não oferece garantia de correção.

Sean McMillan
fonte
Aceitando este para obter conselhos construtivos sobre como lidar com a falta de ferramentas.
funkybro
3
"Você tem que aprender a ficar sem eles." OU descarte-o OU use uma linguagem de nível superior que gere javascript e tenha as ferramentas adequadas.
Den
@ Den: Você tem alguma sugestão para um idioma de nível superior com ferramentas avançadas? Na minha experiência, ferramentas avançadas são feitas para idiomas populares. Qual linguagem de nível superior que é compilada em javascript é popular o suficiente para ter essas ferramentas?
21712 Sean McMillan
11
@SeanMcMillan: alguns .NET (C # / F #) são exemplos jsil.org , projects.nikhilk.net/ScriptSharp , sharpkit.net , websharper.com
Den
11
@SeanMcMillan Java também, consulte GWT developers.google.com/web-toolkit
funkybro
24

Gostaria de acrescentar uma resposta a essa pergunta, já que tenho andado a percorrer algum Java bom, ruim, mas principalmente feio ultimamente e tenho uma carga enorme de super generalizações brutas sobre desenvolvedores Java e Java vs. JS e JS e Devs JS que podem realmente se basear em algo que lembra vagamente a verdade útil.

Existem IDEs, mas pode ser útil entender por que não existem muitos

Eu tenho experimentado o Webstorm agora que me sinto atraído pelo desenvolvimento do Node e não é ruim o suficiente que eu comprei, mas continuo a abrir arquivos js no Scite com mais frequência do que o WS. A razão para isso é que você pode fazer muito mais com muito menos em JS, mas também porque o trabalho da interface do usuário fornece feedback imediato, as ferramentas de desenvolvimento do navegador (especialmente o Chrome e o Firebug) são realmente excelentes e (considerando contextos que não são do navegador) ) re-executar o código alterado é rápido e fácil sem uma etapa de compilação.

Outra coisa de que estou bastante convencido é que os IDEs basicamente criam sua própria demanda, permitindo códigos desleixados que você realmente não pode pagar em JavaScript. Deseja saber como gerenciamos em JS? Pode ajudar começar tentando escrever algo não trivial em Java sem um IDE e prestar muita atenção às coisas que você deve começar a fazer e pensar para realmente conseguir manter / modificar esse código sem que um IDE se mova frente. Na IMO, essas mesmas coisas ainda são críticas para a criação de código sustentável, se você tem um IDE ou não. Se eu tivesse que escrever um currículo de programação de quatro anos, não permitiria que você tocasse em um IDE nos dois primeiros anos, com o objetivo de não distorcer as ferramentas e dependências.

Estrutura

Devs JS experientes que lidam com aplicativos complexos podem e estruturam seu código. De fato, é uma coisa em que tendemos a melhorar com uma história antiga que não possuía IDEs para ler o código para nós, mas também porque linguagens poderosamente expressivas podem expressar poderosamente bases de códigos de desastre completamente não-sustentáveis ​​muito rapidamente, se você não codificar cuidadosamente.

Na verdade, eu tive uma curva de aprendizado bastante íngreme ao entender nossa base de código Java recentemente, até que finalmente percebi que nada disso era OOP adequado. As classes nada mais eram do que conjuntos de métodos vagamente relacionados, alterando dados disponíveis globalmente em beans ou DTOs ou getters / setters estáticos. Essa é basicamente a mesma velha fera que o OOP deveria substituir. Então parei de olhar e pensar no código basicamente. Acabei de aprender as teclas de atalho e rastrear as bagunças e tudo correu muito mais suavemente. Portanto, se você ainda não tem o hábito, pense muito mais no OOD.

Um aplicativo JS bem estruturado no nível mais alto tenderá a consistir em funções complexas (por exemplo, jQuery) e objetos interagindo entre si. Eu argumentaria que a marca de um aplicativo bem estruturado e de fácil manutenção em qualquer idioma é que é perfeitamente legível se você está olhando para ele com um IDE ou o Notepad ++. Essa é uma das principais razões pelas quais eu sou altamente crítico quanto à injeção de dependência e ao TDD do primeiro teste levado ao extremo.

E, finalmente, deixe de ir às aulas. Aprenda a herança prototípica. Na verdade, é bastante elegante e fácil de implementar quando você realmente precisa de herança. No entanto, acho que as abordagens de composição tendem a funcionar muito melhor no JS, e eu pessoalmente começo a ficar doente e a ter EXTJS night-terrors sempre que vejo mais de um ou dois níveis de herança acontecendo em qualquer idioma.

Princípios básicos primeiro

Estou falando das coisas principais das quais todas as outras boas práticas devem derivar: DRY, YAGNI, o princípio do mínimo espanto, separação limpa de domínios problemáticos, gravação em uma interface e gravação de código legível humano são o meu núcleo pessoal. Qualquer coisa um pouco mais complexa que defenda o abandono dessas práticas deve ser considerada Kool Aid em qualquer idioma, mas especialmente em um idioma como o JavaScript, onde é extremamente fácil deixar um legado de código muito confuso para o próximo cara. Acoplamentos frouxos, por exemplo, são ótimos, até você ir tão longe que nem consegue dizer onde está acontecendo a interação entre os objetos.

Não tema a digitação dinâmica

Não há muitos tipos principais de JavaScript. Na maioria das vezes, as regras de conversão dinâmica são práticas e diretas, mas vale a pena aprendê-las para que você possa aprender melhor a gerenciar o fluxo de dados sem projeções desnecessárias e rotinas de validação inúteis. Confie em mim. Tipos rigorosos são ótimos para desempenho e detecção de problemas na compilação, mas não protegem você de nada.

Aprenda a porcaria das funções e fechamentos JS

As funções de primeira classe de JS são, sem dúvida, o principal motivo pelo qual JS ganhou o "Único idioma que vale a pena tocar na Web do lado do cliente com prêmio". E sim, na verdade houve competição. Eles também são um recurso central do JS. Nós construímos objetos com eles. Tudo tem escopo definido para funções. E eles têm recursos úteis. Podemos examinar os parâmetros através da palavra-chave argumentos. Podemos anexá-los e acioná-los temporariamente no contexto de serem métodos de outros objetos. E eles fazem abordagens orientadas a eventos para coisas obscenamente fáceis de implementar. Em resumo, eles fizeram da JS uma fera absoluta na redução da complexidade e na adaptação de várias implementações da própria JS (mas principalmente da API DOM) diretamente na fonte.

Reavaliar padrões / práticas antes de adotar

Funções de primeira classe e tipos dinâmicos tornam muitos dos padrões de design mais complexos completamente inúteis e pesados ​​em JS. Alguns dos padrões mais simples, no entanto, são incrivelmente úteis e fáceis de implementar, dada a natureza altamente flexível do JS. Adaptadores e decoradores são particularmente úteis e achei os singletons úteis para fábricas de widgets de interface do usuário complexas que também atuam como gerenciadores de eventos para os elementos de interface do usuário que eles constroem.

Siga o exemplo do idioma e faça mais com menos

Acredito que um dos principais especialistas em Java defenda em algum lugar que a verbosidade é realmente um recurso positivo que facilita a compreensão do código para todas as partes. Hogwash. Se isso fosse verdade, o legalese seria mais fácil de ler. Somente o escritor pode tornar mais fácil o que eles escreveram e você pode fazer isso colocando-se no lugar do outro ocasionalmente. Então, adote essas duas regras. 1. Seja o mais direto e claro possível. 2. Chegue ao ponto maldito já. A vitória é que um código conciso e limpo é uma ordem de magnitude mais fácil de entender e manter do que algo em que você precisa atravessar vinte e cinco camadas para ir do gatilho à ação desejada real. A maioria dos padrões que defendem esse tipo de coisa em linguagens mais rígidas são, na verdade, soluções alternativas para limitações que o JavaScript não possui.

Tudo é maleável e tudo bem

JS é provavelmente uma das linguagens menos protecionistas em uso popular. Abrace isso. Funciona bem. Por exemplo, você pode escrever objetos com vars "particulares" persistentes inacessíveis, simplesmente declarando vars regulares em uma função de construtor, e faço isso com freqüência. Mas não é para proteger meu código ou seus usuários "deles mesmos" (eles poderiam substituí-lo por sua própria versão durante o tempo de execução). Mas é um sinal de intenção, porque a suposição é de que o outro cara é competente o suficiente para não querer alterar as dependências e verá que você não pretende chegar diretamente a ela, talvez por um bom motivo.

Não há limites de tamanho, apenas domínios com problemas

O maior problema que tenho com todas as bases de código Java que eu já vi é uma superabundância de arquivos de classe. Antes de tudo, o SOLID é apenas uma reiteração confusa do que você já deve saber sobre OOP. Uma classe deve lidar com um conjunto específico de problemas relacionados. Não há um problema com um método. Isso é apenas pegar o código C de func-spaghetti em encadeamento antigo apenas com a adição de toda a sintaxe de classe inútil para inicializar. Não há limite de tamanho ou método. Se faz sentido adicionar algo a uma função, classe ou construtor já longa, faz sentido. Tome jQuery. É todo um conjunto de ferramentas de tamanho de biblioteca em uma única função e não há nada de errado nisso. Se ainda precisamos do jQuery, o debate é razoável, mas em termos de design,

Se Java é tudo que você sabe, mergulhe em algo com uma sintaxe não baseada em C

Quando comecei a mexer no Python porque gostava do que estava ouvindo sobre o Django, aprendi a começar a separar sintaxe do design de linguagem. Como resultado, ficou mais fácil entender Java e C como uma soma de suas partes de design de linguagem, em vez de uma soma de coisas que eles fazem de maneira diferente com a mesma sintaxe. Um bom efeito colateral é que quanto mais você entender outras linguagens em termos de design, melhor entenderá os pontos fortes / fracos da pessoa que você conhece melhor através do contraste.

Conclusão

Agora, considerando tudo isso, vamos acertar todos os seus pontos-problema:

  • Não há maneira imediata de localizar o ponto de entrada de uma função (exceto uma pesquisa de texto sem formatação, que pode resultar em pesquisas subsequentes de métodos além da hierarquia de chamadas, depois de duas ou três das quais você esqueceu por onde começou)

Chrome e Firebug realmente têm rastreamento de chamadas. Mas veja também meus pontos de vista sobre estrutura e manter as coisas concisas e diretas. Quanto mais você pensa no seu aplicativo como construções maiores e bem encapsuladas que interagem entre si, mais fácil é descobrir de quem é a culpa quando as coisas dão errado. Eu diria que isso também é verdade em Java. Temos construtores de função de classe que são perfeitamente reparáveis ​​para preocupações tradicionais de POO.

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

No meu código, quase nunca uso os literais de objeto {}como componentes estruturais de aplicativos, pois eles não podem ter vars internos (privados) e preferem reservá-los para uso como estruturas de dados. Isso ajuda a definir uma expectativa que mantém a clareza de intenção. (se você ver curvas, são dados, não um componente da arquitetura do aplicativo).

  • Os parâmetros são passados ​​para funções, sem maneira de saber quais propriedades e funções estão disponíveis nesse parâmetro (além de executar o programa, navegar até o ponto em que a função é chamada e usar console.logs para gerar todas as propriedades acessível)

Mais uma vez, consulte as ferramentas modernas do navegador. Mas também, por que é tão chato executar o programa novamente? Recarregar é algo que um desenvolvedor da Web do cliente normalmente acessa a cada poucos minutos, porque não custa absolutamente nada para fazê-lo. Novamente, outro ponto com o qual a estrutura do aplicativo pode ser útil, mas é uma desvantagem negativa do JS que você precisa executar sua própria validação ao impor contratos é essencial (algo que eu faço apenas nos pontos de extremidade expostos a outras coisas que minha base de código não não controle). Na OMI, a compensação vale bem os benefícios.

  • O uso comum de funções anônimas como retornos de chamada, que freqüentemente levam a um espaguete de caminhos de código confusos, pelos quais você não pode navegar rapidamente.

Sim, isso é ruim em qualquer coisa não trivial. Não faça isso. Nomeie suas funções como crianças. É mais fácil rastrear as coisas também. Você pode definir, avaliar (necessário para atribuir) e atribuir uma função trivial simples, alinhada com:

doSomethingWithCallback( (function callBack(){}) );

Agora, o Chrome terá um nome para você quando você estiver rastreando as chamadas. Para funções não triviais, eu o definiria fora da chamada. Observe também que funções anônimas atribuídas a uma variável ainda são anônimas.

  • E, com certeza, o JSLint detecta alguns erros antes do tempo de execução, mas mesmo assim não é tão útil quanto ter linhas onduladas vermelhas sob seu código diretamente no navegador.

Eu nunca toco nas coisas. Crockford deu algumas coisas boas à comunidade, mas o JSLint cruza a linha em preferências estilísticas e sugerir que certos elementos do JavaScript são partes ruins por nenhuma razão particularmente boa, IMO. Definitivamente, ignore uma coisa sobre as classes regEx e negation seguidas por * ou +. Os curingas têm um desempenho mais fraco e você pode limitar facilmente a repetição com {}. Além disso, ignore qualquer coisa que ele disser sobre construtores de funções. Você pode envolvê-los facilmente em uma função de fábrica se a nova palavra-chave o incomodar. O CSSLint (não o de Crockford) é ainda pior no que diz respeito aos maus conselhos. Sempre leve as pessoas que fazem muitas palestras com um pouco de sal. Às vezes eu juro que eles estão apenas procurando estabelecer autoridade ou gerar novo material.

E, novamente, você deve desaprender o que aprendeu com essa preocupação em tempo de execução que possui. (é comum que eu já vi muitos desenvolvedores Java / C #). Se os erros em tempo de execução ainda o incomodam 2 anos depois, quero que você se sente e recarregue o spam em um navegador até que ele afunde. não há divisão em tempo de compilação / tempo de execução (de qualquer forma, não é visível - o JS é executado em um JIT agora). Não é apenas bom descobrir bugs em tempo de execução, é extremamente benéfico recarregar spam com facilidade e facilidade e descobrir bugs em todos os pontos de parada.

E descubra essas ferramentas de desenvolvimento do Chrome. Eles são integrados diretamente ao webkit. Clique com o botão direito do mouse no Chrome. Inspecionar elemento. Explore as guias. Existe bastante poder de depuração, com a capacidade de alterar o código no console durante o tempo de execução, sendo uma das opções mais poderosas, mas menos óbvias. Ótimo para testar também.

Em uma nota relacionada, os erros são seus amigos. Nunca escreva uma declaração de captura vazia. Em JS, não ocultamos ou ocultamos erros (ou pelo menos não devemos tossir YUI / tosse ). Nós atendemos a eles. Qualquer coisa menos resultará em dor de depuração. E se você escrever uma instrução catch para ocultar erros em potencial na produção, registre pelo menos silenciosamente o erro e documente como acessar o log.

Erik Reppen
fonte
3
Upvoting para o tamanho da resposta ...
Florian Margaine
5

O que você está dizendo é apenas a queixa comum de uma pessoa com espírito Java que olha JavaScript.

Vamos primeiro responder sua pergunta ...

... minha pergunta é: como outros programadores lidam com esses problemas ...

Resposta: Eles NÃO. Eles aprendem a filosofia do JavaScript abandonando primeiro o culto ao Java.

Você precisa entender essa premissa ... JavaScript NÃO é Java. Não é apenas sobre sintaxe - é mais sobre a filosofia.

Agora vamos pegar alguns deles ...

  • Visualize instantaneamente todos os locais em que um método é chamado ou uma constante é usada (Hierarquia de chamadas em aberto / Mostrar referências)

    Clique com a tecla Control pressionada no nome de uma função / membro / classe para ir direto à sua definição

    Tudo isso está disponível - basta escolher um IDE decente.

  • A digitação estática significa que você pode usar o preenchimento de código para mostrar todos os parâmetros / funções disponíveis em um objeto

    Este não é um problema com o qual você lida . Isso é algo que requer mudar sua perspectiva de programação. O sistema de tipos soltos é um dos pontos fortes do JavaScript. Entenda a digitação solta - e aprenda a apreciá-la. Além disso, a conclusão de código funciona muito bem com o JS.

  • E, com certeza, o JSLint detecta alguns erros antes do tempo de execução, mas mesmo assim não é tão útil quanto ter linhas onduladas vermelhas sob seu código diretamente no navegador.

    Firebug, console Chrome / Safari e até IDEs fazem tudo isso e muito mais.

    Existe o JSHint que pode fazer a análise estática bacana à qual os programadores Java estão acostumados.

  • O resultado é que você praticamente precisa ter o programa inteiro em sua cabeça o tempo todo. Isso aumenta enormemente a carga cognitiva para escrever programas complexos.

    Errado! Pelo contrário, o JavaScript é uma linguagem de programação "leve" - ​​e incentiva você a ter programas mais simples. Como Doug Crockford diz ... ele irá "puni-lo" se você tentar escrever programas baseados em modelos em JavaScript.

  • Embora os programas possam ser um pouco mais fáceis e rápidos de escrever, na minha experiência, eles são muito mais difíceis de ler e depurar.

    Totalmente errado! Como você decide a legibilidade com base na linguagem de programação? Os programas são legíveis (ou não) - NÃO são idiomas. Além disso, o JavaScript tem depuradores fantásticos.

Perdoe-me se eu parecesse um pouco rude - mas a verdade é que você precisa alterar sua disposição de Java para entender o JavaScript.

Somente programadores Java "maduros" podem apreciar o JavaScript - e você não pode dominar aquilo que não aprecia. Mais uma vez, desculpe por ser totalmente franco.

codificador de árvore
fonte
2
Você tem um exemplo de um IDE JavaScript em que eu posso "clicar com o botão direito do mouse em um nome de função / membro / classe para ir direto à sua definição"? Eu uso o Eclipse para Java e Scala, mas falta um bom IDE / Editor para JavaScript.
Jonas
11
Preparado para receber algumas críticas, mas algumas coisas aqui estão completamente erradas. Se eu criar um objeto e depois passá-lo para uma função, posso clicar com o botão direito do mouse no parâmetro e visualizar suas propriedades? Não, não posso, porque o objeto pode ser qualquer coisa. Se eu digitar incorretamente um dos nomes de propriedade do objeto, ele me avisará? Não, não vai, porque não é um erro no JS, mesmo que provavelmente nunca seja o que você deseja. A conclusão útil do código é impossível. Descobrir quais propriedades o parâmetro de uma função possui envolve a spelunking através do código chamado a função, para descobrir onde o objeto foi criado.
funkybro
3
Você pode reclamar que a maneira como o JS é criado torna mais difícil para os IDEs codificarem para você. Eu reclamaria que em Java não posso simplesmente manter propriedades dinâmicas próximas de qualquer coisa que eu queira ou fazer introspecção de objetos durante todo o tempo de execução. As duas línguas são muito diferentes em filosofia. Penso de maneiras que criam uma desconexão maior entre desenvolvedores Java e JS do que entre JS e a maioria das outras linguagens. Pessoalmente, acho o C mais fácil de adaptar do que o Java e detesto trabalhar com um IDE inchado.
amigos estão
2
Nem mesmo os desenvolvedores Java do Google conseguem tirar o Java da cabeça ao escrever JS. sitepoint.com/google-closure-how-not-to-write-javascript
Erik Reppen
3
Você escreve: JavaScript NÃO é Java e é necessário alterar sua disposição Java para entender o JavaScript, seguido por: Somente programadores Java "maduros" podem apreciar o JavaScript ... Portanto, para entender o Javascript, primeiro preciso dominar o Java e depois esquecer tudo. isto?
Caleb
3

Em geral, é difícil ter as ferramentas mencionadas para uma linguagem dinâmica (a menos que o IDE faça parte do tempo de execução - por exemplo, Smalltalk). Dito isto, depois de aprender um editor de texto realmente bom, a maioria dos IDEs parece menos atraente - essa é pelo menos a minha experiência.

Nemanja Trifunovic
fonte
2

Esse é o preço que pagamos pelo uso de idiomas mal digitados. Só podemos imaginar por que essa abominação se tornou tão popular. As desvantagens superam em muito as vantagens de idiomas mal digitados.

Talvez devêssemos aplicar o princípio da não cooperação a esse lixo para fazê-lo desaparecer.

ThomasX
fonte
3
"linguagens mal tipadas" - Muitos programadores discordam de você.
Sean McMillan
7
+1, a única razão pela qual o Javascript é popular é porque estava no lugar certo, na hora certa.
maple_shaft
2
Ah, vocês estão tristes porque o Node.js tem ligações com C ++ em vez de Java, não é?
amigos estão
11
Não sei ao certo o que se entende por "idiomas mal digitados". JavaScript não é "mal digitado". É digitado dinamicamente e as operações podem causar coerção de tipo. Não culpe o idioma porque o seu editor / IDE não sabe o tipo da variável - você deve saber de qualquer maneira.
21912 Ryan Kinal
3
@RyanKinal Realmente? Você deve conhecer todas as propriedades e métodos de todos os objetos e classes em todo o aplicativo, a API do seu idioma e a de todas as bibliotecas que você está usando, de memória ? Você rejeita a noção de conclusão de código IDE, melhorando maciçamente a produtividade, reduzindo a carga cognitiva e oferecendo menos coisas em que pensar?
funkybro
2

Eu não gostava de javascript (e sua digitação dinâmica), mas aprendi a apreciar a orientação a objetos, os fechamentos e a programação funcional . Além disso, seus objetos globais e a remoção da conversão silenciosa de tipos eram uma lufada de ar fresco quando os encontrei pela primeira vez.

Meu ide preferido para javascript é webstorm , pois é fácil obter o jQuery intellitext funcionando (pena que não seja grátis).

Além disso, eu não diria que está crescendo - já é onipresente.

Seus pontos específicos:

Nenhuma maneira imediata de encontrar o ponto de entrada de uma função

Eu não entendo isso, como poderia ser mais simples?

Os parâmetros são passados ​​para funções, sem maneira de saber quais propriedades e funções estão disponíveis nesse parâmetro

Se você configurar seu ide para incluir a definição de objetos, as propriedades do objeto estarão disponíveis via intellitext (mas talvez eu tenha perdido o seu objetivo aqui).

O uso comum de funções anônimas como retornos de chamada, que freqüentemente levam a um espaguete de caminhos de código confusos, pelos quais você não pode navegar rapidamente.

Uso comum ? Se você não gosta de funções anônimas, não as use. Ou você está se referindo ao jQuery que os utiliza substancialmente? O jQuery é provavelmente considerado pela maioria dos desenvolvedores web como o maior economizador de tempo na história do desenvolvimento web .

JSLint captura alguns erros antes do tempo de execução

Ele captura todos eles, você pode incluí-lo no seu ide . Ou Webstorm inclui por padrão (eu acho).

NimChimpsky
fonte
Ser justo onipresente e popular não é necessariamente o mesmo! ;-) De qualquer forma, o webstorm é um excelente IDE para JavaScript (e, embora não seja gratuito, é muito barato). Eu não o usei, mas acredito que o IntelliJ (também do Jetbrains) contém a mesma funcionalidade que pode ser relevante se você tem experiência em Java e deseja usar um único IDE.
FinnNk 27/09/11
OK, talvez eu precise esclarecer ... eu quis dizer "crescendo em popularidade" mais no contexto de desenvolvimento fora do navegador / DOM. Ou seja, ele é usado onde outras alternativas estão disponíveis. Por "ponto de entrada da função", eu quis dizer localizar o ponto no código no qual uma função é invocada. Propriedades de parâmetro: não há como um IDE conhecer as propriedades de um determinado objeto antes do tempo de execução! Funções anônimas: posso não gostar, mas outras pessoas cujo código eu preciso manter o fazem. O JSLint não sabe se eu digitei incorretamente o nome de uma propriedade de um determinado objeto, por exemplo.
funkybro
@funkybro "não há como um IDE conhecer as propriedades de um determinado objeto antes do tempo de execução" Existe, apenas inclua "WhateverMyObjectIs.js" como um script referenciado no ide e, para nomes de propriedades digitados incorretamente, tente o webstorm, faça isso (se eu me lembro bem).
NimChimpsky
3
Não há! Considere este código: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); Como pode uma conclusão código de oferta IDE em myFunc's paramparâmetro? parampode ser qualquer objeto de qualquer tipo, com propriedades.
funkybro 27/09/11
Sim, mas presumivelmente os parâmetros que você está passando estão realmente disponíveis nesse contexto. Um analisador pode resolver isso sem ser seu próprio interpretador JS completo.
Erik Reppen
2

o que estou perdendo?

Você está perdendo as duas enormes vantagens que o Javascript tem sobre o Java:

  • O código Javascript tem cerca de um quarto do tamanho do código Java equivalente.
  • Você nunca precisa aguardar uma compilação e a reinicialização do servidor.

Eu trabalho de maneira diferente em Javascript. Eu adiciono um pouco de código de cada vez, o mínimo que posso testar, atualizo o navegador e o testo. Com o jQuery, algumas linhas de Javascript são tudo o que preciso na maioria das vezes.

Eu achei a programação Java relativamente improdutiva e agora estou escrevendo todo o meu código do lado do servidor no Groovy, pelas mesmas duas razões.

Kevin Cline
fonte
5
"O código Javascript tem cerca de um quarto do tamanho do código Java equivalente" <- este é o problema! Claro que é rápido criar funções anônimas, adicionar propriedades extras aos objetos e jogá-las como confetes. Mas e quando outra pessoa visita seu código e tenta descobrir o que está acontecendo? Além disso, mais código em Java não é necessariamente mais digitação ... O Eclipse escreve muito disso para você.
funkybro
3
@funkybro: O Eclipse escreve ... então eu fico olhando para além da vida do projeto. Se necessário, mas um plug-in trivial pode gerá-lo, é um cheiro de linguagem. Você está certo de que as classes Javascript exigem um pouco mais de documentação. Mas apenas conhecer uma assinatura de método Java também não é suficiente.
Kevin cline
11
Não é necessário! Você poderia simular Javascript em Java sempre invocando métodos com reflexão e usando nada além de objetos simples, listas e mapas, se realmente quisesse. No entanto, a maioria dos desenvolvedores do IME (nem tudo o que confesso!) Escolhe definir tipos de dados significativos, pois eles acham que os ajuda a escrever um código de auto-documentação que pode ser mantido!
funkybro
11
A reflexão permite que o Java modifique objetos durante o tempo de execução? Que tal fechamentos? Aprenda a linguagem antes de criticá-la ou assumir o Java, a linguagem de paradigma mais fechado fora do assembly é capaz de emulá-la.
Erik Reppen
11
Downvoters: este não é um referendo em Java vs. Javascript. É rude fazer voto negativo sem uma razão.
Kevin cline
0

Eu sei que essa pergunta é antiga, mas como programador de C ++ / C # que tinha os mesmos sentimentos, mas que agora usa muito JavaScript nos últimos 10 anos, minha primeira recomendação seria experimentar o Código do Visual Studio .

É claro que ele não pode oferecer todos os recursos que podem ser adicionados com uma linguagem fortemente tipada, mas chega bem perto.

Ele também pode pegar informações de tipo de texto datilografado e aplicá-lo ao JavaScript. Mesmo se você nunca usar o texto datilografado, poderá obter a conclusão e a documentação do código em várias APIs ao digitar JavaScript.

Então, para suas perguntas

  • Não há maneira imediata de localizar o ponto de entrada de uma função (exceto uma pesquisa de texto sem formatação, que pode resultar em pesquisas subsequentes de métodos além da hierarquia de chamadas, depois de duas ou três das quais você esqueceu por onde começou)

Parece resolvido principalmente no VSCode?

  • Os parâmetros são passados ​​para funções, sem maneira de saber quais propriedades e funções estão disponíveis nesse parâmetro

Isso é resolvido para muitos IDEs, documentando seu código com comentários no estilo JSDoc ou texto datilografado. Os editores lerão os comentários e fornecerão a mesma conclusão a que você está acostumado

O uso comum de funções anônimas como retornos de chamada, que freqüentemente levam a um espaguete de caminhos de código confusos, pelos quais você não pode navegar rapidamente.

Como um programador de C #, as funções anônimas também são comuns e foram adicionadas ao C ++. Eu acho que isso é algo com o qual você só precisa se acostumar.

Além disso, embora os retornos de chamada tenham sido substituídos principalmente por promessas e por assíncrono / espera, e se você tiver uma API que use um retorno de chamada, poderá envolvê-lo rapidamente para usar uma promessa e, em seguida, usar async / waitit para que o problema ocorra.

E, com certeza, o JSLint detecta alguns erros antes do tempo de execução, mas mesmo assim não é tão útil quanto ter linhas onduladas vermelhas sob seu código diretamente no navegador.

Você obterá linhas onduladas no Visual Studio Code. Não apenas isso, mas se você ativar a integração do ESLint, receberá muitos avisos e erros incríveis destacados no seu editor. Mais do que eu já vi em outros idiomas, na verdade. Minha experiência é que linters para C / C # / Java foram bastante codificados onde o ESLint é maciçamente configurável e extensivamente extensível e, como tais bibliotecas populares, podem até integrar-se para fornecer conselhos e avisos sobre o uso específico de bibliotecas no editor. Algo que eu não vi pessoalmente em outros idiomas (embora talvez seja comum agora para outros idiomas também?)

Também é 2018 e ES7 é a nova norma para você class. Você sempre usa o modo estrito. Você nunca usar vare sempre usar conste lete um monte de coisas que C ++ / C # / programadores Java tiveram um tempo difícil para se acostumar tipo de desaparecer. Ative a no-undefregra no ESLint e ainda mais problemas desaparecem

Dito isso, saiba como thisrealmente funciona e como funções e métodos realmente funcionam, porque não é o mesmo que C ++ / C # / Java.

Meus primeiros 2-3 anos de JavaScript foram frustrados. Em algum momento, ele clicou. Parei de tentar forçá-lo a ser C ++ / C # / Java e agora fico frustrado ao voltar quando coisas que levariam 15 linhas em JavaScript levam 150 nessas outras linguagens.

gman
fonte
-1

Se você gosta de IDEs e é usado para eclipsar, confira o Aptana como um IDE para JavaScript. Eu acho que pode fazer muito do que você quer. (Eu pessoalmente odeio IDEs, mas essa é uma conversa diferente).

Quanto às funções anônimas, acho que elas são o recurso mais poderoso do JavaScript e tentar trabalhar em uma linguagem que não as possui é neste momento bastante doloroso.

Se você quiser algo que possa ser compilado para JavaScript, existem várias opções: CofffeeScript, Clojure e GWT todos passam pela sua cabeça, mas há outras.

Zachary K
fonte
2
Eu tentei Aptana uma vez, e é muito ruim. Ele nem tem auto-indentação e destrói todas as configurações do projeto definidas por outros editores do Eclipse, por exemplo, coloração e outras coisas, se eu usar o Eclipse e o Aptana no mesmo projeto.
Jonas
11
Usei-o por um tempo e odiava, mas como eu disse eu odeio IDE é eu formatação pela ferramenta de linha de comando e editar em gVim ou emacs (dependendo do que eu estou fazendo)
Zachary K
Falha nas primeiras horas e não tenho nada em aberto além de um punhado de arquivos? Tchau tchau.
precisa saber é o seguinte
Tempestade na Web não é ruim. Eu ainda uso o Scite na maioria das vezes, mas estou começando a sentir mais o IDE ao escrever coisas sobre o Node.js. Não tenho o benefício de feedback visível do navegador e ferramentas de desenvolvimento.
Erik Reppen
-1

Ainda não o usei, mas já vi algumas demos e estou muito impressionado com o Cloud 9 como um IDE JavaScript.

Você pode optar pelo modelo de serviço on-line ou baixá-lo no GitHub.

E como prova de sua qualidade como IDE, o Cloud9 foi escrito usando ... Cloud9!

Chao
fonte