Buscar

[aula1]Conceitos

Prévia do material em texto

Programação Avançada
Prof. Anderson Pinheiro
Conteúdo
Conceitos básicos: 
Paradigma Orientado a 
Objetos
• Classes. 
• Métodos.
• Objetos.
2
Programação Avançada - Sistemas de 
Informação
Programação Avançada - Sistemas de 
Informação
3
Classes, Objetos e Métodos
 O que é uma classe?
 O que são objetos?
 O que são métodos?
Programação Avançada - Sistemas de 
Informação
4
Classes, Objetos e Métodos
Programação Avançada - Sistemas de 
Informação
5
Classes, Objetos e Métodos
Programação Avançada - Sistemas de 
Informação
6
Classes
 Modelo ou esquema abstrato
 Classes definem os objetos que 
compõem o sistema de software:
 Comportamento (métodos)
 Dados (atributos)
 Representa um ou mais objetos 
com características afins
Programação Avançada - Sistemas de 
Informação
7
Objetos
 Um objeto é uma instância de uma classe
 Classe : Pessoa
 Objetos : Anderson, Maria, …
 Seu estado é dado através de seus 
atributos
 Basicamente o que caracteriza o objeto. Ex. 
altura, RG, …
 Objeto: Anderson → altura=175, 
RG=1111111111
 Comunica-se com outros objetos através 
de seus métodos
 Chamadas de métodos entre objetos, trocando 
ou não informações
Programação Avançada - Sistemas de 
Informação
8
Métodos
 Definem o comportamento do objeto, suas ações:
 Anderson fala, anda, come, bebe …
 Permite a comunicação entre objetos:
 Interface externa;
 Recebe argumentos (parâmetros) que podem ser 
utilizados para definir a ação:
 anda(“direita”); anda(“esquerda”);
 Podem alterar o estado do objeto (seus atributos)
Programação Avançada - Sistemas de 
Informação
9
Construtor de classe
 Método publico com o mesmo nome da classe:
 Permite a instanciação dos objetos
 Pode receber parâmetros como entrada
 Em Java a instanciação ocorre pelo construtor new :
Pessoa anderson = new Pessoa (“Anderson”, 1.75);
Programação Avançada - Sistemas de 
Informação
10
Visibilidade
 Nos diagramas UML:
 (+) público – outras classes possuem acesso
 (-) privado – acesso somente pela própria classe
 (#) protegido – acessado somente por classes dentro de 
um mesmo pacote ou por herança
 Na linguagem Java:
 public, private, protected
Programação Avançada - Sistemas de 
Informação
11
Sintaxe Java
public class Pessoa{
String nome;
float altura;
Pessoa(String nome, float altura){
this.nome = nome;
this.altura = altura;
}
public void anda(String direcao){
System.out.println(“Andei para a “+direcao);
}
}
Programação Avançada - Sistemas de 
Informação
12
Sintaxe Java
public class Pessoa{
String nome;
float altura;
Pessoa(String nome, float altura){
this.nome = nome;
this.altura = altura;
}
public void anda(String direcao){
System.out.println(“Andei para a “+direcao);
}
}
Corpo da Classe
Atributos
Método
Identificador
Programação Avançada - Sistemas de 
Informação
13
Sintaxe Java
public class Pessoa{
String nome;
float altura;
Pessoa(String nome, float altura){
this.nome = nome;
this.altura = altura;
}
public void anda(String direcao){
System.out.println(“Andei para a “+direcao);
}
}
Programação Avançada - Sistemas de 
Informação
14
Métodos – Parâmetros
Programação Avançada - Sistemas de 
Informação
15
Identificando Classes
 Regra básica
 Procurar substantivos e verbos na análise do problema.
 Todos substantivos são candidatos para classes
 Os verbos são candidatos para operações
 Classes idealmente deve estar claramente associadas a 
uma abstração relevante para o sistema:
“Desenvolver um sistema de pedidos: cada pedido deve conter 
informações sobre os produtos (preço, quantidade,...), o endereço 
e o nome do destinatário. O sistema deve permitir que as 
informações sobre nome e endereço do destinatário sejam 
inseridas ao cabeçalho do pedido, para a área de itens deverá ser 
possível adicionar informações sobre os produtos como descrição, 
quantidade e valor.”
Programação Avançada - Sistemas de 
Informação
16
Herança
 Mecanismo para estender as classes existentes 
adicionando novos métodos e campos;
verificarSaldo()
depositar(float valor)
sacar(float valor)
Programação Avançada - Sistemas de 
Informação
17
Herança
 Mecanismo para estender as classes existentes 
adicionando novos métodos e campos;
verificarSaldo()
depositar(float valor)
sacar(float valor)
 O problema é que ContaBancaria não possui nenhum recurso para 
calcular os juros sobre os depósitos;
 Por isso estamos interessados em implementar a classe 
ContaPoupanca, a qual deverá possuir características mais específicas
que um conta bancária;
Programação Avançada - Sistemas de 
Informação
18
Herança
verificarSaldo()
depositar(float valor)
sacar(float valor)
saldo
calcularJuros()
taxa
Programação Avançada - Sistemas de 
Informação
19
Herança
Programação Avançada - Sistemas de 
Informação
20
Herança
 Superclasse: classe mais geral
 Subclasse: classe especializada 
 Toda classe que não estende especificamente outra classe é 
uma subclasse da classe Object;
 A classe Object possui alguns métodos que são comuns a 
todos os objetos:
 toString
Programação Avançada - Sistemas de 
Informação
21
Herança
Programação Avançada - Sistemas de 
Informação
22
Herança 
Programação Avançada - Sistemas de 
Informação
23
Herança 
Programação Avançada - Sistemas de 
Informação
24
Herança 
 Por que o método calculaJuros chama os métodos 
getSaldo e depositar em vez de atualizar diretamente o 
campo balance da superclasse?
Programação Avançada - Sistemas de 
Informação
25
Herança 
 Por que o método calculaJuros chama os métodos getSaldo
e depositar em vez de atualizar diretamente o campo 
balance da superclasse?
 Consequência do encapsulamento;
 O campo saldo é definido como private na superclasse 
ContaBancaria
 O método calculaJuros é definido na subclasse, logo não tem 
permissão para acessar um campo privado mesmo na superclasse
Programação Avançada - Sistemas de 
Informação
26
Hierarquia de Classes 
 Ao projetar uma hierarquia de classes devemos pensar nos 
recursos e comportamentos comuns a todas as classes na 
hierarquia;
 Essas propriedades comuns devem ser implementadas em 
uma superclasse
Programação Avançada - Sistemas de 
Informação
27
Hierarquia de Classes 
Programação Avançada - Sistemas de 
Informação
28
Construindo subclasses 
 Para chamar o construtor da superclasse existe um instrução 
especial “super”:
 Seguido dos parâmetros de construção da superclasse
 Pode ser utilizada seguida por um “.”, ou seja, acessando 
um método da subclasse em qualquer ponto da 
subclasse;
Programação Avançada - Sistemas de 
Informação
29
Construindo subclasses 
•public class ContaEmergencia extends ContaBancaria{
• public ContaEmergencia(double inicial){
• // Constrói a superclasse
• super(inicial);
• // Inicializa a contagem de transações
• transactionCount = 0;
• }
•}
 Se não é realizada uma chamada super() para a superclasse 
essa será instanciada a partir do construtor padrão; 
Programação Avançada - Sistemas de 
Informação
30
Subclasses 
 Ocasionalmente podemos instanciar objetos a partir de 
subclasses:
ContaEmergencia contaColegio = new 
ContaEmergencia(10000);
ContaBancaria umaConta = contaColegio;
Object umObjeto = contaColegio;
 Agora as três referências a objeto 
armazenadas em contaColegio, umaConta e 
umObjeto referenciam o mesmo objeto do tipo 
ContaEmergencia
Programação Avançada - Sistemas de 
Informação
31
Subclasses 
•Por que alguém iria querer conhecer menos sobre um objeto e 
armazenar uma referência em um campo de objeto de uma 
superclasse?
Programação Avançada - Sistemas de 
Informação
32
Subclasses 
•Por que alguém iria querer conhecer menos sobre um objeto e 
armazenar uma referência em um campo de objeto de uma 
superclasse?
 Isso pode acontecer se você quiser reutilizar o código que 
conhece a superclasse, mas não a subclasse.
Programação Avançada - Sistemas de 
Informação
33
Subclasses•Bem mais raro, mas ainda assim possível, podemos partir de um 
conversão de uma superclasse para uma subclasse:
•ContaBancaria conta = (ContaBancaria) object;
Programação Avançada - Sistemas de 
Informação
34
Subclasses 
•Bem mais raro, mas ainda assim possível, podemos partir de um 
conversão de uma superclasse para uma subclasse:
•ContaBancaria conta = (ContaBancaria) object;
•Cuidado!! 
•Se você estiver errado e object, na verdade,
•referir-se a um objeto de um tipo não-relacionado, uma exceção 
será lançada.
Programação Avançada - Sistemas de 
Informação
35
Subclasses 
 Para se proteger de coerções ruins, você pode utilizar o 
operador instanceof:
 Testa se um objeto pertence a um tipo específico;
object instanceof ContaBancaria
if (object instanceof ContaBancaria)
{
ContaBancaria conta = (ContaBancaria) object;
}
Programação Avançada - Sistemas de 
Informação
36
Herança vs Interfaces
 A herança diferencia-se da implementação de uma interface:
 Subclasses herdam comportamento e o estado da 
superclasse;
 Interfaces definem métodos que devem ser 
implementados, trata-se de um esboço;
 A vantagem da herança é a reutilização de código:
 Não é necessário replicar o esforço na implementação 
dos métodos;
 Ao estender devemos apenas nos preocupar em 
adicionar as novas funcionalidades
Todas as imagens foram retiradas de internet
37
Programação Avançada - Sistemas de 
Informação
Coleções em Java
Coleções
• Java fornece vários mecanismos de mais alto nível para 
manipular conjuntos de elementos
• Permitindo a reutilização de software com qualidade e desempenho
• Minimizando a quantidade de código 
• Essas estruturas são baseadas em interfaces de alta ordem
Interface Descrição
Collection Interface-raiz na hierarquia de coleções
Set Uma coleção que não tem duplicatas
List Uma coleção ordenada que pode conter duplicatas
Map Associa chaves e valores e não pode conter chaves 
duplicadas
Queue Primeiro elemento a entrar é o primeiro a sair
Coleções - Listas
• List é uma Collection ordenada:
 Primeiro índice também é 0
• Principais implementações de List são:
• ArrayList – lista dinâmica
• LinkedList – lista encadeada
• Vector – lista dinâmica
• ArrayList vs Vector:
 Objetos da classe Vector são sincronizados
 ArrayList por não ser sincronizado é mais eficiente, não 
possui overhead de sincronização de threads
• LinkedList são utilizados para criar estruturas como pilhas, 
filas, árvores
Coleções - Listas
Coleções – ArrayList e Iterator
• Criando um ArrayList, adicionando e removendo 
elementos:
 Um ArrayList é uma classe genérica, logo é possível especificar o 
tipo de elemento que está sendo armazenado na lista
 List<String> nomes = new ArrayList<String>();
 nomes.add(“Anderson”);
 nomes.add(“Maria”);
 System.out.println(“Nome: “+nomes.get(0));
 System.out.println(“Nome: “+nomes.get(1));
Coleções – ArrayList e Iterator(19.3)
• Criando um ArrayList, adicionando e removendo 
elementos:
 Um ArrayList é uma classe genérica, logo é possível especificar o 
tipo de elemento que está sendo armazenado na lista
 List<String> nomes = new ArrayList<String>();
 nomes.add(“Anderson”);
 nomes.add(“Maria”);
 System.out.println(“Nome: “+nomes.get(0));
 System.out.println(“Nome: “+nomes.get(1));
Adicionando elementos na lista
obtendo elementos da lista
Coleções – ArrayList e Iterator
• Iterator:
 Um ArrayList é permite obter um objeto iterador sobre a lista
List<String> nomes = new ArrayList<String>();
nomes.add(“Anderson”);
nomes.add(“Maria”);
Iterator<String> itr = nomes.iterator();
while (itr.hasNext()) {
String element = itr.next(); // ou itr.remove();
System.out.print(element + " ");
}
Coleções – LinkedList(19.5)
• Criando um LinkedList, adicionando e removendo 
elementos:
LinkedList<String> cores = new LinkedList<String>();
cores.add(“Rosa”);
cores.add(3,“Azul”);
cores.addFirst(“Vermelho”);
cores.addLast(“Preto”);
Coleções – LinkedList(19.5)
•Criando um LinkedList, adicionando e removendo 
elementos:
LinkedList<String> cores = new LinkedList<String>();
cores.add(“Rosa”);
cores.add(3,“Azul”);
cores.addFirst(“Vermelho”);
cores.addLast(“Preto”);
String coresVetor [] = cores.toArray( new String[links.size()] );
Coleções – Vector (19.6)
• Criando um Vector adicionando e removendo elementos:
Vector<Integer> idade = new Vector<Integer>();
idade.add(32);
idade.add(31);
idade.add(41);
System.out.println(idade.firstElement());
System.out.println(idade.get(0));
Coleções – Vector (19.6)
•Métodos importantes
 add(e)
 get()
 firstElement()
 lastElement()
 contains(e)
 size()
 indexOf(e)
Todas as imagens foram retiradas de internet
49
Programação Avançada - Sistemas de 
Informação
Porque Utilizar Padrões?
• Mesmo em um conjunto de 
sistemas corporativos 
diferentes podemos encontrar 
diversas características 
semelhantes
• Dado um problema comum 
que deve ser contornado 
em 100 aplicações com 
finalidades diferentes;
• A primeira vista teríamos 
100 diferentes soluções 
para o mesmo problema.
Porque Utilizar Padrões?
• Códigos com centenas de 
linhas?
– Como localizar as 
modificações
• Desperdício de tempo 
para entender a função 
de um método simples?
• Muitos desvios 
condicionais e repetições 
em um mesmo método 
com inúmeras variáveis?
Porque Utilizar Padrões?
Sim!!! Código complexo e obscuro!!!
• Certezas no desenvolvimento de software
• Evolução, Elasticidade;
• Novas funcionalidades ou mudanças nas já 
existentes.
Porque Utilizar Padrões?
• Para não perder tempo e dinheiro, podemos 
escolher uma solução como padrão e utilizá-la 
toda vez que nos depararmos com um dado 
problema;
• Essa estratégia além de reduzir o trabalho de 
implementação pode facilitar a comunicação entre 
as equipes envolvidas:
• Melhorando o entendimento técnico do 
sistema;
Padrão de Projeto
• Um padrão de projeto é uma solução adotada 
como padrão:
• Sempre que um determinado problema 
ocorrer utilizamos essa solução;
• Frequentemente utilizado em 
desenvolvimento orientado a objetos;
Padrão de Projeto
“Design Patterns: Elements of 
Reusable Object-Oriented 
Software” (Erich Gamma, Richard
Helm, Ralph Johnson e John Vlissides) 
(Gang of Four)
Dando origem ao nome padrões GoF
Padrão GoF
• Os padrões GoF são divididos em 3 grupos:
• Criação - relacionado a criação de objetos;
• Estruturais – relacionados as interações 
entre os objetos;
• Comportamentais – relacionados as ações 
sobre os objetos.
Padrões de Criação
• Criar objetos em um sistema orientado a objetos 
pode ser uma tarefa complexa:
• Definir qual classe concreta deve ser utilizada 
para criar o objeto;
• Definir quais objetos devem ser criados e 
como eles se relacionam com outros objetos 
do sistema;
Padrões de Criação
• Encapsulamento – esse princípio tem por 
objetivo isolar essa complexidade na criação dos 
objetos:
• A ideia é utilizar padrões de projeto durante a 
criação dos objetos
Padrões de Criação
Factory Method: Encapsular a escolha da classe concreta a 
ser utilizada na criação de objetos de um determinado tipo.
Abstract Factory: Encapsular a escolha das classes 
concretas a serem utilizadas na criação dos objetos de 
diversas famílias.
Builder: Separar o processo de construção de um objeto de 
sua representação e permitir a sua criação passo-a-passo. 
Diferentes tipos de objetos podem ser criados com 
implementações distintas de cada passo.
Padrões de Criação
Prototype: Possibilitar a criação de novos objetos a partir da 
cópia de objetos existentes.
Singleton: Permitir a criação de uma única instância de uma 
classe e fornecer um modo para recuperá-la.
Multiton: Permitir a criação de uma quantidade limitada de 
instâncias de determinada classe e fornecer um modo para 
recuperá-las.
Object Pool: Possibilitar o reaproveitamento de objetos.
Padrões de Projeto
Estruturais
Padrões Estruturais
 As interações entreos objetos de um sistema podem 
gerar fortes dependências
 Aumentando a complexidade de eventuais alterações do 
sistema
 Custo de manutenção aumenta
 Padrões estruturais buscam reduzir o acoplamento entre 
os objetos
Padrões Estruturais 
 Adapter – Permitir que um objeto seja substituído por outro 
que, apesar de realizar a mesma tarefa, possui uma interface 
diferente.
 Bridge – Separar uma abstração de sua representação, de 
forma que ambos possam variar e produzir tipos de objetos 
diferentes
 Composite – Agrupar objetos que fazem parte de uma relação 
parte-todo de forma a tratá-los sem distinção
 Decorator – Adicionar funcionalidades a um objeto 
dinamicamente
Padrões Estruturais
 Facade – Prover uma interface simplificada para a utilização de 
várias interfaces de um subsistema
 Front Controller – Centralizar todas as requisições a uma 
aplicação web
 Flyweight – Compartilhar, de forma eficiente, objetos que são 
usados em grande quantidade
 Proxy – Controlar as chamadas a um objeto através de outro 
objeto de mesma interface
Padrões de Projeto
Comportamentais
Padrões Comportamentais
•Descrevem padrões de comunicação entre objetos:
–Fluxos de comunicação complexos;
–Foco na interconexão entre objetos;
São baseados em
• Escopo de Classe: Herança;
• Escopo de Objeto: composição.
Padrões Comportamentais
“Preocupam-se com algoritmos e a delegação de responsabilidade entre 
objetos”

Continue navegando