Uma linguagem OO deve fornecer suporte para três recursos chaves de linguagem:
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.
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 processo.
Parte da abstração de dados são suas operações que são definidas como abstração de processos.
JOptionPane.
showMessageDialog(
null, "Acertei de novo!",
"Jogo dos Animais",
JOptionPane.DEFAULT_OPTION);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
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.
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>
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.
Níveis de encapsulamento
É 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;
}É 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;
}É a capacidade de expor e/ou ocultar um conjunto de classes entre si, classes irmãs.
É a capacidade de expor e/ou ocultar um conjunto de conjuntos de classes.
É a capacidade de expor e/ou ocultar características de negócios entre si, conjuntos de componentes.
Livro:
Microservices for Java Developers
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.
Em Java a desalocação de um objeto na memória é feita de maneira implícita 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.
Em Java o encapsulamento mínimo e médio são definidas por meio dos modificadores de acesso que são anexadas as definições de atributos, métodos e classes.
O encapsulamento alto é definido por meio dos pacotes (package) e a componentização por meio de bibliotecas (library - lib).
Abstração
atributos e métodos
assinatura de método
Encapsulamento
get e set
modificadores de acesso (default, private, public e protected)
package
libs (Java API)
Exemplo classe Pessoa...
clone the repo! and let's coding...
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);
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)
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.
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
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;
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.
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 múltipla.
Classes aninhadas:
Ocultamento de informações, escopo de informações.
Sistemas Legados...
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.
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.
spoiler: método abstrato...
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.
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.
Pessoa abstrata
Pessoa fisica
Pessoa jurídica
Exemplo hierarquia Pessoa...
clone the repo! and let's coding...
}
challenge
http://stella.caelum.com.br/
SEBESTA cap. 11, 12
DEITEL cap. 3, 6, 8, 9, 10, 21