Interface

O que é uma Interface?

Interface (em Inglês: interface, pronunciado "interfeisse") são meios que uma máquina expõe para que outras máquinas possam fazer uso ou interagir com ela. Esse é um conceito fundamental de informática, já que a interface é o meio com qual a entrada e a saída de dados é feita. Sem uma interface, dados não podem ser transmitidos, logo toda transmissão de dados implica a existência de algum tipo de interface.

A interface é a porta pela qual os dados entram.

Exemplos de Interfaces

Interfaces Humanas: tudo que pode ser usado por um ser humano expõe uma interface humana. Por exemplo, uma interface que é visível para seres humanos, e onde há botões que seres humanos são capazes de apertar.

É chamado de HIG (Human Interface Guidelines) um conjunto de estipulações sobre como interfaces humanas devem ser criadas. Em particular, interfaces humanas devem ser acessíveis.

Acessibilidade (accessibility, abreviado a10y) refere a capacidade de uma interface ser usada por um ser humano com algum tipo de deficiência física. Por exemplo, usuários com deficiências visuals não poderão ver uma interface, logo é necessário que informações e indicadores sejam disponíveis de forma tátil (braille) ou sonora. Usuários com deficiências motoras terão problemas em pressionar botões pequenos, etc.

Interface de Usuário (user interface, UI) é um outro termo para interfaces para usuários humanos.

Interfaces Gráfica (graphical interface) pode ser uma interface de vídeo (video interface) usada por um monitor para receber os dados da imagem a ser exibida na tela, tal como VGA (Video Graphics Array), HDMI (High-Definition Multimedia Interface), ou DVI (Digital Visual Interface); ou ser outro termo para Interface Gráfica de Usuário (IGU, em Inglês: Graphical User Interface, GUI), que seria a interface humana composta de janelas e botões de aplicativos e websites exibidos na tela do computador com os quais o usuário interage.

A janela principal no Mozilla Firefox exibindo uma nova guia. No centro da página o logotipo do Firefox. Sob ele uma caixa de pesquisa. E então vários atalhos: Amazon (Patrocinado), AliExpress (Patrocinado), YouTube, Facebook, Wikipedia, Reddit, e Twitter.
Um screenshot do Mozilla Firefox exibindo uma nova aba. A janela em si é uma interface gráfica de usuário, e o conteúdo dentro da aba (a caixa de pesquisa) também seria uma interface.

Interface de Linha de Comando (ILC, em Inglês: Command Line Interface, CLI) é a interface que um programa de computador expõe que permitir controlar o comportamento do programa através da linha de comando, i.e. de um shell, incluindo quais parêmetros o programa aceita e em qual formato.

Janela do prompt de comando com o comando "ping 1.1.1.1", exibindo a saída: disparando 1.1.1.1 com 32 bytes de dados: Resposta de 1.1.1.1: bytes=32 tempo=52ms TTL=60 (repete outras 3 vezes com tempos 54ms, 70ms, e 51ms). Estatística do Ping para 1.1.1.1: Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda), Aproximar um número redondo de vezes em milissegundos: Mínimo = 51ms, Máximo = 70ms, Média = 56ms.
Uma janela de terminal exibindo a saída do comando de terminal ping para o IP 1.1.1.1. Veja que a interface de linha de comando do programa ping é tal que o primeiro parâmetro deve ser um endereço de IP ou nome de domínio. Se digitarmos outra coisa, tal como o nome de uma cidade, o programa não irá funcionar já que não é um tipo de dados aceito pela interface.

Interface de Programação de Aplicação (Application Programming Interface, API) é uma interface que expõe funções de um programa de computador para uso por outros programas de computadores, especialmente para que programadores escrevam código fonte capaz de usar tais programas. Por exemplo, suponha que você quer programar um programa que exibe uma janela no Windows. Para isso, você precisa fazer uso da API do Windows. Essa API expõe como programar o Windows, isto é, quais dados enviar do seu programar para o sistema operacional Windows para que o Windows exiba uma janela na tela e também a exiba na barra de tarefas.

Interface Binária de Aplicação (Application Binary Interface, ABI) é uma interface que expõe funções de um programa de computador para uso por outros programas, só que, contrário a uma API, que seria para programadores criarem programas, a ABI é para programas de computador que estão rodando no momento invocar subprogramas contidos em outros arquivos ou carregados na memória RAM. Em linguagens de programação de baixo nível, como C, C++, Rust, e Zig, o arquivo contendo o programa compilado é chamado de arquivo executável binário, "binário" no sentido de que contém código máquina (machine code) que não seria texto que podemos ler mas sim códigos em bytes que a CPU entende. Quando um arquivo binário quer invocar um subprograma contido em outro arquivo binário, ele precisa enviar dados para CPU com bytes alinhados de maneira exata ao que é requerido pela interface do subprograma sendo invocado. Um efeito interessante disso é que ABI depende da arquitetura da CPU, o que significa que um programa compilado para rodar em uma CPU não consegue se comunicar com um programa compilado para outra CPU pois a ABI estaria errada mesmo se em seu código fonte a API tivesse sido usada corretamente.

O que é uma Interface em Linguagens de Programação?

Em linguagens de programação, interface refere aos membros públicos expostos por um objeto, que podem ser usados por outros objetos em um programa. Esses membros sendo campos, propriedades, ou métodos (funções e procedimentos). Os objetos sendo estruturas ou classes.

Como interfaces são implementadas varia de acordo com a linguagem de programação.

Em linguagens de alto nível, como Javascript e Python, membros são acessado por seus nomes, logo todo nome acessível em um objeto faz parte de sua interface. Por exemplo:

const foo = {
    dados: "Bar.",
    salvar() { io.salvar(dados); }
}

No código Javascript acima, ambos dados e salvar fazem parte da interface do objeto foo.

Em geral, interfaces são definidas por seus nomes. Não é necessário, pro exemplo, questionar o que o método salvar do objeto foo faz: ele salva. Esse é um contrato. Toda vez que invocarmos o método salvar, foo deve ser salvo. Se isso mudar um dia, o contrato da interface será quebrado, e todo código que depende desse comportamento estará em risco de não funcionar adequadamente, pois quando foi escrito esperava-se o método salvar salvasse, e isso não seria verdade mais.

Linguagens que "Têm Interfaces"

Dizemos que uma linguagem "tem interfaces" se é possível definir na linguagem uma interface que pode ser compartilhada por objetos. Isso é possível, por exemplo, em Typescript, C#, e Java.

interface ISalvavel {
   salvar();
}

Por convenção, nomes de interfaces começam com I. A documentação do Typescript não concorda com isso. Eu não concordo com a documentação.

Uma interface definida não pode ser instanciada. Ela não é uma classe ou estrutura. O que é definido é apenas as regras de um contrato que deve ser obedecidas por objetos que implementam a interface e por consumidores que recebem objetos que implementam as interfaces.

Por exemplo, no caso acima, poderíamos ter uma função que recebe um parâmetro de tipo ISalvavel, e invoca o método salvar no objeto. Todo código que invoca essa função precisaria então passar um objeto que possui um método salvar, que implementa a interface.

Note que interfaces nesse sentido não são a mesma coisa que herança (inheritance) encontrada em programação orientada a objetos (Object Oriented Programming, OOP). Em OOP, super-classes possuem construtores que são executados antes dos construtores das sub-classes. Em programação orientada a interfaces, a interface não possui construtor algum, e apenas descreve o que um objeto já construído é capaz de fazer.

Caso seja necessário definir uma interface para construção de objetos, teríamos que definir uma interface para um objeto que constrói e retorna outros objetos. Esse tipo de objeto é chamado de uma "fábrica" (factory). Por exemplo:

interface IFabricaDeCarros {
    fabricarCarro(marca: string, modelo: string): ICar;
}

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *