Clean Code em Zig — Princípios e Práticas

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

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.