The Code Codex
Tema
← Notas / Fundamentos

nota · texto08 out 2024 · 1 min

Interfaces

Uma interface é um contrato: um conjunto de métodos que um tipo promete ter. Quem usa a interface só conhece o contrato, não a implementação, e por isso dá para trocar a implementação sem mexer em quem usa.

Checkout

interface PaymentGateway

charge(amount)

StripeGateway

PixGateway

FakeGateway

(nos testes)

Checkout

interface PaymentGateway

charge(amount)

StripeGateway

PixGateway

FakeGateway

(nos testes)

Em Java: explícita (nominal)

A classe precisa declarar que implementa a interface:

interface Shape {
double area();
}
record Circle(double r) implements Shape {
public double area() { return Math.PI * r * r; }
}
Em Go: implícita (estrutural)

Não existe implements. Se o tipo tem os métodos, ele satisfaz a interface automaticamente:

type Shape interface {
Area() float64
}
type Circle struct{ R float64 }
func (c Circle) Area() float64 { return math.Pi * c.R * c.R } // Circle já é um Shape

Isso permite definir a interface onde ela é usada, e não onde o tipo é criado. A convenção em Go é ter interfaces pequenas, de um ou dois métodos (io.Reader, io.Writer, fmt.Stringer).

Para que servem na prática
  • Trocar implementações: o mesmo código funciona com Stripe ou Pix.
  • Testar: nos testes, uma implementação falsa no lugar do serviço real.
  • Desacoplar camadas: o domínio define a interface e a infraestrutura implementa (é a ideia central da arquitetura hexagonal).

Veja também: Structs e interfaces em Go e Paradigmas.