Entendendo Interfaces
Tags: interfaces, programming, programacao, dev
Published: 2022-02-14 13:50:45

É novo na programação e ainda não entendeu o que são interfaces e como elas elas funcionam? É mais simples do que você imagina.

De um ponto de vista didático e simplista, as interfaces são contratos.
> Mas espera, não era pra ser fácil?

Realmente é! Um contrato especifica os limites de alguma coisa. A interface define que quem quer que se proponha a prestar um serviço precisa atender os requisitos X. Assim, quem for contratar, não precisa se preocupar em quem está prestando o serviço. Basta saber que ele está apto a executar.

Digamos que você tenha uma empresa com seu amigo que venda desenhos.
Seu amigo cuida da contratação de clientes e você é expert em desenhar, ou seja, você vai ser responsável somente por fazer o desenho.

Digamos também que seu amigo seu ficou responsável por conseguir patrocínios com algumas marcas de canetas pra você fazer esses desenhos.

Você precisa de uma caneta de marca e modelo específicos pra fazer o desenho? Vou assumir que não. Mesmo que talvez você não esteja acostumado, ou seja um pouco desconfortável pra você usar a marca A ou B, você ainda conseguirá fazer um desenho com elas.

---

**Agora vamos à implementação:**

Primeiro a gente define o que uma caneta precisa conhecer sobre ela mesma e o que ela precisa saber fazer.

Pra deixar a explicação mais básica, vamos assumir que a folha também é uma interface, e você consegue desenhar numa cartolina, papel de pão, guardanapo e até num papel higiênico!

```cs
public interface ICaneta {
  Cores Cor { get; set; }
  float Espessura { get; set; }
  void Riscar(IFolha folha, Ponto de, Ponto para);
}
```

Depois, cada empresa precisa fabricar uma caneta pra que você possa fazer o desenho, não?

```cs
//Como o fabricante 1 resolve o problema
public class CanetaBac {
  public Cores Cor {get; set;};
  public float Espessura {get; set;};
  public void Riscar(IFolha folha, Ponto de, Ponto para){
    // Aqui vale a criatividade do fabricante pra decidir como esse risco vai ser feito.
    // O tanto de tinta que vai sair em cada parte do risco etc.
  }
}
```

```cs
//Como o fabricante 2 resolve o problema
public class CanetaCasteloColorido {
  public Cores Cor {get; set;};
  public float Espessura {get; set;};
  public void Riscar(IFolha folha, Ponto de, Ponto para){
    // Aqui vale a criatividade do outro fabricante.
  }
}
```
Como agora já existem canetas no nosso mundo, é sua hora de mostrar como se desenha!

```cs
public void Desenhar(IFolha folha, ICaneta caneta){
  caneta.Riscar(folha, de:Aqui, ate: Ali);
  caneta.Riscar(folha, de:Ali, ate: La);
}
```
Agora que você já me ensinou a desenhar, é hora do seu amigo te entregar uma folha e uma caneta.



```cs
public void PedirDesenho(){
  IPessoa voce = new Pessoa([seu nome aqui]);
  IFolha folha = new PapelSulfite(Cores.Branco);
  ICaneta caneta = new CanetaCasteloColorido(Cores.Azul, 0.7);
  voce.Desenhar(folha, caneta);
}
```
Pronto, agora você pode usar a caneta Castelo Colorido e o papel sulfite que seu amigo te deu e fazer o desenho que você me ensinou ali em cima.

---

**Tá, mas o que eu ganho com isso?**

Imagina que saiu uma nova marca de caneta no mercado, ultra moderna e que vai ajudar a vida de vocês na hora de entregar desenhos. Você não vai precisar se preocupar em aprender a desenhar tudo de novo. Basta seu amigo te dar uma caneta dessas novas!

Ou imagine que seu amigo precise de um rascunho de desenho, só pra testar uma ideia.

Ele pode te dar um papel de pão e uma caneta bem baratinha que o desenha sai do mesmo jeito.
Agora voltando pro mundo da programação… Esse rascunho que ele precisa pode ser considerado uma suíte de testes em TDD; e essa caneta e o papel de pão seriam um mock (uso de dados fake só pra teste) do seu banco de dados.

O importante aqui é que agora as responsabilidades estão mais divididas. Seu amigo não precisa desenhar, você não precisa saber escolher uma caneta pra fazer seu desenho. Fabricas novas de papel e caneta podem surgir no mercado e substituir as antigas sem que vocês tenham prejuízo.

> Uma observação sobre boas práticas:
 Se percebeu, eu não utilizei acentos nas variáveis dentro do código.
 Embora estejamos em um mundo globalizado você ainda tem muitas chances de ter problemas se utilizar palavras acentuadas ou caracteres especiais dentro do seu código. Então de forma alguma recomendo que os utilizem.