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: 116 ]

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

Acessando a porta paralela via Linux

Programação com números inteiros gigantes

Dynamic libraries com libtool

Projeto Icecream (parte 1)

A mágica do polimorfismo e seus conceitos na ótica de C/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