Boas Práticas e Padrões Idiomáticos em Go e C

Nem sempre boas práticas são consideradas design patterns formais. Porém, quando uma técnica se torna a única forma eficaz de resolver problemas recorrentes, ela deixa de ser apenas "higiene de código" e passa a funcionar como um padrão idiomático da linguagem.

Este documento explora como structs, composição e interfaces em Go (e até em C) podem ser vistos como soluções de design aplicando esses princípios para um bom código. O texto começa explicando o uso em C de ponteiros e faz uma analogia sobre injeção de código de POO. Este documento tem por objetivo de tornar um dia um desgin para GO ou até C, QUE SÃO PROCEDURAIS. É um exemplo onde você não resolve bem uma questão sem esse principio de que se você não usar, você não resolve da melhor maneira. O documento é trabalhado nas fases seguintes com o argumento de porque usar ou não usar para justificar um design.

[ Hits: 133 ]

Por: trogmaiu em 25/03/2026


EXPLICAÇÃO 2



Perfeito, vamos organizar isso em partes, como você pediu, para construir uma espécie de "manual de design" para Go inspirado em princípios como o SOLID, mas adaptado ao estilo da linguagem.
Go não é orientado a objetos clássico, mas oferece structs, interfaces e composição como mecanismos centrais de organização. A ideia é mostrar:
1. Por que usar cada recurso.
2. O que dá errado se não usar.
3. Qual a analogia com princípios de design (como SOLID).

Parte 1 - Structs
Por que usar
- Agrupam dados relacionados em uma entidade lógica.
- Permitem associar métodos, dando clareza sem precisar de classes.
- Reduzem a quantidade de parâmetros soltos em funções.
- Facilitam a manutenção: se a estrutura muda, você altera em um só lugar.

O que dá errado se não usar
- Código fragmentado, difícil de entender.
- Funções com listas enormes de parâmetros.
- Maior risco de inconsistência (variáveis soltas sem relação clara).

Analogia com SOLID
- Relaciona-se ao Single Responsibility Principle (SRP): um struct bem definido deve ter uma responsabilidade clara.
- Exemplo: um User struct deve cuidar apenas de dados de usuário, não de lógica de autenticação.

Parte 2 - Interfaces
Por que usar
- Permitem abstração de comportamento sem acoplamento rígido.
- Facilitam testes (mockar implementações).
- Tornam o código extensível sem precisar alterar o que já existe.
- Em Go, interfaces são implícitas: qualquer tipo que implemente os métodos é compatível.
O que dá errado se não usar
- Funções e módulos ficam dependentes de implementações concretas.
- Dificulta substituição ou evolução de código.
- Testes ficam mais complexos, pois não há como simular comportamentos.
Analogia com SOLID
- Relaciona-se ao Dependency Inversion Principle (DIP): módulos devem depender de abstrações, não de implementações.
- Também ao Interface Segregation Principle (ISP): interfaces pequenas e específicas são melhores do que interfaces grandes e genéricas.

Parte 3 - Composição
Por que usar
- Go não tem herança, mas composição permite reutilizar código.
- Promove flexibilidade: você combina comportamentos em vez de criar hierarquias rígidas.
- Evita acoplamento excessivo.

O que dá errado se não usar
- Você pode acabar duplicando código.
- Ou tentar simular herança com hacks, o que vai contra o estilo da linguagem.
- Estruturas ficam menos reutilizáveis.

Analogia com SOLID
- Relaciona-se ao Open/Closed Principle (OCP): composição permite estender funcionalidades sem modificar código existente.
- Também ao Liskov Substitution Principle (LSP): em Go, substituibilidade é alcançada via interfaces + composição, não herança.

Figura 2
Resumo da analogia Go <> SOLID
Minha proposta: começamos detalhando structs com exemplos práticos de bom uso e mau uso. Depois seguimos para interfaces e composição. Assim você terá um guia claro mostrando o motivo de usar e o que dá errado se não usar.
Quer que eu já monte os exemplos de structs em Go (um caso bem feito e um caso mal feito) para abrir a primeira parte?

O Copilot disse:
Entendi perfeitamente: você quer construir uma espécie de guia de design para Go, inspirado em princípios como o SOLID, mas adaptado ao estilo da linguagem (que é procedural, mas com recursos como struct, interface e composição). A ideia é mostrar por que usar cada recurso, o que dá errado se não usar, e como isso se conecta a boas práticas de design.
Vamos organizar isso em partes, como você pediu.

,Parte 1 - Structs
Por que usar
- Agrupamento lógico: junta dados relacionados em uma única entidade.
- Clareza: evita funções com listas enormes de parâmetros soltos.
- Extensibilidade: permite adicionar métodos associados sem precisar de classes.
- Manutenção: se a estrutura muda, você altera em um só lugar.
O que dá errado se não usar
- Código fragmentado e difícil de entender.
- Funções com muitos parâmetros, aumentando risco de erro.
- Dados sem relação clara, dificultando evolução.
Analogia com SOLID
- Relaciona-se ao Single Responsibility Principle (SRP): um struct deve ter uma responsabilidade clara.
- Exemplo: User deve conter apenas dados de usuário, não lógica de autenticação.

Parte 2 - Interfaces
Por que usar
- Abstração: permite definir comportamentos sem acoplamento rígido.
- Testabilidade: facilita criar mocks e simulações.
- Flexibilidade: qualquer tipo que implemente os métodos é compatível (interfaces implícitas).
O que dá errado se não usar
- Código dependente de implementações concretas.
- Dificuldade em substituir ou evoluir módulos.
- Testes mais complexos, sem possibilidade de simulação.

Analogia com SOLID
- Relaciona-se ao Dependency Inversion Principle (DIP): módulos devem depender de abstrações.
- Também ao Interface Segregation Principle (ISP): interfaces pequenas e específicas são melhores.

Parte 3 - Composição
Por que usar
- Reuso: Go não tem herança, mas composição permite combinar comportamentos.
- Flexibilidade: evita hierarquias rígidas, promove código mais modular.
- Estilo Go: segue a filosofia da linguagem de preferir composição a herança.
O que dá errado se não usar
• Duplicação de código.
- Tentativas de simular herança com hacks (anti-padrão em Go).
- Estruturas menos reutilizáveis e mais acopladas.
Analogia com SOLID
- Relaciona-se ao Open/Closed Principle (OCP): composição permite estender sem modificar código existente.
- Também ao Liskov Substitution Principle (LSP): em Go, substituibilidade é alcançada via interfaces + composição.

Figura 3
Resumo da analogia Go <> SOLID
Página anterior     Próxima página

Páginas do artigo
   1. Boas Práticas e Padrões Idiomáticos em Go e C
   2. EXPLICAÇÃO 1
   3. EXPLICAÇÃO 2
   4. EXPLICAÇÃO 3
   5. CONCLUSÃO
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Projeto Icecream (parte 1)

Tratamento de exceções na linguagem C

lib cURL - Trabalhe com URLs em C

Instalando Facebook Folly através do Conan

Como funcionam os alocadores de memória do STD C?

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts