Dando continuidade na série sobre SOLID, nesse post vamos falar um pouco sobre Interface Segregation. Esse princípio talvez seja o mais utilizado na linguagem. Digo isso pois ele é fortemente utilizado nos packages core do Go, como por exemplo o package io
.
Antes de continuar, se você chegou por aqui agora e ainda não viu os outros posts da série, convido-o a dar uma olhada.
Voltando à esse post, vamos relembrar o que diz o conceito de Interface Segregation.
💡 Uma classe não deve ser obrigada a implementar interfaces e métodos que não utilizará. Em outras palavras, é melhor ter 6 interfaces bem específicas, do que 2 mais genéricas.
Embora Go não implemente orientação a objetos, Interface Segregation pode ser aplicado na linguagem sem problemas. Isso devido a forma como structs e interfaces funcionam na linguagem.
Para ter uma idéia mais clara de como utilizar esse conceito, vamos nos aprofundar um pouco mais no package io
. Explorando o repositório da linguagem Go, no arquivo [src/io/io.go](<https://github.com/golang/go/blob/master/src/io/io.go>)
, a partir da linha 83, podemos ver uma grande quantidade de interfaces sendo definidas. No entanto, vamos focar em 3.
type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } type Closer interface { Close() error }
Como podemos ver, cada uma das interfaces necessita somente 1 método para ser implementada, ou seja, são extremamente específicas.
Outro ponto interessante de ter interfaces tão específicas quanto as que vimos, é que podemos utilizar a técnica de embedding para gerar outras interfaces.
type ReadWriter interface { Reader Writer } type ReadCloser interface { Reader Closer } type WriteCloser interface { Writer Closer } type ReadWriteCloser interface { Reader Writer Closer }
Dessa forma, funções como bufio.NewReaderSize
– que aceita um parâmetro do tipo io.Reader
-, e atributos como o http.Request.Body
– que é do tipo io.ReadCloser
-, conseguem facilmente garantir que a struct não implemente um método que não será utilizado.
Espero que o post tenha sido útil.
Até a próxima!