SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Migrando	
  pra	
  Scala	
  


     Maurício	
  Linhares	
  
       @mauriciojr	
  
    h5p://techbot.me/	
  
h5p://www.officedrop.com/	
  	
  
MEU	
  PROBLEMA?	
  
Migrar	
  uma	
  plataforma	
  de	
  
     Ruby	
  para	
  Java	
  
DEPOIS	
  DE	
  ALGUNS	
  ANOS	
  DE	
  RUBY	
  
VOLTAR	
  A	
  PROGRAMAR	
  EM	
  JAVA	
  
FOI…	
  
JavaScript	
            Python	
  

  O	
  Java	
  envelheceu	
  e	
  a	
  
concorrência	
  andou	
  rápido	
  

 C#	
          Ruby	
  

                       Erlang	
  
•  Closures	
  
 •  Closures	
  
 •  Closures	
  
 •  Closures	
  
•  E	
  coleções	
  
Vá	
  devagar	
  

Que	
  devagar	
  chega	
  também	
  
Closures	
  são	
  importantes	
  
        mesmo?	
  
       Show	
  me	
  the	
  code!	
  
Implementar	
  uma	
  solução	
  que	
  deve	
  
tentar	
  várias	
  vezes	
  executar	
  uma	
  
tarefa	
  se	
  ela	
  falhar.	
  Pense	
  em	
  
chamadas	
  de	
  rede.	
  
CASO?	
  
Classes?	
  
	
  
•  RetryableService	
  para	
  casos	
  que	
  não	
  retornam	
  



•  ReturningRetryableService	
  para	
  casos	
  que	
  
   retornam	
  alguma	
  coisa	
  
Usando	
  
new	
  RetryableService()	
  {	
  
	
  	
  @Override	
  
	
  	
  public	
  void	
  call()	
  throws	
  ExcepYon	
  {	
  
	
  	
  	
  	
  System.out.println("Estou	
  dentro	
  da	
  
chamada!");	
  
	
  	
  }	
  
};	
  
Usando	
  com	
  return	
  
	
  @Test	
  
public	
  void	
  testRetryWithResult()	
  {	
  
	
  
	
  	
  String	
  result	
  =	
  new	
  ReturningRetryableService<String>(){	
  
	
  
	
  	
  	
  	
  @Override	
  
	
  	
  	
  	
  public	
  String	
  call()	
  throws	
  ExcepYon	
  {	
  
	
  	
  	
  	
  	
  	
  String	
  conteudo	
  =	
  "olá	
  mundo!”;	
  
	
  	
  	
  	
  	
  	
  return	
  conteudo;	
  
	
  	
  	
  	
  }	
  
	
  	
  }.getResult();	
  
	
  
	
  	
  System.out.println(result);	
  
}	
  
Implementação	
  em	
  Scala	
  
def	
  retry[T](n:	
  Int)(fn:	
  =>	
  T):	
  T	
  =	
  {	
  
      	
  try	
  {	
  
      	
   	
  fn()	
  
      	
  }	
  catch	
  {	
  
      	
   	
  case	
  e	
  =>	
  
      	
   	
   	
  if	
  (n	
  >	
  1)	
  {	
  
      	
   	
   	
   	
  retry(n	
  -­‐	
  1)(fn)	
  
      	
   	
   	
  }	
  
      	
   	
   	
  else	
  throw	
  new	
  IllegalStateExcepYon(e)	
  
      	
  }	
  
}	
  
Uso	
  em	
  Scala	
  
	
  
retry	
  {	
  
	
  	
  	
  	
  storeNote(document)	
  
}	
  
E	
  as	
  coleções?	
  

Show	
  me	
  the	
  code	
  [2]	
  
Em	
  Java	
  
	
  	
  	
  	
  @Test	
  
	
  	
  	
  	
  public	
  void	
  testForeach()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  for	
  (	
  Cidade	
  cidade	
  :	
  Cidade.CIDADES	
  )	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  System.out.println(cidade.getNome());	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
Em	
  Scala	
  
                	
  	
  
	
  	
  	
  	
  @Test	
  
                	
  def	
  testForeach	
  {	
  
                	
   	
  Cidade.CIDADES.foreach	
  {cidade	
  =>	
  
println(cidade.getNome)}	
  
                	
  }	
  
Em	
  Java	
  
@Test	
  
public	
  void	
  testSomar()	
  {	
  
	
  	
  BigInteger	
  resultado	
  =	
  BigInteger.ZERO;	
  
	
  
	
  	
  for	
  (	
  Cidade	
  cidade	
  :	
  Cidade.CIDADES)	
  {	
  
	
  	
  	
  	
  resultado	
  =	
  
resultado.add(	
  BigInteger.valueOf(cidade.getPopulacao())	
  );	
  
	
  	
  }	
  
	
  
	
  	
  System.out.println(	
  resultado	
  );	
  
}	
  
Em	
  Scala	
  
@Test	
  
def	
  testSoma	
  {	
  
	
  
	
  	
  val	
  resultado	
  =	
  cidades.foldLeo(BigInt(0))	
  {	
  (soma,	
  
cidade)	
  =>	
  soma	
  +	
  cidade.getPopulacao	
  }	
  
	
  	
  	
  
	
  	
  println(resultado)	
  
}	
  
Em	
  Java	
  
	
  @Test	
  
public	
  void	
  testTransformar()	
  {	
  
	
  	
  List<Long>	
  populacoes	
  =	
  new	
  ArrayList<Long>();	
  
	
  	
  for	
  (	
  Cidade	
  cidade	
  :	
  Cidade.CIDADES	
  )	
  {	
  
	
  	
  	
  	
  populacoes.add(	
  cidade.getPopulacao()	
  );	
  
	
  	
  }	
  
	
  	
  System.out.println(	
  populacoes	
  );	
  
}	
  
Em	
  Scala	
  
@Test	
  
def	
  testMap	
  {	
  
	
  	
  val	
  populacoes	
  =	
  Cidade.CIDADES.map	
  {	
  cidade	
  
=>	
  cidade.getPopulacao	
  }	
  
	
  	
  println(	
  populacoes	
  )	
  
}	
  
Em	
  Java	
  
Cidade	
  resultado	
  =	
  null;	
  
	
  
for	
  (Cidade	
  cidade	
  :	
  Cidade.CIDADES)	
  {	
  
	
  	
  if	
  (cidade.getPopulacao()	
  ==	
  100)	
  {	
  
	
  	
  	
  	
  resultado	
  =	
  cidade;	
  
	
  	
  	
  	
  break;	
  
	
  	
  }	
  
}	
  
	
  
if	
  (	
  resultado	
  !=	
  null	
  )	
  {	
  
	
  	
  System.out.println(	
  resultado	
  );	
  
}	
  else	
  {	
  
	
  	
  System.out.println(	
  "Não	
  há	
  cidade	
  com	
  essa	
  população"	
  );	
  
}	
  
Em	
  Scala	
  
@Test	
  
def	
  testEncontrarCidadePeloNome	
  {	
  
	
  
	
  	
  val	
  result	
  =	
  Cidade.CIDADES.find	
  {	
  cidade	
  =>	
  
cidade.getPopulacao	
  >	
  10000000	
  }	
  
	
  
	
  	
  result	
  match	
  {	
  
	
  	
  	
  	
  case	
  Some(cidade)	
  =>	
  println(	
  cidade.getNome	
  )	
  
	
  	
  	
  	
  case	
  None	
  =>	
  println(	
  "Não	
  há	
  cidade	
  com	
  os	
  dados	
  
passados"	
  )	
  
	
  	
  }	
  
}	
  
Adendo	
  -­‐	
  Prefira	
  iterações	
  
            internas	
  
       Coleções	
  paralelas	
  
  Gerenciamento	
  automáYco	
  de	
  
            recursos	
  
Mas	
  outras	
  linguagens	
  fazem	
  
          isso	
  também	
  
       Por	
  que	
  escolher	
  Scala?	
  
Preferência	
  pelo	
  mundo	
  final	
  e	
  
           imutável	
  
    Não	
  comparYlhe	
  nada	
  e	
  seja	
  feliz	
  
       num	
  mundo	
  concorrente	
  
Raiz	
  forte	
  no	
  mundo	
  da	
  
  programação	
  funcional	
  
Só	
  tenha	
  cuidado	
  ao	
  olhar	
  o	
  código	
  
                fonte	
  do	
  ScalaZ	
  
Compawvel	
  com	
  o	
  seu	
  legado	
  
              Java	
  
   E	
  código	
  Scala	
  PODE	
  ser	
  chamado	
  
                  através	
  do	
  Java	
  
Biblioteca	
  base	
  madura	
  

 Poucas	
  mudanças	
  drásYcas	
  tem	
  
acontecido	
  na	
  biblioteca	
  padrão	
  da	
  
               linguagem	
  
Ferramentas	
  em	
  situação	
  
       aceitável	
  
Ao	
  menos	
  pra	
  uma	
  linguagem	
  que	
  
 está	
  chamando	
  atenção	
  agora	
  
Actors	
  and	
  Akka	
  

The	
  Killer	
  App	
  for	
  concurrency	
  and	
  
          parallel	
  programming	
  
Cuidado	
  com	
  features	
  que	
  você	
  
  não	
  entende	
  por	
  completo	
  
      Se	
  não	
  sabe	
  brincar,	
  não	
  vá	
  pro	
  
                      brinquedo	
  
Cuidado	
  com	
  as	
  coleções,	
  elas	
  
podem	
  não	
  ser	
  o	
  que	
  você	
  pensa	
  
          scala.immutable.List	
  não	
  é	
  
          equivalente	
  ao	
  java.uYl.List	
  	
  
match/case	
  não	
  é	
  igual	
  ao	
  
      switch/case	
  
O	
  custo	
  de	
  execução	
  pode	
  ser	
  muito	
  
                      diferente	
  
Evite	
  usar	
  símbolos	
  ou	
  caracteres	
  
         unicode	
  no	
  seu	
  código	
  
Scala	
  não	
  serve	
  pra	
  fazer	
  CRUD	
  
                   web	
  
       Pra	
  isso	
  você	
  usa	
  Ruby	
  e	
  Rails	
  
Isto	
  não	
  é	
  Scala!	
  
Adicione	
  mais	
  uma	
  ferramenta	
  
  no	
  seu	
  toolbox	
  e	
  seja	
  feliz	
  
    Isto	
  não	
  vai	
  resolver	
  todos	
  os	
  seus	
  
                        problemas	
  
Migrando pra Scala

Mais conteúdo relacionado

Mais procurados

JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sérioLuciano Ramalho
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcionalLP Maquinas
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
TDC 2014 POA: Programacao funcional Por que Importa?
TDC 2014 POA: Programacao funcional Por que Importa?TDC 2014 POA: Programacao funcional Por que Importa?
TDC 2014 POA: Programacao funcional Por que Importa?Diego Pacheco
 
Aula 02 operadores aritiméticos
Aula 02   operadores aritiméticosAula 02   operadores aritiméticos
Aula 02 operadores aritiméticosTácito Graça
 
Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisLuiz Borba
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorFelipe Hummel
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação FuncionalTales Andrade
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellSérgio Souza Costa
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Natanael Fonseca
 

Mais procurados (20)

JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Programação funcional no dia a dia
Programação funcional no dia a diaProgramação funcional no dia a dia
Programação funcional no dia a dia
 
Javafx Introdução
Javafx IntroduçãoJavafx Introdução
Javafx Introdução
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
POO - Aula 003
POO - Aula 003POO - Aula 003
POO - Aula 003
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
 
TDC 2014 POA: Programacao funcional Por que Importa?
TDC 2014 POA: Programacao funcional Por que Importa?TDC 2014 POA: Programacao funcional Por que Importa?
TDC 2014 POA: Programacao funcional Por que Importa?
 
Aula 02 operadores aritiméticos
Aula 02   operadores aritiméticosAula 02   operadores aritiméticos
Aula 02 operadores aritiméticos
 
Java8
Java8Java8
Java8
 
Debugging no Devtools
Debugging no DevtoolsDebugging no Devtools
Debugging no Devtools
 
Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionais
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação Funcional
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
 
Java aula 05
Java aula 05Java aula 05
Java aula 05
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
SFD - C# para a comunidade
SFD - C# para a comunidadeSFD - C# para a comunidade
SFD - C# para a comunidade
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 

Destaque

Destaque (9)

Além do java
Além do javaAlém do java
Além do java
 
Banco de dados dbo4
Banco de dados dbo4Banco de dados dbo4
Banco de dados dbo4
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010
 
Conhecendo o Decorator
Conhecendo o DecoratorConhecendo o Decorator
Conhecendo o Decorator
 
The Fast, The Slow and the Lazy
The Fast, The Slow and the LazyThe Fast, The Slow and the Lazy
The Fast, The Slow and the Lazy
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Apresentação sobre DB4O
Apresentação sobre DB4OApresentação sobre DB4O
Apresentação sobre DB4O
 

Semelhante a Migrando pra Scala

Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosGregorio Kusowski
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?Denis Costa
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Tchelinux
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoRafael Ponte
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraDextra
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
Produtividade em Java com Grails
Produtividade em Java com GrailsProdutividade em Java com Grails
Produtividade em Java com GrailsWanderson Oliveira
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptJean Carlo Emer
 
DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016Leandro Silva
 
Desenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on RailsDesenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on RailsLucas Caton
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Daniel Sobral
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Como trabalhar com código legado
Como trabalhar com código legadoComo trabalhar com código legado
Como trabalhar com código legadoSidney Filho
 
Conhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java PlatformConhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java PlatformMilfont Consulting
 

Semelhante a Migrando pra Scala (20)

Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Aula5
Aula5Aula5
Aula5
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
1.introducao java
1.introducao java1.introducao java
1.introducao java
 
Javascript
JavascriptJavascript
Javascript
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails Dextra
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
JavaFX SestInfo 2010
JavaFX SestInfo 2010JavaFX SestInfo 2010
JavaFX SestInfo 2010
 
Produtividade em Java com Grails
Produtividade em Java com GrailsProdutividade em Java com Grails
Produtividade em Java com Grails
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScript
 
DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016
 
Desenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on RailsDesenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on Rails
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Como trabalhar com código legado
Como trabalhar com código legadoComo trabalhar com código legado
Como trabalhar com código legado
 
Conhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java PlatformConhecendo a JSR 223: Scripting for the Java Platform
Conhecendo a JSR 223: Scripting for the Java Platform
 

Mais de Maurício Linhares

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropMaurício Linhares
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemMaurício Linhares
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 
Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010Maurício Linhares
 
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
Projeto e desenvolvimento de sistemas de informação   4 - computação em redeProjeto e desenvolvimento de sistemas de informação   4 - computação em rede
Projeto e desenvolvimento de sistemas de informação 4 - computação em redeMaurício Linhares
 

Mais de Maurício Linhares (20)

Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Curso java 02 - variáveis
Curso java   02 - variáveisCurso java   02 - variáveis
Curso java 02 - variáveis
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Feature Driven Development
Feature Driven DevelopmentFeature Driven Development
Feature Driven Development
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvem
 
Mercado hoje
Mercado hojeMercado hoje
Mercado hoje
 
Revisão html e java script
Revisão html e java scriptRevisão html e java script
Revisão html e java script
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 
Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010
 
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
Projeto e desenvolvimento de sistemas de informação   4 - computação em redeProjeto e desenvolvimento de sistemas de informação   4 - computação em rede
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
 
Extreme programming explicada
Extreme programming explicadaExtreme programming explicada
Extreme programming explicada
 
Jdbc e hibernate
Jdbc e hibernateJdbc e hibernate
Jdbc e hibernate
 

Migrando pra Scala

  • 1. Migrando  pra  Scala   Maurício  Linhares   @mauriciojr   h5p://techbot.me/   h5p://www.officedrop.com/    
  • 2. MEU  PROBLEMA?   Migrar  uma  plataforma  de   Ruby  para  Java  
  • 3. DEPOIS  DE  ALGUNS  ANOS  DE  RUBY   VOLTAR  A  PROGRAMAR  EM  JAVA   FOI…  
  • 4.
  • 5. JavaScript   Python   O  Java  envelheceu  e  a   concorrência  andou  rápido   C#   Ruby   Erlang  
  • 6. •  Closures   •  Closures   •  Closures   •  Closures   •  E  coleções  
  • 7. Vá  devagar   Que  devagar  chega  também  
  • 8. Closures  são  importantes   mesmo?   Show  me  the  code!  
  • 9. Implementar  uma  solução  que  deve   tentar  várias  vezes  executar  uma   tarefa  se  ela  falhar.  Pense  em   chamadas  de  rede.   CASO?  
  • 10. Classes?     •  RetryableService  para  casos  que  não  retornam   •  ReturningRetryableService  para  casos  que   retornam  alguma  coisa  
  • 11. Usando   new  RetryableService()  {      @Override      public  void  call()  throws  ExcepYon  {          System.out.println("Estou  dentro  da   chamada!");      }   };  
  • 12. Usando  com  return    @Test   public  void  testRetryWithResult()  {        String  result  =  new  ReturningRetryableService<String>(){            @Override          public  String  call()  throws  ExcepYon  {              String  conteudo  =  "olá  mundo!”;              return  conteudo;          }      }.getResult();        System.out.println(result);   }  
  • 13. Implementação  em  Scala   def  retry[T](n:  Int)(fn:  =>  T):  T  =  {    try  {      fn()    }  catch  {      case  e  =>        if  (n  >  1)  {          retry(n  -­‐  1)(fn)        }        else  throw  new  IllegalStateExcepYon(e)    }   }  
  • 14. Uso  em  Scala     retry  {          storeNote(document)   }  
  • 15. E  as  coleções?   Show  me  the  code  [2]  
  • 16. Em  Java          @Test          public  void  testForeach()  {                  for  (  Cidade  cidade  :  Cidade.CIDADES  )  {                          System.out.println(cidade.getNome());                  }          }  
  • 17. Em  Scala              @Test    def  testForeach  {      Cidade.CIDADES.foreach  {cidade  =>   println(cidade.getNome)}    }  
  • 18. Em  Java   @Test   public  void  testSomar()  {      BigInteger  resultado  =  BigInteger.ZERO;        for  (  Cidade  cidade  :  Cidade.CIDADES)  {          resultado  =   resultado.add(  BigInteger.valueOf(cidade.getPopulacao())  );      }        System.out.println(  resultado  );   }  
  • 19. Em  Scala   @Test   def  testSoma  {        val  resultado  =  cidades.foldLeo(BigInt(0))  {  (soma,   cidade)  =>  soma  +  cidade.getPopulacao  }            println(resultado)   }  
  • 20. Em  Java    @Test   public  void  testTransformar()  {      List<Long>  populacoes  =  new  ArrayList<Long>();      for  (  Cidade  cidade  :  Cidade.CIDADES  )  {          populacoes.add(  cidade.getPopulacao()  );      }      System.out.println(  populacoes  );   }  
  • 21. Em  Scala   @Test   def  testMap  {      val  populacoes  =  Cidade.CIDADES.map  {  cidade   =>  cidade.getPopulacao  }      println(  populacoes  )   }  
  • 22. Em  Java   Cidade  resultado  =  null;     for  (Cidade  cidade  :  Cidade.CIDADES)  {      if  (cidade.getPopulacao()  ==  100)  {          resultado  =  cidade;          break;      }   }     if  (  resultado  !=  null  )  {      System.out.println(  resultado  );   }  else  {      System.out.println(  "Não  há  cidade  com  essa  população"  );   }  
  • 23. Em  Scala   @Test   def  testEncontrarCidadePeloNome  {        val  result  =  Cidade.CIDADES.find  {  cidade  =>   cidade.getPopulacao  >  10000000  }        result  match  {          case  Some(cidade)  =>  println(  cidade.getNome  )          case  None  =>  println(  "Não  há  cidade  com  os  dados   passados"  )      }   }  
  • 24. Adendo  -­‐  Prefira  iterações   internas   Coleções  paralelas   Gerenciamento  automáYco  de   recursos  
  • 25. Mas  outras  linguagens  fazem   isso  também   Por  que  escolher  Scala?  
  • 26. Preferência  pelo  mundo  final  e   imutável   Não  comparYlhe  nada  e  seja  feliz   num  mundo  concorrente  
  • 27. Raiz  forte  no  mundo  da   programação  funcional   Só  tenha  cuidado  ao  olhar  o  código   fonte  do  ScalaZ  
  • 28. Compawvel  com  o  seu  legado   Java   E  código  Scala  PODE  ser  chamado   através  do  Java  
  • 29. Biblioteca  base  madura   Poucas  mudanças  drásYcas  tem   acontecido  na  biblioteca  padrão  da   linguagem  
  • 30. Ferramentas  em  situação   aceitável   Ao  menos  pra  uma  linguagem  que   está  chamando  atenção  agora  
  • 31. Actors  and  Akka   The  Killer  App  for  concurrency  and   parallel  programming  
  • 32.
  • 33. Cuidado  com  features  que  você   não  entende  por  completo   Se  não  sabe  brincar,  não  vá  pro   brinquedo  
  • 34. Cuidado  com  as  coleções,  elas   podem  não  ser  o  que  você  pensa   scala.immutable.List  não  é   equivalente  ao  java.uYl.List    
  • 35. match/case  não  é  igual  ao   switch/case   O  custo  de  execução  pode  ser  muito   diferente  
  • 36. Evite  usar  símbolos  ou  caracteres   unicode  no  seu  código  
  • 37. Scala  não  serve  pra  fazer  CRUD   web   Pra  isso  você  usa  Ruby  e  Rails  
  • 38. Isto  não  é  Scala!  
  • 39. Adicione  mais  uma  ferramenta   no  seu  toolbox  e  seja  feliz   Isto  não  vai  resolver  todos  os  seus   problemas