Pular para o conteúdo principal

Como Scala melhorou meu código Java

Ontem publiquei no meu blog pessoal algumas críticas ao método clone. Eu diria que esse é um assunto um pouco delicado. Resolvi escrever um pouco aqui também em homenagem a uma discussão sobre este mesmo assunto que tivemos em uma das turmas da Academia do Arquiteto, alguns meses atrás.

Antes de entrar nos detalhes, vamos deixar claro o ponto aonde vamos chegar: objetivos imutáveis podem ajudar muito na qualidade do nosso código, e estudar a linguagem Scala me ajudou a enxergar isso. Dito isso, vamos aos pormenores.

O método clone tem pelo menos dois grandes problemas. O primeiro deles é conceitual. Para suportarmos operações de clone em nossos objetos, temos que implementar a interface Cloneable. Faria todo o sentido do mundo, se o método clone estivesse definido nesta interface, e não em Object.

O segundo problema é de ordem mais prática. Vejamos o código abaixo, em Scala, que é o mesmo que usei no meu post mencionado acima:

class A(b: B) extends Cloneable {
  override def clone() = super.clone
  override def toString() = "[A: %s]".format(b)
}

class B(c: C) extends Cloneable {
  override def clone() = super.clone
  override def toString() = "[B: %s]".format(c)
}

class C(var x: Int) extends Cloneable {
  override def clone() = super.clone
  override def toString() = "[C: %d]".format(x)
}

val c = new C(10)
val b = new B(c)
val a = new A(b)

val a2 = a.clone
c.x = -99

Temos três classes, A, B e C. Criamos um objeto a, e depois clonamos ele. O clone, diferente do que pode parecer, faz apenas uma cópia rasa do objeto. Ou seja, ele não vai criar um novo b dentro do a, vai apenas copiar a referência. Se quisermos uma cópia profunda, criando novos objetos internos, temos que implementar isso na nossa sobrecarga do método clone. Veja o que acontece na versão atual:

scala> println(a)
[A: [B: [C: -99]]]

scala> println(a2)
[A: [B: [C: -99]]]

Ou seja, a última linha, c.x = -99, alterou tanto o a quanto o a2, o que não era o que gostaríamos.

E o que Scala tem a ver com tudo isso? Imutabilidade. Isso não é excluisivo desta linguagem, mas um dos pensamentos que linguagens funcionais (o que inclui Scala) traz é a preferência por estruturas de dados imutáveis.

E é aqui que Scala ajuda a melhorar nosso código - nos expondo a novas idéias. Em um pensamento "tradicional" na linguagem java, a tentação seria sobrescrever corretamente o método clone, mesmo isso dando um certo trabalho, e com grande risco de não funcionar corretamente.

Nosso novo pensamento é: vamos remover completamente a funcionalidade de clone e vamos tornar os objetos imutáveis. Algo assim:

case class A(b: B, name: String)
case class B(c: C)
case class C(x: Int)

val c = C(10)
val b = B(c)
val a = A(b, "jcranky")

Agora todos os elementos das nossas classes são imutáveis - i.e. não podem ser alterados. Se quisermos alterar alguma coisa, temos que fazer o que já sabemos fazer com Strings: criar um objeto novo, com a alteração desejada. Denovo no meu post mencionado lá em cima, eu explico um pouco mais sobre como criar esse objeto novo, sem ter que fazer muito trabalho manual.

Além da corretude do código, isso traz diversos outros benefícios, como a não necessidade de locks - o estado não muda, não precisamos bloquear o acesso a ele.

E isso, é claro, é apenas um exemplo. Scala tem muito mais recursos interessantes que, mesmo quando não estamos usando a linguagem, servem para abrir nossa cabeça.

Se quiser saber mais sobre Scala, na semana que vêm teremos mais um turma do Mini Curso gratuito de Scala. E em setembro teremos a primeira turma do Core Scala, um treinamento completo nesta linguagem.

Por fim, o Kleber também publicou dois posts muito bons sobre como começar a programar em Scala, aqui e aqui. Vale a pena ler.

----------
contatos:

blog: http://jcranky.com
twitter: http://twitter.com/jcranky
scaladores: http://scaladores.com.br
core scala:  http://www.globalcode.com.br/treinamentos/cursos/core-scala

Comentários

Yara Senger disse…
Este comentário foi removido pelo autor.
Yara Senger disse…
Muito bacana este post!Parabens!

Postagens mais visitadas deste blog

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

Devo fazer um curso ou ler um livro?

Acredito que todos os instrutores ou professores, independentemente da área, escola ou centro de treinamento, já devam ter recebido essa pergunta alguma vez na vida: devo fazer um curso ou ler um livro? Para responder a essa pergunta, precisamos avaliar os prós e contras de cada opção. Trabalho com treinamento há algum tempo e, hoje, recebi essa pergunta de um aluno. Não adianta responder a ou b sem argumentar, demonstrando as opções conforme a situação do aluno. O conteúdo, a forma de transmissão e a capacidade de assimilação do indivíduo são chaves para haver benefício maior de aprendizado. Tanto em um bom curso quanto em um bom livro, o conteúdo é a premissa básica . Por conteúdo entendemos: se está organizado; se respeita pré-requisitos; se promove o aprendizado guiado e incremental; se aborda de forma satisfatória os principais pontos; se tem bom balanço entre teoria, exemplos e prática (favorecendo exemplos e prática); se tem como premissa a acessibilidade possível (e cabível) pa...

Sistema interativo de TV Digital com Ginga-J

No início de 2009, os estudantes de Sistema de Informação do Centro Universitário de Votuporanga ( UNIFEV ), Caio César Pereira de Souza e Rodrigo Gonçalves Constantino me apresentaram uma proposta para que eu fosse co-orientador junto ao professor orientador Djalma Domingos da Silva , em seu Trabalho de conclusão de curso (TCC) com tema TV Digital. A base que motivou o assunto, foi a palestra apresentada por Maurício Leal na I Conferência Java Noroeste sobre o tema TV Digital, realizada em 2006 em Votuporanga-SP. Ficamos muito entusiasmados com a possibilidade de interatividade na TV Digital, e a grande quantidade de possibilidades de desenvolvimento de aplicativos nesta área. Acompanhamos de perto as notícias na imprensa e todo o esforço e iniciativas realizadas pelo Fórum do Sistema Brasileiro de TV Digital Terrestre (SBTVD) , que organizou e produziu especificações ABNT, normatizando o sistema de TV Digital Terrestre. O foco do TCC foi realizar o desenvolvimento de uma pequena ...

JSF 2 - Composite Components, você não precisa mais ser um ninja

Estamos em uma nova era da computação, os dados não estão mais localizados em um banco dentro de sua empresa, vivemos a explosão de redes sociais, informações são geradas a todo instante, e se torna essencial que sua aplicação conheça os serviços disponíveis na web e consumam suas APIs geralmente disponíveis por serviços REST. Legal, mas como ficam meus aplicativos Java EE neste novo cenário? Para quem vem acompanhando a evolução da plataforma, é notório que todo esforço vem sendo utilizado para aumentar a produtividade e a integração com novos serviços. Basicamente duas especificações surgem com muita força para atender este cenário, a JSR - 314 (JSF-2) e JSR - 311 (JAX-RS), neste post exploraremos a JSR-314 (JSF2) e sua nova forma de criar Composite Components. Uma das grandes queixas dos desenvolvedores JSF era a complexidade em criar composite components, era necessário um vasto conhecimento sobre o ciclo de vida de uma aplicação JSF. Agora, você não precisa ser mais um “ninja” em ...

Exemplo de CRUD para o AppEngine(Struts 2 + Google Guice + JPA)

E dando continuidade a série "Who wants to be a milionaire"... Ok, então você já teve a sua idéia milionária, já deu uma lida no Google AppEngine(GAE) depois do meu último post mas agora tá faltando aquele 'empurrãozinho' para iniciar seu projeto. Tudo bem, aqui vai um empurrão ladeira abaixo... Vou detalhar neste post uma aplicação completa(CRUD) utilizando alguns frameworks Java(Struts 2, Google Guice, JPA) sendo hospedada no Google AppEngine(GAE). Não vou entrar em detalhes específico de cada um dos frameworks pois precisaria de algumas dezenas de posts para isso, o intuito é somente a adaptação necessária para ser executada no GAE, e alguns comentários sobre a arquitetura do projeto. > Struts 2 Infelizmente não é plug-and-play neste ambiente, porém para utilizar o Struts 2 no ambiente do GAE, as modificações são bem simples. A primeira delas é em relação ao framework Ognl que para execução de Reflection acaba esbarrando em algumas problemas de segurança. Para...

Sun, Oracle, JavaOne e mais algumas páginas desta longa história...

Desde abril de 2009 estamos acompanhando todo o processo de aquisição da Sun pela Oracle, que aconteceu muito perto da crise, e no ambiente de negativismo da crise. Parte da comunidade, principalmente os mais velhos tinham um relacionamento de admiração à Sun e e aos engenheiros da Sun. E tantas carreiras e mesmo famílias sendo sustentadas pelo capital gerado ao redor da tecnologia Java. É natural sentir um pouco de medo do impacto deste negócio milionário: O que a Oracle vai fazer com o Java? Vai continuar OpenSource ? Vão mudar a política de distribuição da JVM ? E o JCP está seguro ? Haverá impacto negativo para o Java ? E para as outras ferramentas e tecnologias da Sun ? Com esta enorme mudança de poder dentro da comunidade Java como as outras empresas irão reagir ? Foi realizado hoje um WebCast gratuito "Sun Oracle Strategy", com quatro horas de duração, bastante marketing, muitos adjetivos, resolvi resumir os fatos mais importantes para a nossa comunidade nos com um...