Clean Code em Zig — Princípios e Práticas
Zig valoriza explicitação e simplicidade. “Sem mágica” é um princípio fundamental da linguagem. Clean code em Zig significa escrever código que é claro, previsível e fácil de raciocinar.
Nomes Descritivos
// RUIM
fn proc(d: []u8, n: usize) !void { ... }
// BOM
fn processarPacoteRede(buffer: []u8, tamanho_max: usize) !void { ... }
// RUIM
const x = try a.alloc(u8, 1024);
// BOM
const buffer_leitura = try allocator.alloc(u8, TAMANHO_BUFFER_LEITURA);
Funções Pequenas e Focadas
// RUIM: função faz tudo
fn processarRequisicao(req: *Request) !void {
// 200 linhas de validação, parsing, lógica e resposta
}
// BOM: responsabilidades separadas
fn processarRequisicao(req: *Request) !Response {
const dados = try validarEntrada(req);
const resultado = try executarLogica(dados);
return formatarResposta(resultado);
}
fn validarEntrada(req: *Request) !DadosValidados {
if (req.body.len == 0) return error.BodyVazio;
if (req.body.len > MAX_BODY) return error.BodyGrande;
return try parsearJson(req.body);
}
Usar Tipos para Expressar Intenção
// RUIM: tipos genéricos não comunicam intenção
fn criarUsuario(nome: []const u8, idade: u32, ativo: bool) !void { ... }
// BOM: tipos específicos documentam o domínio
const Nome = struct {
valor: []const u8,
pub fn validar(str: []const u8) !Nome {
if (str.len == 0) return error.NomeVazio;
if (str.len > 100) return error.NomeLongo;
return .{ .valor = str };
}
};
const Idade = struct {
valor: u8,
pub fn validar(n: u32) !Idade {
if (n > 150) return error.IdadeInvalida;
return .{ .valor = @intCast(n) };
}
};
fn criarUsuario(nome: Nome, idade: Idade) !Usuario { ... }
Evitar Código Morto
// O compilador Zig ajuda: código unreachable é erro de compilação
fn processar(valor: u8) u8 {
return switch (valor) {
0...127 => valor * 2,
128...255 => valor - 128,
// Sem else necessário — todos os valores de u8 cobertos
};
}
Documentação Integrada
/// Calcula o hash SHA-256 de um bloco de dados.
///
/// O resultado é um array de 32 bytes representando o digest.
/// Esta função é thread-safe e não faz alocações de memória.
///
/// ## Exemplo
/// ```zig
/// const hash = calcularHash("dados de entrada");
/// ```
pub fn calcularHash(dados: []const u8) [32]u8 {
var h = std.crypto.hash.sha2.Sha256.init(.{});
h.update(dados);
return h.finalResult();
}
Conclusão
Clean code em Zig começa com os princípios da linguagem: explícito sobre implícito, simples sobre complexo, sem mágica. Nomes descritivos, funções focadas, tipos expressivos e documentação clara são as ferramentas fundamentais.
Conteúdo Relacionado
- Checklist de Code Review — Revisão de código
- Error Handling — Erros idiomáticos
- Design Patterns em Zig — Padrões de projeto
- Testes em Zig — Testes unitários
- Ferramentas de Desenvolvimento — Tooling