Migrando pra Scala

824 views
701 views

Published on

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

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
824
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Migrando pra Scala

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

×