Boas Práticas de Traits & Generics
Como Usar Esta Lista
- Aplique ao projetar traits e limites genéricos de bibliotecas públicas.
- Revise antes de adicionar
dyn Traitou implementações blanket (impl).
A - Design de Traits
- Mantenha os traits focados (responsabilidade única). Divida traits de leitura/escrita quando necessário.
- Prefira tipos associados para uma saída por impl. Evite parâmetros genéricos redundantes.
- Documente a segurança de objeto (
object safety) e as expectativas deSend/Sync. Os consumidores precisam de clareza nos limites (bounds). - Sele (
seal) traits que não são para impl externa. Padrão depub traitem módulo privado. - Use métodos padrão (
default methods) para lógica compartilhada. Reduza o boilerplate deimpl.
B - Generics e Limites (Bounds)
- Prefira cláusulas
wherepara limites complexos. Assinaturas legíveis. - Use
impl Traitem parâmetros para limites simples e únicos. Menos ruído. - Padrão para despacho estático (
static dispatch) em caminhos críticos (hot paths). Perfis antes de usardyn. - Evite gatilhos de lint de complexidade de tipo. Use aliases de tipo para limites longos.
- Consciência de monomorfização para tamanho de binário. Apagamento de tipo nas bordas.
C - Coerência e Órfãos (Orphans)
- Use
Newtypepara implementar traits locais em tipos estrangeiros. Conformidade com a regra do órfão. - Evite implementações blanket (
blanket impls) sobrepostas. Conflitos de coerência são dolorosos. - Altere implementações blanket (
blanket impls) de Semver com cuidado. Pode quebrar implementações downstream. - Use traits de extensão (
extension traits) em módulos separados. Superfície de API clara. - Teste padrões órfãos em CI para bibliotecas. Evite conflitos acidentais.
D - Ergonomia
- Forneça
From/Into/Defaultquando natural. Construtores idiomáticos. - Implemente
Debugem tipos públicos. Suportabilidade. - Use
Displaypara strings voltadas ao usuário, nãoDebug. Qualidade de log. - Prefira
AsRef/Borrownas bordas para strings/caminhos. Entradas flexíveis. - Documente o contrato do trait (leis) na documentação. Ex: reflexividade de
Eq, transitividade deOrd.
FAQs
Trait vs método inerente?
Trait para polimorfismo/contrato compartilhado; inerente para específico do tipo.Quantos traits por tipo?
Conforme necessário - evite traits "deuses" (`god traits`).dyn em API pública?
OK na fronteira do plugin; documente as necessidades de `Send`.GAT quando?
Iteradores emprestáveis (`lending iterators`) e padrões de streaming.async trait?
Use `async fn` nativo em traits conforme a documentação da edição.Testando traits?
Tipos mock que implementam o trait em testes.Verificação rápida de segurança de objeto (`object safety`)?
Sem retorno `Self`, sem métodos genéricos no trait.Aliases de trait?
Simplifique grupos de limites: `trait SerializeMap = ...`.no_std traits?
`core` espelha muitos traits de `std`.Próximo?
Tratamento de erros com `Result` e `?`.Relacionados
- Noções Básicas de Traits
- Objetos de Trait & Despacho Dinâmico
- Implementações Blanket & Condicionais
- Abstração Baseada em Trait na Arquitetura
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.