Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
November 21, 2021 09:41 pm GMT

5 dicas e um bnus para deixar seu cdigo Kotlin melhor

Kotlinautas

Esse contedo oferecido e distribudo pela comunidade Kotlinautas, uma comunidade brasileira que busca oferecer contedo gratuito sobre a linguagem Kotlin em um espao plural.

capa Kotlinautas

Crditos

Esse artigo foi baseado principalmente nesses slides do Anton Arhipov.

O qu Kotlin Ideomtico?

Kotlin Ideomtico uma maneira de escrever Kotlin tentando seguir os melhores padres e funcionalidades da linguagem. Buscando tornar o cdigo mais legvel e menor.

H uma pgina oficial da documentao do Kotlin apenas para listar diversas formas ideomticas de fazer coisas. Caso saiba um pouco de ingls, interessante ler esse documento. Neste artigo vamos abordar apenas algumas formas ideomticas de se usar Kotlin, mas nessa pgina h uma quantidade bem maior.

Criando funes sem classes

Muitas pessoas que migram do Java para o Kotlin, continuam com o costume de criar uma classe toda vez que precisarem criar uma ou mais funes, mas isso no necessrio no Kotlin, pois podemos criar funes sem precisar de uma classe associada, dessa maneira:

fun main(){  olaMundo()}fun olaMundo(){  println("Ol Mundo!")}
  • Criamos uma funo olaMundo, que mostra o texto Ol Mundo! na tela;
  • Chamamos essa funo dentro da main;

Extenses

Sabe aquelas funes .toInt, .equals,etc. que podemos usar em tipos do Kotlin? Podemos adicionar novas funes completamente feitas por ns esses tipos, usando as extenses.

Vamos supor que voc quer criar uma funo chamada Numero que ir checar se uma string um nmero ou no. Essa funo seria executada da seguinte forma:

"isso no  um nmero".Numero"10".Numero

Isso pode ser feito criando a funo Numero dessa maneira:

fun String.Numero() = all { it.isDigit() }
  • Passamos o tipo, no caso String, seguido de um . e o nome da funo, que no caso Numero;
  • A funo all ir testar se todos os caracteres do texto conseguem passar de uma certa condio, que no caso se esse caractere um dgito usando a funo isDigit;

Aps isso, podemos utilizar essa funo em qualquer lugar do nosso cdigo:

fun main(){    println("10".Numero())    println("abracadabra".Numero())}

Funes de escopo

Funes de escopo so funes axuliares que executam um cdigo com o contexto de um objeto. Isso significa que essas funes criam um escopo temporrio, onde poderemos usar todas as propriedades de um objeto sem precisar informar esse projeto. Caso tenha tido alguma confuso, vamos ver na prtica.

Vamos supor que temos uma classe Estrela, com as propriedades nome, dimetro, dessa maneira:

data class Estrela(    var nome: String = "",    var dimetro: Int = 0,    var numeroDePlanetas: Int = 0,)

Podemos criar uma varivel que guarde uma instncia, e mudar as propriedades dessa varivel. Dessa maneira:

val sol = Estrela()sol.nome = "sol"sol.dimetro = 1392700sol.numeroDePlanetas = 8

Esse cdigo ir funcionar, mas no est sendo ideomtico, pois estamos repetindo a varivel sol diversas vezes. Podemos escrever esse cdigo de uma maneira mais bonita como no exemplo abaixo:

    val sol = Estrela().apply {        nome = "sol"        dimetro = 1392700        numeroDePlanetas = 8    }
  • Usamos a funo apply do Kotlin, que ir receber um objeto (no caso uma instncia de Estrela) e ir fazer alteraes com esse objeto em seu contexto. No caso, definindo valores de propriedades.

Dessa maneira, nosso cdigo estar mais consiso, legvel, e ideomtico.

H outras funes de escopo, essas outras funes podem ser vistas Nessa pgina da documentao do Kotlin

Argumentos Padro e Argumentos Nomeados

Vamos supor que temos a seguinte funo:

fun saudaes(nome: String, momento: String){    println("Ol $nome! $momento")}

Essa funo est recebendo um nome, como Pedro ou Maria, e momento recebe uma saudao do dia, como boa tarde ou boa noite.

Mas vamos pensar: Na maior parte das vezes, damos bom dia para as pessoas, e menos vezes damos boa tarde ou boa noite.

Logo, podemos mudar a funo e fazer que esse momento tenha um valor padro usando um = depois de seu tipo.

fun saudaes(nome: String, momento: String = "Bom Dia!"){    println("Ol $nome! $momento")}

E alm, e se essa pessoa no quiser passar seu nome? Podemos deixar Pessoa Annima como valor padro, da mesma forma que dizemos com momento. Dessa maneira:

fun saudaes(nome: String = "Pessoa Annima", momento: String = "Bom Dia!"){    println("Ol $nome! $momento")}

Com isso, podemos chamar essa funo saudaes de algumas formas:

fun main(){    saudaes()    saudaes("Maria")    saudaes("Pedro", "Boa Noite!")}

Resultado:

Ol Pessoa Annima! Bom Dia!Ol Maria! Bom Dia!Ol Pedro! Boa Noite!

E se eu quiser deixar o argumento nome padro, e mudar s a mensagem?

Isso pode ser feito nomeando o argumento momento na chamada, dessa maneira:

fun main(){    saudaes(momento = "Boa Tarde!")}

Resultado:

Ol Pessoa Annima! Boa Tarde!

Funes de nica expresso

Vamos supor que temos uma funo testarTemperatura que recebe uma temperatura em String e diz se possvel tomar uma bebida nessa temperatura ou no:

fun testarTemperatura(temperatura: String): String{    when(temperatura){        "quente" -> return "Quente demais para beber"        "frio" ->  return "Temperatura boa para beber"        else -> return "Preciso deixar um pouco na geladeira"    }}

Essa funo tem apenas uma nica expresso, um nico comando em seu corpo. logo, podemos simplificar essa funo, removendo seu corpo e seu retorno e adicionando um = seguido pela expresso.

Dessa maneira, nossa funo ficar assim:

fun testarTemperatura(temperatura: String) = when(temperatura){        "quente" -> "Quente demais para beber"        "frio" ->  "Temperatura boa para beber"        else -> "Preciso deixar um pouco na geladeira"}

Dessa maneira, nossa funo ficar bem menor, consisa e legvel, essas so as funes de nica expresso, a mesma coisa que fizemos com o when pode ser feita com if, try,etc.

Operador Elvis

Vamos supor que temos uma classe Cachorro, essa toda instncia de Cachorro tem um nome, raa (que pode ser null caso esse cachorro seja vira-lata) e uma propriedade educado. Dessa maneira:

class Cachorro(    val nome: String,    val raa: String?,    val educado: Boolean,)

Junto com essa classe, temos uma funo apresentarCachorro que ir receber uma instncia dessa classe Cachorro, e caso esse cachorro seja de raa, e a sua raa no seja null, o seu nome e raa sero mostrados na tela jutn ocom uma mensagem. Normalmente, fariamos dessa maneira:

fun apresentarCachorro(cachorro: Cachorro){    if (cachorro.raa == null){        return    }    val raa = cachorro.raa    val nome = cachorro.nome    if (cachorro.educado){        println("Au Au Au, meu nome  $nome e sou da raa $raa, Au Au Au")    }}

Esse cdigo pode ser melhorado. Podemos remover o primeiro if que testa se a raa do cachorro null ou no. Podemos colocar esse teste direto na definio da varivel raa, dessa maneira:

fun apresentarCachorro(cachorro: Cachorro){    val raa = cachorro.raa ?: return    val nome = cachorro.nome    if (cachorro.educado){        println("Au Au Au, meu nome  $nome e sou da raa $raa, Au Au Au")    }}

No cdigo acima, usamos o operador Elvis (?:), onde se o valor da esquerda for null, o cdigo da direita ser executado. No caso, o return que ir fechar a funo sem nenhum contedo no retorno.

Finalizao

Nesse artigo, voc aprendeu 6 dicas de como deixar o seu cdigo Kotlin mais ideomtico, consiso e legvel. Busque aplicar os conceitos mostrados nesse artigo (e em outros sobre Kotlin Ideomtico que podem existir) em seus projetos, pois assim seu cdigo ficar bem melhor.

Obrigado por ler


Original Link: https://dev.to/kotlinautas/5-dicas-e-um-bonus-para-deixar-seu-codigo-kotlin-melhor-48el

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To