Pular para o conteúdo
Skillpedia
Código em geral280 mil · #71

kotlin-patterns

Ajuda seu agente a escrever código Kotlin seguindo as melhores práticas. Garante que o código seja robusto, eficiente e fácil de manter, usando recursos modernos da linguagem.

O que ela faz

Esta ferramenta ajuda a escrever código na linguagem de programação Kotlin seguindo as melhores práticas. Ela garante que seu código seja fácil de entender, eficiente e menos propenso a erros.

Quando usar

  • ✓Ao escrever código novo em Kotlin.
  • ✓Ao revisar o código de outra pessoa.
  • ✓Ao organizar ou melhorar código existente.

Exemplo do que pedir para a IA

“Como posso garantir que meu código Kotlin lide corretamente com valores que podem ser nulos?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/kotlin-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/kotlin-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

A ferramenta verifica se você está usando recursos do Kotlin como 'null safety' (para evitar erros com valores ausentes) e 'immutability' (para tornar os dados mais seguros). Ela também sugere formas mais eficientes de organizar seu código.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill kotlin-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/kotlin-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Desenvolvimento em Kotlin

Padrões idiomáticos e melhores práticas em Kotlin para construir aplicações robustas, eficientes e fáceis de manter.

Quando Usar

  • Escrever código Kotlin novo
  • Revisar código Kotlin
  • Refatorar código Kotlin existente
  • Projetar módulos ou bibliotecas Kotlin
  • Configurar builds com Gradle Kotlin DSL

Como Funciona

Esta habilidade reforça convenções idiomáticas de Kotlin em sete áreas principais: segurança contra nulos usando o sistema de tipos e operadores de chamada segura, imutabilidade via val e copy() em classes de dados, classes seladas e interfaces para hierarquias de tipos exaustivas, concorrência estruturada com corrotinas e Flow, funções de extensão para adicionar comportamento sem herança, construtores de DSL type-safe usando @DslMarker e receptores de lambda, e Gradle Kotlin DSL para configuração de build.

Exemplos

Segurança contra nulos com operador Elvis:

fun getUserEmail(userId: String): String {
    val user = userRepository.findById(userId)
    return user?.email ?: "unknown@example.com"
}

Classe selada para resultados exaustivos:

sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Failure(val error: AppError) : Result<Nothing>()
    data object Loading : Result<Nothing>()
}

Concorrência estruturada com async/await:

suspend fun fetchUserWithPosts(userId: String): UserProfile =
    coroutineScope {
        val user = async { userService.getUser(userId) }
        val posts = async { postService.getUserPosts(userId) }
        UserProfile(user = user.await(), posts = posts.await())
    }

Princípios Fundamentais

1. Segurança Contra Nulos

O sistema de tipos do Kotlin distingue tipos anuláveis e não anuláveis. Aproveite-o ao máximo.

// Good: Use non-nullable types by default
fun getUser(id: String): User {
    return userRepository.findById(id)
        ?: throw UserNotFoundException("User $id not found")
}

// Good: Safe calls and Elvis operator
fun getUserEmail(userId: String): String {
    val user = userRepository.findById(userId)
    return user?.email ?: "unknown@example.com"
}

// Bad: Force-unwrapping nullable types
fun getUserEmail(userId: String): String {
    val user = userRepository.findById(userId)
    return user!!.email // Throws NPE if null
}

2. Imutabilidade por Padrão

Prefira val em vez de var, coleções imutáveis em vez de mutáveis.

// Good: Immutable data
data class User(
    val id: String,
    val name: String,
    val email: String,
)

// Good: Transform with copy()
fun updateEmail(user: User, newEmail: String): User =
    user.copy(email = newEmail)

// Good: Immutable collections
val users: List<User> = listOf(user1, user2)
val filtered = users.filter { it.email.isNotBlank() }

// Bad: Mutable state
var currentUser: User? = null // Avoid mutable global state
val mutableUsers = mutableListOf<User>() // Avoid unless truly needed

3. Corpos de Expressão e Funções de Expressão Única

Use corpos de expressão para funções concisas e legíveis.

// Good: Expression body
fun isAdult(age: Int): Boolean = age >= 18

fun formatFullName(first: String, last: String): String =
    "$first $last".trim()

fun User.displayName(): String =
    name.ifBlank { email.substringBefore('@') }

// Good: When as expression
fun statusMessage(code: Int): String = when (code) {
    200 -> "OK"
    404 -> "Not Found"
    500 -> "Internal Server Error"
    else -> "Unknown status: $code"
}

// Bad: Unnecessary block body
fun isAdult(age: Int): Boolean {
    return age >= 18
}

4. Classes de Dados para Objetos de Valor

Use classes de dados para tipos que primariamente contêm dados.

// Good: Data class with copy, equals, hashCode, toString
data class CreateUserRequest(
    val name: String,
    val email: String,
    val role: Role = Role.USER,
)

// Good: Value class for type safety (zero overhead at runtime)
@JvmInline
value class UserId(val value: String) {
    init {
        require(value.isNotBlank()) { "UserId cannot be blank" }
    }
}

@JvmInline
value class Email(val value: String) {
    init {
        require('@' in value) { "Invalid email: $value" }
    }
}

fun getUser(id: UserId): User = userRepository.findById(id)

Classes e Interfaces Seladas

Modelando Hierarquias Restritas

// Bom: Classe selada para when exaustivo
sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Failure(val error: AppError) : Result<Nothing>()

…
Perguntas frequentes

O que é 'null safety'?

É uma forma que o Kotlin tem de garantir que você não terá erros inesperados quando um valor deveria existir, mas não existe (é nulo).

O que é 'immutability'?

Significa que os dados, uma vez criados, não podem ser alterados. Isso torna o código mais previsível e seguro.

O que são 'data classes'?

São um tipo especial de classe no Kotlin que serve para guardar dados de forma simples e organizada, gerando automaticamente funções úteis como comparação e exibição.

Detalhes

Descrição original do autor

Idiomatic Kotlin patterns, best practices, and conventions for building robust, efficient, and maintainable Kotlin applications with coroutines, null safety, and DSL builders. Use when writing or reviewing Kotlin code and idiomatic structure or null safety is in question.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#71
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas