Playlist do Curso de Programação Orientada a Objetos POO
Orientação a objetos
Programação Orientada a Objetos (também conhecida pela sua sigla POO) é um modelo de análise, projeto e programação de software baseado na composição e interação entre diversas unidades chamadas de ‘objetos’. A POO é um dos 4 principais paradigmas de programação (as outras são programação imperativa, funcional e lógica). Os objetos são operados com o conceito de ‘this’ (isso) ou ‘self’ (si), de forma que seus métodos (muitas vezes) modifiquem os dados da própria instância. Os programas são arquitetados através de objetos que interagem entre si. Dentre as várias abordagens da POO, as baseadas em classes são as mais comuns: objetos são instâncias de classes, o que em geral também define o tipo do objeto. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.[2] A alternativa mais usual ao uso de classes é o uso de protótipos. Neste caso, objetos são cópias de outros objetos, não instâncias de classes. Javascript e Lua são exemplos de linguagens cuja POO é realizada por protótipos. A diferença prática mais evidente é que na POO baseada em protótipos apenas a herança simples é implementada pela cópia do objeto. Assim, na POO, implementa-se um conjunto de classes passíveis de serem instanciadas como objetos, e.g. Python e C++ (ou objetos protótipos que são copiados e alterados, e.g. JavaScript e VimL).
Em alguns contextos, o termo modelagem orientada ao objeto (MOO) é preferível ao termo POO. De fato, o paradigma “orientado ao objeto” tem origem nos estudos da cognição e influenciou a inteligência artificial e a linguística, dada a relevância para a abstração de conceitos do mundo real. A MOO é considerada a melhor estratégia para diminuir o “gap semântico” (o hiato entre o mundo real e a representação dele), e facilita a comunicação das partes interessadas no modelo ou software (e.g. o modelador e o usuário final) na medida em que conceitos, terminologia, símbolos, grafismo e estratégias, são, potencialmente, mais óbvios, intuitivos, naturais e exatos.
Além da programação estruturada, a POO incorpora as seguintes diretrizes:
Aborde o hiato entre o problema e a linguagem compreendida pela máquina: preencha bottom-up.
Use os dados como unidades básicas para construção do programa
Dados e suas inter-relações são mais estáveis do que ações sobre os dados.
Empacote os dados com suas operações naturais/intrínsecas
Construa sob as ideias de tipos abstratos de dados
Consolide os construtos que encapsulam os dados
Concentre nos conceitos e fenômenos a serem manipulados
Faça uso de teorias existentes de fenômenos e conceitos (bastante útil, por exemplo, para a computação natural e a inteligência artificial em geral).
Forme novos conceitos a partir dos existentes
Utilize um estilo de programação que permita o colapso da programação dos objetos
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.[1]
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).