Lição 5: Modelagem de domínio com struct e enum

Um domínio real tem estados que não devem ser confundidos: uma conta pode ser individual, conjunta ou encerrada. struct agrupa dados; enum descreve alternativas; match força o código a tratar cada variante.

Objetivo

Em uma frase: criar dados compostos e destrinchá-los de forma exaustiva e segura.

Código

struct Usuario {
    nome: str
    saldo: int
}

enum Conta {
    Individual(Usuario),
    Conjunta(Usuario, Usuario),
    Encerrada,
}

enum com dados embutidos permite representar variações de forma limpa. Vamos desestruturar com match:

public func descrever(conta: ref Conta): str {
    return match conta {
        Conta.Individual(u) => "Individual de " + u.nome,
        Conta.Conjunta(u1, u2) => "Conjunta de " + u1.nome + " e " + u2.nome,
        Conta.Encerrada => "Encerrada",
    }
}

Experimente

Remova o caso .Encerrada do match. O compilador acusa o problema: o match não cobre todos os casos. Exaustividade garantida em tempo de compilação.

Garantia

Esse é o compilador evitando um bug clássico: adicionar uma variante a um enum e esquecer de tratá-la em algum lugar. Sem match exaustivo, isso passaria despercebido.

Com struct, enum e match, você modela domínios complexos e transforma uma regra de exaustividade em garantia de compilação. Se o domínio mudar, o compilador aponta os lugares que precisam acompanhar a mudança.

Próximos passos

Você já viu os pilares. Para consultar tipos, operadores e a gramática completa, veja a reference.