Esse é o segundo post de uma série de posts que começou aqui baseado numa palestra dada sobre Go e Clean Code(slides aqui)

Agora vou falar sobre nomes de pacotes e como escolher nomes de pacotes em Go.

Primeiro de tudo, pacotes em Go é como o código Go é organizado. É similar a um módulo Python e basicamente o mesmo do que um pacote Java, um namespace em C# ou a um componente JavaScript. É uma pasta contendo código que, numa boa arquitetura de software, compartilham coisas em comum.

Os guidelines dados pelo Effective Go sobre nomear pacotes são bem bons - no fim das contas, o principal é que você deve:

  1. Mantê-los pequenos e concisos (e não se preocupar com colisões de nomes).
  2. Escolher um nome que é bom o suficiente pra dar contexto para suas Interfaces, Structs e Functions exportadas (portanto, públicas).

O primeiro ponto é focado na facilidade de leitura do nome do seu pacote. Colisões de nome raramente acontecem e quando acontecer, quem está importando o pacote pode tomar uma decisão de alterar a referência do pacote importado, como no exemplo abaixo. Não é responsabilidade de um pacote evitar colisões de nome, e sim de quem importa ele.

199
import mylogger "log"

O segundo ponto fica mais claro quando você vê a implementação da interface Reader em vários pacotes:

199
200
201
202
203
204
205
import "io"
import "bufio"
import "bytes"

var reader *io.Reader
var bufreader *bufio.Reader
var bytesreader *bytes.Reader

Em todos os três casos, o tipo é Reader e o nome do pacote é pequeno, conciso o suficiente e dá contexto sobre o conteúdo do pacote.

Quando a biblioteca do Go ganhou uma implementação de uma lista circular (ou anel), ela ganhou um pacote chamado ring. Inicializar uma nova lista circular é apenas chamar ring.New(). Normalmente, constructors em Go tem essa cara.

199
200
import "ring"
ring := ring.New()

Bons nomes de pacotes são muito importantes para escrever um código limpo e fácil de ler. Esse post sobre nomes de pacotes em Go também é essencial.

É basicamente isso que eu queria dividir :) Sugiro ler as referências, também!

Cool reference links

Past Posts