migrando pra scala

40
Migrando pra Scala Maurício Linhares @mauriciojr h5p://techbot.me/ h5p://www.officedrop.com/

Upload: mauricio-linhares

Post on 06-Jun-2015

637 views

Category:

Documents


2 download

DESCRIPTION

Apresentação na JavaCE conference 2012 sobre a migração da OfficeDrop de

TRANSCRIPT

Page 1: Migrando pra Scala

Migrando  pra  Scala  

Maurício  Linhares  @mauriciojr  

h5p://techbot.me/  h5p://www.officedrop.com/    

Page 2: Migrando pra Scala

MEU  PROBLEMA?  

Migrar  uma  plataforma  de  Ruby  para  Java  

Page 3: Migrando pra Scala

DEPOIS  DE  ALGUNS  ANOS  DE  RUBY  VOLTAR  A  PROGRAMAR  EM  JAVA  FOI…  

Page 4: Migrando pra Scala
Page 5: Migrando pra Scala

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

C#   Ruby  

Python  

Erlang  

JavaScript  

Page 6: Migrando pra Scala

• Closures  • Closures  • Closures  • Closures  • E  coleções  

Page 7: Migrando pra Scala

Vá  devagar  

Que  devagar  chega  também  

Page 8: Migrando pra Scala

Closures  são  importantes  mesmo?  

Show  me  the  code!  

Page 9: Migrando pra Scala

CASO?  

Implementar  uma  solução  que  deve  tentar  várias  vezes  executar  uma  tarefa  se  ela  falhar.  Pense  em  chamadas  de  rede.  

Page 10: Migrando pra Scala

Classes?  

 •  RetryableService  para  casos  que  não  retornam  

•  ReturningRetryableService  para  casos  que  retornam  alguma  coisa  

Page 11: Migrando pra Scala

Usando  

new  RetryableService()  {      @Override      public  void  call()  throws  ExcepYon  {          System.out.println("Estou  dentro  da  chamada!");      }  };  

Page 12: Migrando pra Scala

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);  }  

Page 13: Migrando pra Scala

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)    }  

}  

Page 14: Migrando pra Scala

Uso  em  Scala  

 retry  {          storeNote(document)  }  

Page 15: Migrando pra Scala

E  as  coleções?  

Show  me  the  code  [2]  

Page 16: Migrando pra Scala

Em  Java  

       @Test          public  void  testForeach()  {                  for  (  Cidade  cidade  :  Cidade.CIDADES  )  {                          System.out.println(cidade.getNome());                  }          }  

Page 17: Migrando pra Scala

Em  Scala  

           @Test    def  testForeach  {      Cidade.CIDADES.foreach  {cidade  =>  

println(cidade.getNome)}    }  

Page 18: Migrando pra Scala

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  );  }  

Page 19: Migrando pra Scala

Em  Scala  

@Test  def  testSoma  {        val  resultado  =  cidades.foldLeo(BigInt(0))  {  (soma,  cidade)  =>  soma  +  cidade.getPopulacao  }            println(resultado)  }  

Page 20: Migrando pra Scala

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  );  }  

Page 21: Migrando pra Scala

Em  Scala  

@Test  def  testMap  {      val  populacoes  =  Cidade.CIDADES.map  {  cidade  =>  cidade.getPopulacao  }      println(  populacoes  )  }  

Page 22: Migrando pra Scala

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"  );  }  

Page 23: Migrando pra Scala

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"  )      }  }  

Page 24: Migrando pra Scala

Adendo  -­‐  Prefira  iterações  internas  

Coleções  paralelas  Gerenciamento  automáYco  de  

recursos  

Page 25: Migrando pra Scala

Mas  outras  linguagens  fazem  isso  também  

Por  que  escolher  Scala?  

Page 26: Migrando pra Scala

Preferência  pelo  mundo  final  e  imutável  

Não  comparYlhe  nada  e  seja  feliz  num  mundo  concorrente  

Page 27: Migrando pra Scala

Raiz  forte  no  mundo  da  programação  funcional  

Só  tenha  cuidado  ao  olhar  o  código  fonte  do  ScalaZ  

Page 28: Migrando pra Scala

Compawvel  com  o  seu  legado  Java  

E  código  Scala  PODE  ser  chamado  através  do  Java  

Page 29: Migrando pra Scala

Biblioteca  base  madura  

Poucas  mudanças  drásYcas  tem  acontecido  na  biblioteca  padrão  da  

linguagem  

Page 30: Migrando pra Scala

Ferramentas  em  situação  aceitável  

Ao  menos  pra  uma  linguagem  que  está  chamando  atenção  agora  

Page 31: Migrando pra Scala

Actors  and  Akka  

The  Killer  App  for  concurrency  and  parallel  programming  

Page 32: Migrando pra Scala
Page 33: Migrando pra Scala

Cuidado  com  features  que  você  não  entende  por  completo  

Se  não  sabe  brincar,  não  vá  pro  brinquedo  

Page 34: Migrando pra Scala

Cuidado  com  as  coleções,  elas  podem  não  ser  o  que  você  pensa  

scala.immutable.List  não  é  equivalente  ao  java.uYl.List    

Page 35: Migrando pra Scala

match/case  não  é  igual  ao  switch/case  

O  custo  de  execução  pode  ser  muito  diferente  

Page 36: Migrando pra Scala

Evite  usar  símbolos  ou  caracteres  unicode  no  seu  código  

Page 37: Migrando pra Scala

Scala  não  serve  pra  fazer  CRUD  web  

Pra  isso  você  usa  Ruby  e  Rails  

Page 38: Migrando pra Scala

Isto  não  é  Scala!  

Page 39: Migrando pra Scala

Adicione  mais  uma  ferramenta  no  seu  toolbox  e  seja  feliz  

Isto  não  vai  resolver  todos  os  seus  problemas  

Page 40: Migrando pra Scala