An Interest In:
Web News this Week
- April 25, 2024
- April 24, 2024
- April 23, 2024
- April 22, 2024
- April 21, 2024
- April 20, 2024
- April 19, 2024
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.
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 textoOl 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 casoNumero
; - 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 funoisDigit
;
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 deEstrela
) 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
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To