Clean Code em Kotlin: princípios e exemplos para iniciantes
Código limpo (Clean Code) não é apenas um termo da moda, mas uma habilidade fundamental de qualquer desenvolvedor. Na linguagem Kotlin, que combina concisão e poder, escrever código legível e sustentável torna-se especialmente importante. Neste artigo, vamos analisar os principais princípios do Clean Code aplicados ao Kotlin, fornecer exemplos práticos e mostrar como evitar erros típicos. O material é voltado para desenvolvedores iniciantes que desejam escrever código profissional desde o primeiro dia.
1. Nomenclatura de variáveis, funções e classes
A nomenclatura correta é a base do código limpo. O nome deve responder às perguntas: "O que é isso?" e "Para que serve?". Em Kotlin, adota-se camelCase para variáveis e funções, e PascalCase para classes e objetos.
Exemplo ruim:
val x = 5fun calc(a: Int, b: Int): Int { return a * b + 10}Exemplo bom:
val maxRetryCount = 5fun calculateTotalPrice(basePrice: Int, tax: Int): Int { return basePrice + tax}Regras principais:
- Evite abreviações —
usré melhor substituir poruser, ecalcporcalculate. - Use verbos para funções —
getUser(),sendEmail(),validateInput(). - Variáveis booleanas nomeie com os prefixos
is,has,can—isActive,hasPermission. - Evite informações excessivas —
userListé melhor quelistOfUsersFromDatabase.
2. Princípios SOLID em Kotlin
SOLID são cinco princípios da programação orientada a objetos que ajudam a criar sistemas flexíveis e facilmente sustentáveis. Vamos analisá-los com exemplos em Kotlin.
Single Responsibility (responsabilidade única)
Uma classe deve ter apenas um motivo para mudar. Separe a lógica em classes pequenas e especializadas.
Exemplo ruim:
class UserManager { fun saveUser(user: User) { /* salvar no BD */ } fun sendEmail(user: User) { /* enviar e-mail */ } fun printReport(user: User) { /* imprimir relatório */ }}Exemplo bom:
class UserRepository { fun save(user: User) { /* salvar no BD */ }}
class EmailService { fun send(user: User) { /* enviar e-mail */ }}
class ReportPrinter { fun print(user: User) { /* imprimir relatório */ }}Open/Closed (aberto/fechado)
As classes devem estar abertas para extensão, mas fechadas para modificação. Use interfaces e herança.
interface Shape { fun area(): Double}
class Circle(val radius: Double) : Shape { override fun area() = Math.PI * radius * radius}
class Rectangle(val width: Double, val height: Double) : Shape { override fun area() = width * height}
// Agora é possível adicionar novas formas sem alterar o código existenteLiskov Substitution (substituição de Liskov)
Objetos de subclasses devem substituir objetos da classe base sem violar a lógica. Em Kotlin, isso é especialmente relevante ao trabalhar com coleções e herança.
open class Bird { open fun fly() = "Está voando"}
class Penguin : Bird() { override fun fly() = throw UnsupportedOperationException("Pinguins não voam")}// Isso viola o princípio — é melhor colocar a "capacidade de voar" em uma interface separada3. Trabalhando com funções: concisão e clareza
Kotlin oferece ferramentas poderosas para escrever funções limpas. Regras principais:
Blogs
Book Recommendations
Leia também
Métodos de Strings em Python: split, join, replace, strip e mais