Em Kotlin, seguir as convenções de codificação é essencial para garantir legibilidade e consistência. Elas também facilitam a colaboração em equipe e a manutenção de código. Aqui estão algumas recomendações atualizadas e expandidas baseadas nas melhores práticas da linguagem.
Prefira camelCase para nomes de variáveis e funções, iniciando com letra minúscula. Use nomes descritivos e claros. Evite acrônimos e abreviações não significativas.
val userAge = 25
fun calculateAverage(scores: List<Double>): Double {
// ...
}
Classes e tipos devem usar UpperCamelCase. Evite acrônimos e abreviações não significativas.
class Person {
// ...
}
typealias NameList = List<String>
Utilize 4 espaços para indentar seu código. Use uma linha em branco entre funções e blocos de código.
fun calculateAverage(scores: List<Double>): Double {
var sum = 0.0
for (score in scores) {
sum += score
}
return sum / scores.size
}
Constantes devem ser nomeadas em maiúsculas, com palavras separadas por sublinhados.
const val MAX_SIZE = 100
Evite o uso de importações curinga (*
). Prefira importar apenas as classes que realmente serão utilizadas para
evitar
ambiguidade e melhorar a legibilidade.
Exemplo de má prática (usando importação curinga):
import kotlin.math.*
import java.util.*
-
Não está claro quais funções ou classes estão sendo utilizadas a partir de cada pacote.
-
Pode causar conflitos de nomes ou comportamentos inesperados, especialmente em pacotes grandes.
-
Compilação mais lenta, já que o compilador precisa resolver todas as classes e funções do pacote, mesmo que você não as use.
Exemplo de boa prática (importando apenas o necessário):import kotlin.math.sqrt import kotlin.math.pow import java.util.Date import java.util.Calendar
-
Fica explícito o que está sendo utilizado, facilitando a compreensão do código.
-
Evita a inclusão desnecessária de classes, tornando o código mais eficiente e fácil de manter.
Use try-catch-finally
para capturar exceções. Evite capturar exceções genéricas como Exception
se puder capturar
exceções mais específicas.
try {
// Executa o código que pode lançar exceções.
} catch (exception: IOException) {
// Tratamento específico para IOException.
} finally {
// Bloco finally, executado sempre, com ou sem exceção.
}
Respeite a ordem: primeiro parâmetros obrigatórios, depois os opcionais.
Use modificadores em uma ordem lógica. Por exemplo, public
sempre vem primeiro.
fun exampleFunction(required: String, optional: Int = 0): Unit {
// ...
}
Prefira passar lambdas fora dos parênteses quando a última função de uma chamada for um lambda.
list.filter { it > 10 }
Use espaço ao redor das chaves de um lambda e ao redor da seta que separa parâmetros do corpo da função.
val sum = { firstNumber: Int, secondNumber: Int -> firstNumber + secondNumber }
Sempre utilize chaves em estruturas de controle, mesmo para blocos de uma linha, para evitar erros.
if (number > 0) {
println("Número positivo")
} else {
println("Número negativo")
}
Prefira funções de expressão única quando possível:
fun isEven(number: Int): Boolean = number % 2 == 0
Para propriedades simples, use get
e set
em uma linha:
val isEmpty: Boolean get() = size == 0
Ir para o início.