Desenvolvimento em Java 2.0: JavaScript para Desenvolvedores Java

Fundamentos de variáveis, tipos, funções, etc. de JavaScript para desenvolvedores Java

Historicamente, os desenvolvedores de aplicativos Java™ consideram o JavaScript como uma linguagem "de brinquedo", leve demais para a programação de verdade e pesada demais para ser usada com uma alternativa de criação de scripts. Entretanto, o JavaScript ainda é usado e é a base de tecnologias da Web interessantes, como GWT e Node.js. Nesta parte do Java development 2.0, Andrew Glover explica por que o JavaScript é uma ferramenta importante para o desenvolvedor Java moderno. Em seguida, ele mostra os fundamentos da sintaxe necessária para desenvolver aplicativos de primeira classe para a Web atual, que englobam variáveis, tipos, funções e classes de JavaScript.

Andrew Glover, Author and developer, Beacon50

Andrew Glover é desenvolvedor, autor, palestrante e empreendedor com uma paixão por desenvolvimento direcionado por comportamento, integração contínua e desenvolvimento de software Agile. Ele é o fundador da easyb , estrutura Behavior-Driven Development (BDD) e é o coautor de três livros: Continuous Integration, Groovy in Action e Java Testing Patterns. Você pode acompanhá-lo em seu blog e seguindo-o no Twitter.



24/Jun/2011

Nos primeiros dias da plataforma Java, era comum que jornalistas — e até mesmo programadores iniciantes ocasionalmente — confundissem o JavaScript com a linguagem Java. As duas linguagens foram popularizadas devido à sua aplicabilidade à programação para a Web, no fim das contas e, durante alguns anos, correram lado a lado na imaginação popular. A maioria das pessoas diferencia as duas linguagens atualmente, mas ainda é comum que os desenvolvedores Java considerem o JavaScript como uma linguagem de brinquedo, que não serve nem mesmo para a criação de scripts. Acontece que o JavaScript (assim como a linguagem Java) sobreviveu e até evoluiu. É a base das técnicas de programação no lado do cliente, como o Ajax, e de esforços no lado do servidor, como o Node.js, e a sua importância para o desenvolvimento de aplicativos remotos está começando a surgir. Também é a linguagem para a qual o código Java compila no Google Web Toolkit (GWT), muito difundido.

Nesta parte do Desenvolvimento Java em 2.0, eu explico por que o JavaScript é importante para os desenvolvedores Java atualmente e repasso parte da sintaxe mais útil do JavaScript, explicando como ela se diferencia da linguagem Java e também comparando-a com linguagens mais modernas e dinâmicas como Groovy e Ruby.

Sobre esta série

O panorama de desenvolvimento em Java mudou radicalmente desde que a tecnologia Java emergiu. Graças a estruturas maduras de software livre e infraestruturas de implementação confiáveis de aluguel, agora é possível montar, testar, executar e manter aplicativos Java de forma rápida e barata. Nesta série, Andrew Glover explora o espectro de tecnologias e ferramentas que tornam este novo paradigma de desenvolvimento Java possível.

Passado e presente: por que o JavaScript é importante

O JavaScript foi introduzido pela Netscape em 1995 e a sua popularidade aumentou rapidamente. O motivo tinha muito a ver com o surgimento da Web como uma plataforma de mídia comercial — com o JavaScript era possível, e ainda é, afetar programaticamente o comportamento da página da Web dentro do navegador. Na época, isso era interessante! A validação do formato HTML e os truques limitados de imagem eram os aspectos mais importantes.

Desde então, o JavaScript passou por algumas "encarnações". Em um determinado momento, a Netscape tinha um produto, o Netscape Application Server, que se baseava no JavaScript no lado do servidor para desenvolver aplicativos da Web. Alguns anos depois, o interesse no JavaScript se renovou com a introdução do Ajax e das bibliotecas de widgets como Prototype, JQuery e Extjs. Mais recentemente, o JavaScript no lado do servidor deu uma volta de 360º com o Node.js, um framework de E/S baseado em eventos para desenvolver aplicativos da Web no lado do servidor usando o mecanismo de JavaScript V8 da Google.

A Netscape fez algo vanguardista para a época ao enviar o JavaScript à Ecma International para padronização. É por isso que algumas pessoas chamam o JavaScript de ECMAScript. Mais importante: é por isso que a maioria dos navegadores da Web suporta o ECMAScript. Consequentemente, os aplicativos da Web passam por muitas dificuldades quando não usam o JavaScript em algum lugar — e provavelmente isso não vai mudar. Atualmente, não há nenhuma outra linguagem de criação de script compatível com navegadores no horizonte.

Node.js

O Node.js (consulte Recursos) é um framework no lado do servidor, altamente concorrente e baseado em eventos. Os programas em Node.js escalam de forma muito mais eficiente que os programas com encadeamento e, ao mesmo tempo, resolvem a maioria dos problemas associados à programação concorrente. Embora o Node.js seja relativamente novo, a inovação relacionada a ele é muito interessante. Conhecer o JavaScript é fundamental para ter acesso à crescente família de ferramentas associadas ao Node.js.

Atualmente, apesar da má reputação que ainda persiste, pode-se dizer que o JavaScript é uma das linguagens mais usadas (e úteis) do planeta. Se você é programador Java (ou programador Ruby, Python ou PHP), é bem possível que já tenha usado ou irá usar o JavaScript no futuro próximo. O entendimento de alguns dos recursos do JavaScript pode ajudá-lo a desenvolver o próximo aplicativo da Web extremamente popular. Além disso, permitirá que você aproveite o Node.js e até mesmo melhore o seu entendimento sobre o funcionamento interno do GWT.

Nas próximas seções, abordarei os principais elementos da sintaxe do JavaScript, destacando detalhes que podem surpreender ou agradar os desenvolvedores Java. Contudo, primeiramente eu quero desfazer um dos mitos muito difundidos do JavaScript: o mito de que é necessário ter uma página da Web para interagir com ele.


Usando JavaScript no Chrome

Historicamente, o JavaScript precisava de um navegador e, indiretamente, de uma página da Web para ser executado. Para alguns desenvolvedores, isso era um inconveniente e até mesmo um obstáculo. Felizmente os navegadores evoluíram — atualmente, tanto o Firefox quanto o Chrome oferecem IDEs para executar o JavaScript.

Eu gosto do console de JavaScript elegante do Chrome para brincar com a linguagem. Como o IRB do Ruby ou o shell do Python, o Chrome fornece um ambiente interativo para explorar o JavaScript sem uma página da Web.

CoffeeScript

Se você gosta do que o JavaScript consegue fazer, mas não gosta da sintaxe, deve dar uma olhada no CoffeeScript. O CoffeeScript é uma "pequena linguagem que compila no JavaScript" — ou seja, o CoffeeScript facilita a programação em JavaScript ao deixar menos rigorosa uma parte da sintaxe. Em vários aspectos, o CoffeeScript é muito mais parecido com o Ruby ou o Python, mas fornece uma equivalência de um para um em relação ao JavaScript. Consulte Recursos para saber mais sobre o CoffeeScript.

Para começar a usar o console de JavaScript do Chrome, é necessário fazer o download do Chrome para o seu OS. Em seguida, abra uma nova guia em branco (ou seja, não aponte para uma página da Web) e selecione View > Developer > JavaScript Console. Na parte inferior da janela do Chrome, você verá o console para desenvolvedores JavaScript aparecer. É possível fazer com que esse diálogo se torne autônomo ao selecionar o ícone Undock no canto inferior esquerdo do console. Em seguida, pode-se selecionar o ícone Console no canto superior direito do diálogo para abrir uma janela simples em branco para interagir com o JavaScript, como mostra a Figura 1:

Figura 1. Interagindo com o JavaScript no Google Chrome
Interagindo com o JavaScript no Google Chrome

Agora vamos examinar a sintaxe.


Variáveis do JavaScript

O JavaScript é uma linguagem razoavelmente "tolerante", porque permite que você cometa vários erros de programação e, mesmo assim, produza páginas da Web que carregam. Os elementos do JavaScript frequentemente falham de forma silenciosa — o que, de modo geral, é uma boa notícia. O período inicial da Web teria sido complicado se a programação mal feita em JavaScript impedisse o carregamento das páginas. Com isso dito, à medida que usamos o JavaScript para fazer coisas mais sofisticadas (como atualizar o estado da página de forma assíncrona), a programação descuidada em JavaScript tem consequências negativas. É por esse motivo que os desenvolvedores Java devem reservar um tempo para entender, de fato, certos aspectos da sintaxe do JavaScript.

É particularmente importante entender o tratamento das variáveis no JavaScript. É possível definir uma variável chamada foo, por exemplo, diretamente ou por meio da declaração var , como mostra a Listagem 1:

Lista 1. Variável foo
foo = 'foo'
var bar = 'bar'

O foo na Listagem 1 é uma variável válida no JavaScript. Entretanto, como foo não tem uma declaração var , é uma variável global. Consequentemente, as variáveis definidas com var têm escopo (por exemplo, dentro da função na qual são definidas).

Em geral, as variáveis globais são ruins. Frequentemente, elas dão sinais de que o código está errado, indicando que, como elas podem ser acessadas e alteradas em qualquer lugar dentro de um aplicativo de JavaScript, o seu uso pode levar a erros traiçoeiros. Sendo assim, quando você programar em JavaScript, não se esqueça do var com as variáveis.


Primitivas e objetos

Embora o JavaScript seja sofisticado, ele é muito simples no que diz respeito aos tipos. De fato, o JavaScript só tem quatro tipos básicos, e três deles são primitivos. Os tipos primitivos do JavaScript são Number, String e Boolean. É possível ver esses tipos em ação por meio do prático operador typeof do JavaScript.

Vamos experimentar isso juntos. No console de JavaScript do Chrome, digite o que você vê na Listagem 2:

Lista 2. Ativando tipos
var string = "test"
typeof string

Você deve ver o console imprimir o valor "string." Você também verá que o ponto e vírgula é opcional no JavaScript. Como acontece na maioria das linguagens bastante difundidas, a string fica entre aspas, da mesma forma, os números são delineados por números. Os operadores booleanos são delineados pelos valores true ou false, sem aspas.

Lista 3. Verdade e números no JavaScript
var aNumber = 10
var anotherNumber = 0.99
var aBool = true
var notABoolean = "false"

Você verá que o JavaScript não faz distinção entre tipos numéricos, os números são apenas números, com formatos diferentes.

O JavaScript também suporta objetos genéricos que, em si mesmos, têm tipos de instância, como o Array, mostrado na Listagem 4:

Lista 4. Uma instância de Array
> var myArray = ["Hello", 1, true]
> typeof myArray
"object"
> myArray instanceof Array
true

Os Arrays no JavaScript são como as listas em outras linguagens: podem ser criados sem tamanho e conter qualquer coisa que você queira colocar neles. Como no Ruby ou no Groovy, os Arrays do JavaScript podem ser criados com uma sintaxe literal: []. E mais, os Arrays de JavaScript suportam os métodos (mostrados na Listagem 5) que são esperados em outras linguagens que suportam listas:

Lista 5. Métodos de Array
> var myArray = ["Hello", 1, true]
> myArray[0]
"Hello"
> myArray.length
3
> myArray.pop()
true
> myArray
["Hello", 1]
> myArray.pop()
1
> myArray
["Hello"]
> myArray.push("pushed")
2
> myArray
["Hello", "pushed"]

Pode-se obter o valor de um Array por meio da sua posição, que tem base zero. Os Arrays respondem a push e pop, em que push inclui um item (na última posição) e pop remove um (como uma pilha, da última posição).

Os Arrays também suportam iteração, mostrada na Listagem 6:

Lista 6. Iterando por meio de um Array
> var myArray = [1,2]
> for(var i = 0; i < myArray.length; i++) { console.log(myArray[i]) }
1
2

Coerção de tipo

O JavaScript não é só uma linguagem com tipos fracos — é ainda mais fraco que o Ruby ou o Groovy! O JavaScript sai do seu caminho para forçar os objetos a adotar qualquer tipo que faça sentido em um determinado ponto do código. Isso faz sentido no contexto em que o JavaScript foi criado originalmente: a interação entre páginas da Web. O JavaScript mal feito não deve impedir a leitura de um artigo on-line!

A coerção de tipo não é exclusiva do JavaScript, mas a marca específica do JavaScript é muito flexível. Isso pode ser bom ou ruim, dependendo do ponto de vista. A falta de rigidez do JavaScript pode esconder defeitos, da mesma forma que as variáveis globais escondem.

Por exemplo, eu posso definir um Array e, em seguida, tentar fazer algo numérico com ele sem querer, ou até mesmo fazer uma concatenação de String , mostrada na Listagem 7:

Lista 7. Flexibilidade de tipos do JavaScript
> var myArray = [1,2]
> console.log(2 * myArray)
> console.log("A" + myArray)

Nesse caso, a primeira mensagem de log imprimiria NaN, ao passo que a segunda imprimiria A1,2. Nos dois casos, o código funcionou porque nada deu erro — o JavaScript simplesmente seguiu em frente. Esses tipos são fracos ao extremo. O mesmo código no Ruby não funcionaria dessa forma, como mostra a Listagem 8:

Lista 8. O Ruby não funciona dessa forma
> array = ["A", "B"]
> ans = 2 * array

O código do Ruby na Listagem 8 daria o seguinte erro:

TypeError: Array
can't be coerced into Fixnum

E se eu tentasse incluir "A" em array, resultado seria:

TypeError: can't convert
Array into String

Se eu tentasse esse mesmo truque no Groovy, obteria o seguinte:

groovy.lang.MissingMethodException: No signature of method: 
java.lang.Integer.plus() is applicable for argument types: (java.util.ArrayList) values:
[[A, B]]

Assim, é possível ver os vários níveis de tipos fracos em ação. Claramente, se existisse uma escala de fraqueza de tipos, o JavaScript seria o mais fraco de todos!


Funções do JavaScript

Uma função de JavaScript, como um método Java, é uma construção para definir e encapsular um comportamento reutilizável. À primeira vista, as funções em JavaScript são muito parecidas com os fechamentos do Groovy. No JavaScript, as funções são objetos. Na verdade, são objetos de primeira classe, algo muito diferente dos métodos no código Java. Já que as funções de JavaScript são objetos, elas podem ser passadas a outras funções e chamadas à vontade.

As funções são definidas com a palavra-chave function . É possível especificar argumentos como você especificaria em uma declaração de método na linguagem Java; além disso, é possível retornar algo de uma função de JavaScript. Ao contrário das linguagens dinâmicas, como o Groovy ou o Ruby, onde uma chamada de retorno é opcional (sendo assim, a última linha de cada método é retornada), as funções em JavaScript devem usar uma instrução de retorno se quiserem retornar algo; do contrário, não retornam nada.

Você chama as funções no JavaScript como chamaria os fechamentos no Groovy. Na Listagem 9, eu defino uma função simples que não toma parâmetros. O seu objetivo é imprimir "blah" no console de JavaScript do Chrome.

Lista 9. Definindo e chamando uma função no JavaScript
> function blah() { console.log("blah"); }
> blah() //prints blah
> blah.call() //prints blah
> blah.apply() //prints blah

É possível chamar uma função diretamente com parênteses (ou seja, ()) por meio do método call ou do método apply . A qualidade de primeira classe dos objetos de função é demonstrada claramente aqui. A Listagem 10 mostra o que acontece quando eu tento chamar um método de lixo na função blah:

Lista 10. Funções como objetos no JavaScript
> blah.foo()

Nesse caso, você deve ver uma mensagem de erro indicando que foo não é um método definido, da seguinte forma:

TypeError: Object function blah() { console.log("blah"); } has no method 'foo'

Agora leia novamente essa mensagem de erro. A mensagem indica que foo não foi definida, o que significa que, se tivesse sido definida, as coisas teriam dado certo.


Classes no JavaScript

O JavaScript suporta primitivas, que eu já expliquei. Também suporta objetos, como Array. O JavaScript não suporta classes — pelo menos não no sentido clássico da linguagem Java. Como o JavaScript é uma linguagem baseada em protótipo, você não define classes — em vez disso, o comportamento é reutilizado por meio da clonagem dos objetos já existentes. Sendo assim, no JavaScript, você não define objetos de classe; você os define em funções e, em seguida, usa funções aninhadas para definir o comportamento — algo que você já viu em ação.

Para emular uma classe, você define uma função. Você pode dar um nome a ela (ou seja, um nome de classe), especificar parâmetros (como em um construtor) e até usar a palavra-chave .this , que basicamente significa fazer referência a uma variável dentro do escopo da função. E mais: as funções internas podem ter aliases para parecer-se com chamadas de método.

Para demonstrar, na Listagem 11, eu criarei um protótipo Message (também conhecido como classe) que é muito simples. Fornecerei alguns parâmetros (de quem é a mensagem, a quem ela se destina e a mensagem em si) e a classe representará a minha mensagem como JSON.

Lista 11. Funções como classes no JavaScript
function Message(to, from, msg){
 this.to = to;
 this.from = from;
 this.msg = msg;

 this.asJSON = function(){
  return "{'to':'" + this.to + "', 'from':'" + this.from + "', 'message':'" +
    this.msg + "'}";
 }
}

Na Listagem 11, eu defini uma função Message— um objeto com um nome e algumas propriedades: to, from e msg. Em seguida, eu defini uma propriedade (asJSON) que aponta para uma função interna cujo trabalho é inserir uma representação em cadeia de caracteres da minha mensagem em JSON.

Observe que eu também posso definir essa "classe" em uma página da Web, carregá-la com o Chrome, abrir o console de JavaScript e usá-la interativamente. É isso que está acontecendo na Listagem 12:

Lista 12. Usando classes em JavaScript
> var message = new Message('Andy', 'Joe', 'Party tonight!');
> message.asJSON();
"{'to':'Andy', 'from':'Joe', 'message':'Party tonight!'}"

Esse código parece de Groovy ou até de Java (com exceção de var), não é? Na verdade, é totalmente possível usar técnicas de OOP para desenvolver aplicativos em JavaScript (ou seja, programas que contêm objetos com dados e métodos interagindo uns com os outros).


Conclusão

Espero que este artigo tenha desacreditado a ideia — ultrapassada há muito tempo — de que o JavaScript é uma linguagem de brinquedo. Na verdade, é muito eficiente e tem muito dos recursos sintáticos e da facilidade das linguagens mais novas como Groovy e Ruby. Algumas das características que eram vistas como defeitos na década de 90 são desejáveis agora.

Considerando a importância da Web para grande parte do desenvolvimento de aplicativos em Java e o lugar especial que o JavaScript ocupa como linguagem compatível com o navegador, todo programador Java deve conhecer o JavaScript — ponto final. O navegador (independentemente de estar em um computador, dispositivo remoto, telefone ou tablet) é o meio pelo qual uma quantidade cada vez maior de pessoas interage com os aplicativos. O JavaScript também é o meio comum entre todas as linguagens no lado do servidor. Além disso, o entendimento de alguns dos recursos do JavaScript ajudará você a ser um programador melhor em qualquer linguagem, inclusive a sua preferida.

Recursos

Aprender

  • Desenvolvimento em Java 2.0: essa série explora as tecnologias que estão redefinindo o panorama do desenvolvimento Java. Os tópicos englobaram Google App Engine (agosto de 2009), NoSQL (maio de 2010) e Amazon Elastic Beanstalk (Fevereiro de 2011).
  • "Why you need to learn JavaScript" (Michael Woloszynowicz, Web Development 2.0 and Business Lessons, janeiro de 2011): Desenvolvedores com um bom conhecimento de programação Java trazem qualificações importantes para o JavaScript, e o JavaScript traz ferramentas essenciais para o desenvolvimento da Web e de aplicativos remotos.
  • "JavaScript as a compiler target: Clamato, GWT Smalltalk, Python, Scheme" (Werner Schuster, InfoQ, setembro de 2009): uma pesquisa sobre as ferramentas mais recentes que modernizaram o uso do JavaScript, utilizando-o para o desenvolvimento de aplicativos remotos e da Web.
  • "Ryan McGeary sobre CoffeeScript" (developerWorks, fevereiro de 2011): McGeary explica como o CoffeeScript, que é baseado no Node.js e compila para o JavaScript, deixa a programação funcional mais limpa e produz um JavaScript mais legível.
  • "Why you should pay attention to Node.js" (Stephen O'Grady, RedMonk Tecosystems, maio de 2010): aborda o Node.js como uma tecnologia de ruptura para a programação concorrente.
  • "Compare JavaScript frameworks" (Joe Lennon, developerWorks, fevereiro de 2010): neste artigo, a explicação aprofundada dos recursos que maximizam o desenvolvimento em JavaScript — como seletores, travessia do DOM e tratamento de eventos — é mais importante que a comparação.
  • "GWT fu, Parte 1" (David Geary, developerWorks, setembro de 2009): saiba como o GWT compila o código Java para o JavaScript, tendo como resultado interfaces ricas com o usuário que executam em um navegador.
  • Navegue pela livraria da tecnologia Java para ver livros sobre este e outros tópicos técnicos.
  • Zona tecnologia Java do developerWorks: Encontre centenas de artigos sobre quase todos os aspectos da programação Java.

Obter produtos e tecnologias

Discutir

  • Participe da comunidade do developerWorks. Entre em contato com outros usuários do developerWorks, enquanto explora os blogs, fóruns, grupos e wikis orientados ao desenvolvedor.

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Tecnologia Java, Software livre
ArticleID=658018
ArticleTitle=Desenvolvimento em Java 2.0: JavaScript para Desenvolvedores Java
publish-date=06242011