APIE - Abstraction, Polymorphism, Inheritance, Encapsulation

APIE é um acrônimo usado para representar os quatro pilares da Programação Orientada a Objetos: Abstração, Polimorfismo, Herança e Encapsulamento.

Esses quatro princípios formam a base da Orientação a Objetos, paradigma muito utilizado em linguagens como Java, C#, Python e C++ para criar sistemas modulares, reutilizáveis e fáceis de manter.

Embora o acrônimo APIE não seja um padrão oficial amplamente documentado em livros clássicos, ele é frequentemente usado por educadores, desenvolvedores e cursos para facilitar a memorização dos pilares fundamentais da POO.

Abstração

A abstração consiste em esconder os detalhes complexos de implementação e mostrar apenas o essencial.

A chave para este conceito é a remoção constante de itens específicos ou detalhes individuais para alcançar a generalização da finalidade do objeto.

No domínio do problema de uma empresa em particular, não pretendemos descrever um tipo específico de Funcionário, mas nosso objetivo é definir dados e funcionalidades comuns que todos os funcionários da empresa dispõem. Note que não estamos generalizando para todas as empresas, pois seria impossível: temos como referência a empresa que estamos trabalhando.

Com esse conhecimento, criamos uma abstração adequada, uma classe abstrata que pode ser herdada posteriormente ao construir uma classe modelo específica.

Podemos implementar Abstração através de classes abstratas ou por meio de interfaces.


Polimorfismo

O polimorfismo permite que objetos diferentes respondam ao mesmo método de formas diferentes.

Dado o funcionário descrito anteriormente, ele poderia ser definido com a capacidade de realizar uma ação específica de várias maneiras, dependendo do contrato de trabalho e de como será remunerado.

Isso significaria, no contexto de um funcionário, que o método "calcular salário" poderia acontecer de forma diferente com base nas entradas ou no tipo de objeto.

Polimorfismo Estático é o uso de sobrecarga de métodos, onde temos métodos com mesmo nome, mas parâmetros diferentes. O método correto é resolvido durante a compilação do programa.

Polimorfismo Dinâmico é o uso de sobrescrita de métodos, onde o método é conhecido em tempo de execução. O método substituído é chamado por meio de referência à instância do objeto ao qual ele pertence.

Herança

A herança permite que uma classe herde atributos e métodos de outra. Isso promove reutilização de código, organização hierárquica e facilita a manutenção e expansão do sistema.

A subclasse herda tudo que está na classe pai, podendo usar os métodos e atributos como estão, estender o comportamento (adicionando novos métodos) e sobrescrever métodos (comportamento personalizado) no caso da funcionalidade original não ser adequada ao seu contexto. No exemplo que estamos apresentando o método "calcular salário" precisa ser adequado para cada tipo de funcionário, pois cada um calcula os seus rendimentos de forma diferente.

Encapsulamento

Podemos aplicar o encapsulamento ao exemplo de um veículo: imaginamos um veículo real onde todos os elementos internos e funções internas permanecem ocultos ao motorista. 

Ele expõe apenas as funcionalidades que servem, como o volante, que o motorista pode controlar. Este é o princípio geral do encapsulamento. 

O estado de uma instância pode ser alterado ou atualizado por meio de métodos ou campos expostos; todo o resto está oculto do mundo exterior.

No exemplo que estamos construindo, as classes são as "capsulas" que contém propriedades e métodos. As propriedades dos funcionários têm regras de formação como por exemplo, não existe salário negativo, nem cargo vazio e matrícula igual a zero. Tudo isso fica dentro da classe.


Conclusão

A motivação de cada um dos pilares mencionados é introduzir estrutura no código por meio de um determinado conjunto de conceitos. 

Os pilares são definidos e complementares.

Embora estes quatro pilares pareçam triviais, é incrivelmente difícil segui-los.

Abstração = Funcionalidades padronizadas.
Polimorfismo = Comportamento sob demanda.
Herança = Evolução inevitável do sistema.
Encapsulamento = Exposição somente do que é necessário.