sexta-feira, 12 de dezembro de 2014

Scala em pt-BR: Primeiros passos

Começo aqui uma série de posts explicando os principais pontos da linguagem de programação Scala. A ideia é apresentar em bom português tudo sobre essa linguagem que tem muito potencial para entrar para o primeiro escalão de linguagens (C/C++, Java, PHP, Python, Ruby...)

Scala é uma linguagem que mistura características de linguagens funcionais com características de orientação a objetos. Scala tem tipagem estática, ou seja, o tipo/classe de uma expressão ou coisa é conhecido sem que o programa precise ser executado. Mas diferente de outras linguagens "estáticas" como C/C++ e Java, Scala tem um jeitão mais dinâmico e limpo. Isso se deve, principalmente, à inferência de tipos (já já explico).

Para acompanhar o código é só instalar Scala e rodar o REPL (só rodar "scala" na linha de comando). Em Unixes é só rodar apt-get install scala (ou ports ou brew ou...)

blablabla QUERO CÓDIGO!!

Começando do começo: variáveis


Todas as declarações de variáveis são precedidas por val ou var. Se você pretende alterar o valor da "variável" use var e ela será mutável, senão use val. Usar val por padrão é uma boa prática.

Apesar de não ter deixado explícito os tipos das variáveis (Int e String) o compilador sabe que val numero é do tipo Int e que val texto é do tipo String. Isso é possível por que o compilador de Scala usa um algoritmo que infere qual o tipo daquela expressão. Isso é o que chamamos de inferência de tipos (ou type inference). 

Pra quem vem de Java val e var são análogos a colocar ou não final antes de uma variável. Em C/C++ é análogo (mas não igual) ao const antes de declarações. Em PHP, Python e outras linguagens não temos um conceito similar, apesar de existirem formas de declarar constantes no código (Javascript aparentemente não tem). 

O fato de Scala forçar você escolher, o tempo todo, entre val e var faz com que você rapidamente perceba que você não precisa de mutabilidade na maioria das vezes. Você acaba usando val pra quase tudo. Simplificando bastante na hora de entender qual valor determinada variável contém. Simples: sempre o valor atribuído na sua declaração.

O uso de val se alinha com o discurso de tentar usar sempre final e const que vemos na
literatura de Java e C++ (em livros como Effective Java e Effective C++).



Funções


Mesmo com a inferência de tipos, uma hora você tem que dizer o tipo de alguma coisa, não tem como inferir o tipo de tudo (Haskell discorda). Um dos momentos de dizer os tipos é nos parâmetros de funções:

Se você veio de Java, C, C++ ou C# já deu pra ver que a declaração do tipo é na posição inversa. É só pegar o que era String variavel e transformar em variavel: String. Ahhh meu deus, tá tudo invertido!!! Como sobreviver??!? Relaxa. Em uma semana você se acostuma e o compilador não vai te deixar errar mesmo.

Coleções

Scala tem uma biblioteca de coleções (ou collections) bem completa e poderosa. A sintaxe para listas (List), dicionários (Map) e conjuntos (Set) é intuitiva e bem semelhante a linguagens dinâmicas.

Sendo uma linguagem meio funcional meio orientada a objetos, Scala possui formas funcionais de acessar, modificar e criar novas coleções.

Scala, assim como Java, possui tipos genéricos (ou generics). Galera de Go adora #sqn. No exemplo acima vemos nomes: List[String], isso significa uma List que contém elementos do tipo String assim como uma List[Int] contém Inteiros e List[MeuObjetoMagico] contém elementos do tipo MeuObjetoMagico.

No exemplo mais acima, quando criamos coleções passando o conteúdo (List(1, 2, 3)), não tivemos que dizer o tipo. O compilador, esperto como só ele, consegue inferir. Então, algo como List(1, 2, 3, 4) é exatamente o mesmo que List[Int](1, 2, 3, 4).

Classes


De cara a maior diferença das classes em Scala para as mesmas em Java, PHP ou C++ é que o construtor da classe é declarado junto do nome da própria classe. Ao invés de declarar uma função/método separado que age como construtor, o próprio corpo da classe já é seu construtor. Isso acaba economizando espaço.


Mas o maior ganho é o fato de você poder declarar atributos diretamente nos parâmetros do construtor. Basta colocar val ou var antes de um parâmetro do construtor que ele vira um atributo da classe. Em Scala não existe a necessidade desse tipo de código:

Isso já acaba removendo uma boa quantidade de código inútil (ou boilerplate).

Esse foi o primeiro post. Nos próximos vamos entrar em mais detalhes em cada um dos pontos falados aqui.

Ah! Quase esqueci de comentar. Pra quem não percebeu: ponto-e-vírgula é opcional em Scala! \o/

Nenhum comentário: