003 – POO Básico – Tutorial de Programação Orientada a Objetos POO
Playlist do Curso de Programação Orientada a Objetos POO
POO básica
Tipo de dados (TD ou ‘tipo’) é um conjunto de valores com propriedades em comum. Tipo abstrato de dados (TAD) é um TD em que o foco recai sobre as operações nos valores do tipo, em contraste com a representacão destes valores. Estas operações escondem e protegem a representação dos dados enquanto facilitam a sua manipulação. A POO é frequentemente compreendida e descrita como calcada nos TADs.
Legado de paradigmas anteriores
Linguagens pré-POO (em especial as que comportavam a programação estruturada) forneceram o seguinte legado à POO:
Variáveis portam informação formatada dentre um número pequeno de TDs embutidos/padrão/default e estruturas de dados derivados destes TDs básicos.
Procedimentos/métodos/funções/rotinas, que podem receber uma entrada, retornar uma saída, e manipular dados.
Uso das estruturas de controle.
Modularidade: procedimentos agrupados em arquivos e módulos, com espaços distintos de nomes para que os identificadores não colidam (i.e., uso de namespaces).
Novas características
Os atributos e métodos podem ser referentes a uma classe (e todas as suas instâncias) ou a uma única instância. O vínculo dos atributos aos métodos, de forma a manter uma interface bem definida para operação sobre os dados, e a evitar corrupção dos dados, é chamado de encapsulamento. O encapsulamento foi responsável pelo conceito de ‘ocultamento de dados’, central para a POO. O encapsulamento pode ser realizado através de convenções (em Python, underscores demarcam métodos e atributos protegidos e privados), ou via recursos da linguagem (em Java ou C++, um método privado só é acessado pela própria classe). Encapsulamento incentiva o desacoplamento.
Quando um objeto contém outros objetos, diz-se que há composição de objetos. A composição de objetos é usada para representar uma relação ‘tem um’, usualmente uma meronímia. Já a herança (quase sempre suportada pelas linguagens que utilizam classes) apresenta relações ‘é um’ (i.e. ‘é um tipo de’), ou seja, relações de hiperonímia cujo resultado final é a árvore taxonômica. Na herança, tipicamente todos os atributos e métodos da classe pai/mãe estão também disponíveis na classe filha, embora seja comum que algumas características sejam substituídas. Assim, a herança permite reúso facilitado de características e muitas vezes reflete relações do mundo real de forma intuitiva. Ambas a ‘composição de objetos’ e a ‘herança’ constituem hierarquias entre as classes e objetos na POO.
Herança múltipla ocorre quando uma classe é filha de mais de uma classe. Mixin pode ser considerado um tipo especifico de herança, embora haja uma diferença crucial: a classe da qual são herdadas as características não é considerada pai/mãe.
Polimorfismo é quando alguma rotina pode ser chamada para objetos diferentes. Por exemplo, assuma que a função retornaCorPrincipal() possa ser chamada tanto em um objeto da classe Imagem quanto da classe Video. O polimorfismo é um tipo de abstração que simplifica códigos externos à hierarquia de classes e uma separação forte das responsabilidades (separation of concerns).
Há orientações diversas para a POO, muitas de reconhecida complexidade. Por exemplo, o princípio da composição sobre herança advoca que a composição de objetos é preferida à herança. O princípio aberto/fechado advoca que classes e funções deve ser ‘abertas p extensão mas fechadas para modificação’.
Subtipos comportamentais fortes (ou princípio de substituição de Liskov, LSP do inglês Liskov substitution principle) são filhos que mantém todas as características dos pais. Dito de outra forma, seja ‘s’ tal que todas as propriedades dos objetos t da classe T estão também presentes no objeto s da classe S, em que S é subtipo de T. Tal ‘s’ é chamado de subtipo comportamental forte, subtipo forte, subtipo de Liskov, e variações semelhantes.