O que é e como Interface Segregation é aplicada no Go

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!


Se inscreva na nossa newsletter

* indicates required

Deixe uma resposta