POO
Programação Orientada a Objetos
Quem já programa?
Qual linguagem?
Qual foi o seu maior desafio?
Já ouviram falar dos "Paradigmas de programação"?
POO
Uma linguagem OO deve fornecer suporte para três recursos chaves de linguagem:
- tipos de dados abstratos;
- herança e;
- vinculação dinâmica de chamada a métodos.
Roteiro POO
- Conceitos
- Abstração de Dados
- Encapsulamento
- Herança
- Polimorfismo
- Ambiente de desenvolvimento
- Exercícios
Abstração de Dados
Uma abstração é uma visão ou representação de uma entidade e inclui apenas os atributos mais significativos - Tipo de Dado definido pelo usuário.
Abstração de Dados possui o propósito de simplificar a complexidade de programação.

Abstração de Dados
O conceito de abstração de dados tem suas origens no SIMULA 67, seguidas por Smalltalk (totalmente OO) Ada, C++, Java, C#, JavaScript, Python, Ruby, entre muitas outras.

Abstração de Dados
Abstração de processo.
Parte da abstração de dados são suas operações que são definidas como abstração de processos.
def rentabilidade(self):
rentabilidade = self._consulta_rentabilidade()
if (rentabilidade < 0.5):
print('Consulte seu gerente')
else:
print(rentabilidade)Abstração de Dados
Em POO a abstração de de dados é melhorada por meio dos Objetos.
A definição dos Objetos são feitas por meio de Classes e separadas em duas sessões
- variáveis de tipos primitivos ou de outras abstrações (atributos), por exemplo: uma classe Pessoa pode possui os atributos: “nome”, “idade”, “sexo”, “identidade”, “Telefone”, “Endereço”, etc…
- conjunto de operações para manipular os objetos (métodos), por exemplo: anda(), fala(), ouve(), etc…
Abstração de Dados
Em tempo de execução os objetos são alocados e deslocados da memória conforme a sua utilidade.
Essa alocação e desalocação são feitas de maneira explícita* pelo usuário, e cada linguagem tem sua especificação.

* salvo exerções de algumas linguagem como Java que é feita de for implícita pela JVM.
Abstração de Dados
Os tipos de dados em alguns casos podem ser parametrizados. Estas construções permite que os atributos e métodos possam ser definidos através de parâmetros.
Por exemplo, um tipo de dado de listas (classe Lista), por meio da construção com parâmetros podemos construir listas de qualquer outro tipo de dados, basta passar este outro tipo de dado como parâmetro.
Listas<int> Listas<char> Listas<Pessoa>
Encapsulamento
Este é um importante recurso da abstração de dados, tanto na ocultação como na exposição dos tipos de dados.
O ocultamento de informação que, garante confiabilidade em termos de programação para a abstração de dados.

Encapsulamento
Níveis de encapsulamento
- Mínimo
- Médio
- Alto
- Componentes
- Microservices

Encapsulamento
Encapsulamento Mínimo
É a capacidade de expor e/ou ocultar os atributos e métodos dos Objetos para outros contexto da programação, chamados clientes.
package br.uem;
public class Pessoa {
private String nome;
private int idade;
private char sexo;
private Integer identidade;
private Telefone telefone;
// private Endereço endereco;
public Pessoa(String nome, int idade, char sexo, Integer identidade, Telefone telefone) {
this.nome = nome;
this.idade = idade;
this.sexo = sexo;
this.identidade = identidade;
this.telefone = telefone;
}
public String getNome() {
return nome;
}Encapsulamento
Encapsulamento Médio
É a capacidade de expor e/ou ocultar as Classes entre si.
package br.uem;
import br.uem.endereco.Endereco;
public class Pessoa {
private String nome;
private int idade;
private char sexo;
private Integer identidade;
private Telefone telefone;
private Endereco endereco;
public Pessoa(String nome, int idade, char sexo, Integer identidade, Telefone telefone) {
this.nome = nome;
this.idade = idade;
this.sexo = sexo;
this.identidade = identidade;
this.telefone = telefone;
}Encapsulamento
Encapsulamento Alto
É a capacidade de expor e/ou ocultar um conjunto de classes entre si, classes irmãs.

Encapsulamento
Componentização
É a capacidade de expor e/ou ocultar um conjunto de conjuntos de classes.

Encapsulamento
Micro Serviços
É a capacidade de expor e/ou ocultar características de negócios entre si, conjuntos de componentes.
Livro:
Microservices for Java Developers

Tipos de Dados Abstratos e Encapsulamento com Python
Todas as definições de tipo de dados do usuário são feita por meio de Classes, e um objeto na POO é uma instância dessa classe.
A desalocação de um objeto na memória é feita de maneira implícita e explicita pelo Garbage Collector

Normalmente existe um método em toda classe, definida como método construtor, esse método é responsável por entregar instâncias (objetos) desta classe.

Tipos de Dados Abstratos e Encapsulamento com Python
Exemplo classe Pessoa...
class Pessoa(object):
nome = ''
telefone = ''
def __init__(self, nome):
self.nome = nome
def __str__(self):
return 'nome: ' + self.nome +
', telefone: ' + self.telefone O encapsulamento mínimo e médio são definidas por meio dos convenções de nomenclatura que são anexadas as definições de atributos, métodos e classes.
Python não tem o conceito de encapsulamento médio e alto porque a linguagem tem a filosofia: -“todos nós somos adultos consentindo aqui”

Tipos de Dados Abstratos e Encapsulamento com Python
Encapsulamento
class A:
a = 1 # atributo publico
_b = 2 # atributo fracamente privado
__c = 2 # atributo privado a class A
class B(A):
__d = 3 # atributo privado a B
def __init__(self):
print self.a
print self.__dHerança
Problemas programação procedural:
baixa produtividade e baixo reuso de software.
Problemas com uso somente dos tipos de dados abstratos...
1° - nem todos os recursos existente no tipo abstrato é necessário para um novo reuso;
2° - adaptações na estrutura no tipo podem ficar complexas (todo conhecimento do tipo fica sobre responsável - projetista do tipo);
Herança
3° - mudanças no tipo requer modificações em todos os programas clientes e;
4° - definições de tipo são independentes e no mesmo nível, focado em resolver um problema específico, problemas adjacentes podem possuir objetos relacionados, tanto no mesmo nível (irmãos) como no descendência (pais e filhos)
Herança
A POO vem solucionar estes problemas por meio da herança, por isso é considerado o centro da POO, por ser o recurso que mais aumenta o reuso de software.
A possibilidade de herdar os dados e funcionalidades, e permitir que modifique algumas entidades e adicione novas, facilita diretamente o reuso pois não impacta em mudanças no tipo de dados herdado.
Herança
Tudo começa com um tipo de dado abstrato existente e projetar um novo tipo de dados herdando atributos e comportamentos do pré-existente.
Uma classe que é definida por meio de herança de outra classe é chamada de classe derivada ou subclasse.
Uma classe da qual a nova é derivada é sua classe pai, ou superclasse.
Exemplo: Hierarquia Universidade
MembroDaComunidade
Empregado
Aluno
Corpo Docente
Funcionarios
Administrador
Professor
Herança
Diferenças mais comuns entre uma classe pai e suas subclasses:
-
Classe pai pode definir membros privados que não podem ser acessados nas subclasses, fazendo com que esse membros não sejam visíveis na subclasse;
-
A subclasse pode adicionar membros (atributos e métodos) novos a subclasse, e;
Herança
Diferenças entre classe pai e suas subclasses:
-
A subclasse pode adicionar comportamento de um ou mais métodos herdados. Um método herdado tem o mesmo nome e a mesma assinatura. é dito que o novo método sobrescreve o método herdado, também chamado de método sobrescrito. O propósito mais comum é fornecer um comportamento específico para aquele objeto da classe derivada que não é apropriado para classe pai.
Herança
Uma “desvantagem” do uso de herança é que ela cria dependências entre as classes em uma hierarquia.
Isso vai contra a uma das vantagem de tipo abstrato de dados, que é a independência de um tipo em relação a outro.
Porém em muitos casos as dependências (hierárquicas) espelham a realidade dos problemas reais.
Herança
Propriedades Avançadas
Herança múltipla.
Classes aninhadas:
Ocultamento de informações, escopo de informações.
Sistemas Legados...
Polimorfismo
Considere a seguinte situação: existe uma classe A que define um método que realiza uma operação em objetos da classe base. Uma segunda classe B, é definida como uma subclasse de A.
Objetos dessa nova classe precisam de uma operação parecida com a fornecida por A mas um pouco diferente porque são levemente diferentes.
Dessa forma um objeto da classe A também pode apontar para um objeto da classe B, tornando do se um objeto polimórfico.
Polimorfismo
Etimologia da palavra!
O propósito deste recurso é permitir que os sistemas sejam melhores estendidos durante o desenvolvimento e manutenção.
Exemplo, laço de interação em objetos polimórficos.
Polimorfismo
O projeto de uma hierarquia de heranças resultam em classes tão altas na hierarquia que começamos a definir comportamentos genéricos nas quais as subclasses devem possuir.
Chamamos esses métodos de método abstrato que possui somente a assinatura do método e sua definição fica nas implementações das subclasses.
Essas classes que possui métodos abstratos chamamos de classe abstrata.
Classe abstrata e Método abstrato
Polimorfismo
Portanto, pode se dizer que, o uso do polimorfismo é a evidência de maturidade no uso de dados abstratos em uma estrutura hierárquica de objetos.
Ambiente para o desenvolvimento de projetos de software com Python.




Exercícios
01 - Hierarquia de Pessoa, Pessoa Física, Pessoa Jurídica
02 - Hierarquia Conta Bancária, Conta Poupança, Conta Corrente
SENAI TDS01 - POO Python
By Henrique Vignando
SENAI TDS01 - POO Python
- 47