Like A Girl

Pushing the conversation on gender equality.

Code Like A Girl

Motivos para amar Kotlin

Quero começar esse texto me justificando por não ter escrito com a frequência que eu gostaria. Nos últimos 4 meses eu saí da casa dos meus pais, mudei de cidade, e de emprego. Assunto para outros textos, quem sabe?! O importante é que minha vontade de compartilhar cada pequeno aprendizado continua a mesma — incessante.

Tenho trabalhado com desenvolvimento Android há pouco mais de um ano, e nos últimos meses tenho tido contato diário com Kotlin, linguagem de programação para JVM, Android & JS publicada no ano passado — e estou apaixonada.

De acordo com o Realm Report do ano passado, países gigantes no quesito desenvolvimento móvel (como Estados Unidos, China e Índia), tem adotado fortemente a linguagem. Depois do Google I/O 2017, as taxas de crescimento de Kotlin tem saltado drasticamente, e a previsão é de que até o final desse ano, a porcentagem de programadores em Kotlin supere Java, com 50,7% e 49,3% respectivamente.

A seguir eu vou falar algumas das ferramentas e características básicas da sintaxe que mais me chamaram a atenção. Normalmente eu espero ter mais experiência e conhecimento em um assunto antes de escrever, mas como eu estou bem empolgada com tudo isso, vamos lá.

Underscore para parâmetros não utilizados

Isso parece ser tão bobo, mas deixou meu TOC feliz. Brincadeiras à parte, em alguns casos, somos obrigados a declarar todos os parâmetros de uma função, mesmo os que não serão utilizados. Agora temos uma forma de “omitir” esses parâmetros, substituindo-os por underscore.

Exemplo de código em Java (suponhamos que arg0 não será utilizada).
Mesmo código em Kotlin.

Função como expressão e tipo de retorno inferido

Aqui eu poderia me demorar falando o quanto Java pode ser verboso e etc. Mas fica bem mais fácil mostrar com exemplos:

Código de uma função que retorna um inteiro, resultado da soma de dois parâmetros inteiros, em Java.
O mesmo pode ser feito dessa forma em Kotlin.
OU DESSA FORMA.
Não sei vocês, mas essa foi minha reação quando vi essa lindeza pela primeira vez.

Acesso às propriedades e expressões condicionais

Aqui vou mostrar logo duas características de uma vez só. Um getter / setter nunca foi tão lindo como agora, que você consegue acessar só com o nome da propriedade. Sobre a expressão condicional, existem polêmicas, mas eu, particularmente, gosto de escrever dessa forma, dependendo do caso.

Setando a visibilidade de um botão utilizando uma expressão condicional em Kotlin.
O mesmo pode ser feito isolando a visibilidade do botão em uma variável setada em uma estrutura if/else, e posteriormente atribuindo-a à propriedade; ou usando uma expressão ternária — que também é polêmica — em Java (como na imagem).

Scoping functions — with, run, let, also, apply

São, como o nome dá a entender, funções que limitam o escopo de uma variável. Elas são tão parecidas entre si, que pode ser difícil identificar em que situação específica podemos usar cada uma delas — confesso que até hoje não aprendi, mas só de saber da existência delas, tirar alguns minutos pra decidir qual usar dentro do contexto do teu código provavelmente vai deixá-lo mais limpo. Para caracterizar seu comportamento, podemos analisar três pontos principais:

Se é uma função normal ou de extensão, onde é preverível usar uma função de extensão quando se trata de uma variável que pode ser nula, pois é possível verificar isso antes de entrar no bloco de código onde a variável seria acessada.

Exemplo de scoping functions, onde with é normal e run é de extensão.

Se ela passa this ou it como argumento, onde this pode ser omitido (caso da função run no exemplo abaixo) e it não. It pode ser bompara casos de issues de shadowing (quando uma variável declarada num certo escopo tem o mesmo nome de uma variável declarada em outro escopo).

Ambas funções imprimem o mesmo, a diferença está na maneira de acessar o argumento, no caso a variável stringVariable.

Se retorna this ou o resultado do bloco. Essa característica é um pouco mais complicada de explicar, mas basicamente se trata de alterar ou não a variável dentro do bloco.

Nesse exemplo, podemos ver que let e also tem uma sintaxe bem parecida, ambas são de extensão e passam it como argumento. Mas por incrível que pareça a impressão para cada bloco seria diferente, pois let retorna o resultado do bloco e also não, então, enquanto o bloco que usa also imprimiria “The … String is abc” 3 vezes, o bloco com let imprime “The original String is abc”, “The reverse String is cba” e “The length of the String is 3”.

No final das contas você precisa montar uma pequena árvore de decisão para escolher qual função utilizar, mas como eu falei antes, é um esforço que provavelmente será compensado com um código mais fácil de ler e compreender #seloIngridDeAprovacao.

Gostou? Agora imagine o poder de combinar essas funções. O céu é o limite.

Aqui vão alguns links pra quem quiser ler mais sobre essas funções, ver esses e outros exemplos com mais detalhes:

Kotlin Guide

Mastering Kotlin standard functions: run, with, let, also and apply

yole/kotlin-style-guide

The difference between Kotlin’s functions: ‘let’, ‘apply’, ‘with’, ‘run’ and ‘also’

Quero deixar aqui meus agradecimentos ao Filipe Marques, por ser um dos culpados por estar, pacientemente, me doutrinando em Kotlin 🙂

E você, o que mais amou em Kotlin?

Siga a tag codelikeagirlBR para ver nossos posts! 😀

Quer escrever ou traduzir artigos em português para a Code Like A Girl? Se você já faz parte do time de escritoras(es) da Code Like A Girl basta enviar seu artigo diretamente para nossa publicação. Se você ainda não faz parte do nosso time, envie uma mensagem direta para a conta de twitter CodeLikeAGirlBr. Nós avaliaremos seu artigo e ajudaremos a refiná-lo para publicação.