migrando pra scala

Post on 06-Jun-2015

637 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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…  

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

C#   Ruby  

Python  

Erlang  

JavaScript  

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

Vá  devagar  

Que  devagar  chega  também  

Closures  são  importantes  mesmo?  

Show  me  the  code!  

CASO?  

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

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  

top related