View
225
Download
0
Category
Preview:
DESCRIPTION
Material sobre Análise Orientada a Objetos.
Citation preview
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Apresentações
Do Professor
Dos Alunos, com suas respectivas experiências profissionais em Orientação a Objetos
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Tópicos
Paradigma de Orientação a Objetos (OO)
Conceito dos principais elementos da OO
UML: Conceitos e os principais diagramas voltados a Análise Orientada a Objetos (AOO)
Estudo das Classes, Diagrama de Classes e Objetos, seu uso nas Fases iniciais do Projeto para identificação do Domínio da Aplicação (Classes de Negócio)
A evolução das Classes no transcorrer do projeto (do negócio até a especificação do código e ser implementado para a classe)
Conceito de reuso em OO
Padrões de Software
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Paradigmas de programação
Paradigma procedural Leva o desenvolvedor a decompor o sistema em partes
menores (funções), criando um emaranhado de inúmeras
funções que chamam umas às outras
Geralmente não há separação de conceitos e
responsabilidades, causando dependências enormes no
sistema, dificultando futuras manutenções no código do
programa. Não existe muito reaproveitamento de código,
ao contrário, muitas vezes se tem muito código duplicado
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Paradigmas de programação
Paradigma Orientação a Objetos O paradigma da OO eleva a programação (POO) e o
desenvolvimento (AOO) de sistemas para um novo patamar.
A OO é um mecanismo moderno que ajuda a definir a
estrutura de programas baseado nos conceitos do mundo real,
sejam eles reais ou abstratos
A OO permite criar programas componentizados, separando as
partes do sistema por responsabilidades e fazendo com que
essas partes se comuniquem entre si, por meio de mensagens
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Comparação Procedural X OO
Programa Classe
Processos
Propriedades
Métodos
Dados
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Principais elementos da OO Classes
Objetos
Atributos
Construtores
Métodos
Encapsulamento
Herança
Reescrita
Sobrecarga
Polimorfismo
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Classes
Uma classe é uma estrutura que abstrai um conjunto de
objetos com características similares
Exemplos
Classe de Automóveis
Classe de Funcionários de uma empresa
Classe de Livros em uma biblioteca
Classe de Livros em uma gráfica
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Objetos
Um objeto é um exemplar de uma classe
Exemplos
Civic é um objeto Classe de Automóveis
João é um objeto da Classe de Funcionários de uma empresa
Algoritmos em PHP é um objeto da classe de Livros em uma
biblioteca
97885604340770 é um objeto da Classe de Livros em uma
gráfica
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Atributos
São os elementos que caracterizam um objeto
Exemplos
Cor é um atributo para Carro
Estado civil é um atributo para Funcionário
Quantidade é um atributo para Livros
Gramatura é um atributo para Livros
Os atributos podem ter valores:
Prata é um valor para Cor
Casado é um valor para Estado Civil
5 é um valor para Quantidade
120 é um valor para Gramatura
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Métodos
São operações que visam:
introduzir (setters) ou recuperar (getters) valores dos atributos
modificar valores dos atributos
Exemplos
Pintar é um método que visa mudar o atributo Cor do objeto carro
getEstadoCivil é um método que recupera o valor do atributo Estado Civil
Vender é método que altera o atributo Quantidade
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Exemplo de uma Classe
Conta Bancária
composta por (atributos):
número
nome do Cliente
saldo
limite
O que fazemos em uma conta (métodos)
sacar um valor x
depositar um valor x
imprimir o nome do titular da conta
transferir x para a conta y
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Em Java:
class Conta {
int número;
String nome;
double saldo;
double limite;
}
class Programa {
public static void main (String [ ] args) {
Conta minhaConta = new Conta( );
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Ao criarmos uma conta, devemos introduzir valores nos atributos
class Programa {
public static void main (String [ ] args) {
Conta minhaConta = new Conta( );
minhaConta.nome = "João" ;
minhaConta.número = 123456;
minhaConta.saldo = 1000;
minhaConta.limite = 5000;
System.out.println(" Saldo = " + minhaConta.saldo);
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Podemos sacar e depositar um determinado valor, e isso é feito definindo-se dois métodos
class Conta {
int número;
String nome;
double saldo;
double limite;
void saca (double valor) {
saldo = saldo - valor;
}
void deposita (double valor) {
saldo = saldo + valor;
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
O programa principal deve ser alterado para ativar os métodos recém criados
class Programa {
public static void main (String [ ] args) {
Conta minhaConta = new Conta( );
minhaConta.nome = "João";
minhaConta.número = 123456;
minhaConta.saldo = 1000;
minhaConta.limite = 5000;
minhaConta.deposita (400);
minhaConta.saca(100);
System.out.println("Saldo = " + minhaConta.saldo);
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
O método Saca deve verificar se o saque é possível, e retornar se a operação foi realizada com sucesso
class Conta {
int número;
...
boolean saca (double valor) {
if (saldo + limite - valor > 0 ) {
saldo = saldo - valor;
return true;
} else {
return false;
}
}
void deposita (double valor) {
saldo = saldo + valor;
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
O programa principal deve testar se o saque foi possível
class Programa {
public static void main (String [ ] args) {
Conta minhaConta = new Conta( );
minhaConta.nome = "João";
minhaConta.número = 123456;
minhaConta.saldo = 1000;
minhaConta.limite = 5000;
minhaConta.deposita (400);
boolean consegui = minhaConta.saca(10000);
if (consegui) {
System.out.println("Saque realizado. Novo saldo = " + minhaConta.saldo);
} else {
System.out.println("Saldo de " + minhaConta.saldo + " insuficiente");
}
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Representação da classe Conta em UML
+ público - visível em qualquer classe # protegido - qualquer descendente pode usar - privado - visível somente dentro da classe
Conta
+número: int+nome: String +saldo: double+limite: double
+saca (valor: double): boolean+deposita(valor: double)
Os sinais na frente dos nomes das variáveis ou dos nomes dos métodos significam
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Acrescentar Método transferePara na classe Conta
class Conta {
int número;
...
boolean saca ......
......
void deposita ...
...
boolean transferePara (Conta destino, double valor) {
boolean retirou = saca(valor);
if (retirou == false) {
return false;
} else {
destino.deposita(valor);
return true;
}
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
No programa principal:
class Programa {
public static void main (String [ ] args) {
Conta conta1 = new Conta( );
conta1.nome = "João";
conta1.número = 123456;
conta1.saldo = 1000;
conta1.limite = 5000;
Conta conta2 = new Conta( );
conta2.nome = "Maria";
conta2.número = 987654;
conta2.saldo = 2000;
conta2.limite = 4000;
Segue...
Prof. Paulo Lacerdapaulo@quallyleste.com.br
boolean consegui = conta1.transferePara(conta2, 12000); if (consegui) { System.out.println("Saque realizado. Novo saldo conta1 = " + conta1.saldo); System.out.println("Novo saldo conta2 = " + conta2.saldo); } else { System.out.println("Saldo de " + conta1.saldo + " insuficiente"); } }}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Nova Representação da classe Conta em UML
Conta
+número: int+nome: String +saldo: double+limite: double
+saca (valor: double): boolean+deposita (valor: double):+transferePara (destino: Conta, valor: double) : boolean
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Nova Classe: Cliente
class Cliente {
String nome;
String sobrenome;
String endereço;
String cpf;
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Alterações na classe Conta:
class Conta {int número;double saldo;double limite;Cliente titular = new Cliente () ;
boolean saca ............void deposita ............boolean transferePara ...........
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Alterações no programa principal:
class Programa { public static void main (String [ ] args) { Conta conta1 = new Conta( ); conta1.titular.nome = "João "; ...... conta2.titular.nome = " Maria "; ......
System.out.println("Titular da conta1 = " + conta1.titular.nome); System.out.println("Titular da conta2 = " + conta2.titular.nome); }}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Representação UML das classes Conta e Cliente
Conta
+número: int+saldo: double+limite: double+titular: Cliente
+saca (valor: double): boolean+deposita(valor: double)+transferePara (destino: Conta, valor: double) : boolean
Cliente
+nome: String+sobrenome: String +endereço: String+cpf: String
Um sistema Orientado a Objetos é um grande conjunto de classes que vão se comunicar, delegando responsabilidade para quem for mais apto a realizar determinada tarefa. A classe Banco usa a classe Conta, que usa a classe Cliente, que usa a classe Endereço, etc. Dizemos que esses objetos colaboram, trocando mensagens entre si. Por isso acabamos tendo muitas classes em nossos sistemas, e elas costuma ter um tamanho relativamente curto.
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Encapsulamento
O encapsulamento protege o acesso direto
(referência) aos atributos de uma instância fora
da classe onde estes foram declarados. Esta
proteção consiste em se usar modificadores de
acesso mais restritivos sobre os atributos
definidos na classe. Depois devem ser criados
métodos para manipular de forma indireta os
atributos da classe. (Wikipédia)
Prof. Paulo Lacerdapaulo@quallyleste.com.br
O encapsulamento é feito com o uso de modificadores de acesso na declaração dos atributos e/ou métodos.
Os modificadores são:
public - Qualquer classe pode ter acesso ao atributo ou ao método
private – Apenas os métodos da própria classe podem ter acesso ao atributo ou a outros métodos da classe
protected – Apenas os métodos da própria classe ou das subclasses podem ter acesso ao atributo ou outros métodos da classe
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Classe Conta com atributos encapsulados
class Conta {
int número;
private double saldo;
private double limite;
Cliente titular = new Cliente () ;
......
O(s) programa(s) que chama(m) a classe Conta não pode(m) mais referenciar diretamente os atributos saldo nem limite. Isso agora só será possível via métodos. Daí a necessidade de se criar Getters e Setters
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Geters e Seters na classe Conta.....
double getSaldo() {
return saldo;
}
void setSaldo (double valor) {
saldo = valor;
}
double getLimite() {
return limite;
}
void setLimite(double valor) {
limite = valor;
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
No programa principal:
class Programa {
public static void main (String [ ] args) {
Conta conta1 = new Conta( );
conta1.titular.nome = "João";
conta1.número = 123456;
conta1.setSaldo(1000);
conta1.setLimite(5000);
System.out.println("Saldo = " + conta1.getSaldo( ));
System.out.println("Limite = " + conta1.getLimite( ));
}
}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Nova Representação UML das classes Conta e Cliente
Conta
+número: int+saldo: double-limite: double-titular: Cliente
+saca (valor: double): boolean+deposita(valor: double)+transferePara (destino: Conta, valor: double) : boolean+setSaldo(valor: double)+getSaldo ( ): double+setLimite(valor: double)+getLimite( ): double
Cliente
+nome: String+sobrenome: String +endereço: String+cpf: String
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Atividade 1
Esta atividade tem por objetivo modelar uma classe para Funcionário. Este deve ter nome, departamento onde trabalha, salário, data de admissão, RG, e um valor booleano que indique se ele ainda é funcionário ou se não trabalha mais na empresa.
Você deve criar alguns métodos de acordo com as necessidades que julgar conveniente para o sistema. Além desses, crie um método bonifica que aumenta o salário de acordo com um parâmetro passado como argumento. Crie também um método demite, que não recebe parâmetro algum, só modifica o valor booleano correspondente.
A. Faça a modelagem em um diagrama UML.
B. Codifique essa classe em Java
C. Crie um programa Java(simples) somente com o objetivo de testar a classe Funcionário
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Método Construtor
O método construtor é desenvolvido da mesma forma que
uma função, a única diferença é que ele tem o mesmo nome
da classe.
Isso se deve ao fato de que um objeto deve ser construído
cada vez que chamamos a classe. E a responsabilidade de
fazer isso é do construtor. Isso parte do princípio que
podemos ter dois objetos com a mesma característica, mas
que não são os mesmos objetos.
public class MinhaClasse { public MinhaClasse() { //esse é o metodo construtor System.out.println("Oi!"); } }
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Herança
Enquanto programamos em Java, há a necessidade de
trabalharmos com várias classes. Muitas vezes, classes diferentes
tem características comuns, então, ao invés de criarmos uma nova
classe com todas essas características usamos as características
de um objeto ou classe já existente.
Ou seja, herança é, na verdade, uma classe derivada de outra
classe.
class NomeDaClasseASerCriada extends NomeDaClasseASerHerdada
Importante: Java permite que uma classe herde apenas as características de uma única classe, ou seja, não pode haver heranças múltiplas. Porém, é permitido heranças em cadeias, por exemplo: se a classe Mamifero herda a classe Animal, quando fizermos a classe Cachorro herdar a classe Mamifero, a classe Cachorro também herdará as características da classe Animal.
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Sobrecarga
Java nos permite criar vários métodos com o mesmo nome
desde que tenham parâmetros diferentes. Isso é o que
chamamos de sobrecarga de métodos.
A sobrecarga de métodos consiste em criarmos o mesmo método
com possibilidades de entradas diferentes. Essas entradas,
caracterizadas como parâmetros, devem sempre ser de tipos
diferentes, quantidades de parâmetros diferentes ou posições dos
tipos diferentes. package tiexpert;
public class Eletrodomestico { private boolean ligado; private int voltagem; private int consumo;
public Eletrodomestico(boolean ligado, int voltagem, int consumo) { this.ligado = ligado; this.voltagem = voltagem; this.consumo = consumo; } // (...)}
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Sobreescrita
Diferente da sobrecarga, a sobrescrita acontece quando um método existe em uma classe pai e é reescrito na classe filha para alterar o comportamento. A assinatura do método deve ser igual na classe pai e na classe filha.
Método Sobrescrito são métodos declarados com mesmo nome em sua classe ou em suas subclasses, mas com algumas características:
•lista de argumentos iguais.•mesmo tipo de retorno (isso inclui retorno covariantes).•nível de acesso mais restritivo•não pode sobrescrever método static e marcado com final•não pode sobrescrever métodos private, ou seja, se ele não poder ser herdado, não pode ser subscrito.•não pode pode lançar exceções checadas novas mais abrangentes.•pode lançar qualquer exceção não-checadas, independente do método novo ou antigo declarar ou não a exceção.
Prof. Paulo Lacerdapaulo@quallyleste.com.br
InterfacesInterface é um recurso da orientação a objeto utilizado em Java que define ações que devem ser obrigatoriamente executadas, mas que cada classe pode executar de forma diferente.
Interfaces contém valores constantes ou assinaturas de métodos que devem ser implementados dentro de uma classe.
E por que isso?
Isso se deve ao fato que muitos objetos (classes) podem possuir a mesma ação (método), porém, podem executá-la de maneira diferente.
Usando um exemplo bem drástico, podemos ter uma interface chamada aéreo que possui a assinatura do método voar(). Ou seja, toda classe que implementar aéreo deve dizer como voar(). Portanto, se eu tenho uma classe chamada pássaro e outra chamada avião, ambas implementando a interface aéreo, então, nestas duas classes devemos codificar a forma como cada um irá voar().
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Classes Abstratas e Métodos Abstratos
Classes abstratas tem uma função importante na orientação a objeto em Java.
De forma objetiva, uma classe abstrata serve apenas como modelo para uma classe concreta (classe que comumente usamos).
Como classes abstratas são modelos de classes, então, não podem ser instanciadas diretamente com o new, elas sempre devem ser herdadas por classes concretas.
Outro fato importante de classes abstratas é que elas podem conter ou não métodos abstratos, que tem a mesma definição da assinatura de método encontrada em interfaces. Ou seja, uma classe abstrata pode implementar ou não um método.
Os métodos abstratos definidos em uma classe abstrata devem obrigatoriamente ser implementados em uma classe concreta. Mas se uma classe abstrata herdar outra classe abstrata, a classe que herda não precisa implementar os métodos abstratos.
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Modificadores de Acesso
Em programação orientada a objetos, modificador de acesso,
também chamado de visão de método ou ainda visão de atributo, é
a palavra-chave que define um atributo, método ou classe como
público (ou public, qualquer classe pode ter acesso), privado (ou
private, apenas os métodos da própria classe pode manipular o
atributo) ou protegido (ou protected, pode ser acessado apenas
pela própria classe ou pelas suas subclasses).
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Modificadores de AcessoUm atributo quando declarado com o modificador static tem a característica de "propagar o seu valor" por todas as instâncias da classe a que pertence, ou seja o seu valor será o mesmo para todas as instâncias.
palavra chave final sim, esta ajuda a implementar objetos imutáveis já que só se pode atribuir valor ao membro "final" uma única vez, e já que o compilador exige que este valor seja atribuído já no construtor da classe (caso não tenha sido atribuído já na própria declaração do membro estático)
Prof. Paulo Lacerdapaulo@quallyleste.com.br
Referências
Orientação a objetos. Disponível em <http : //www.softechnetwork.com.br/java/CursoOO.pdf >. Acesso em :11 mar. 2011.
Java e Orientação a Objetos. Disponível em <www. caelum.com.br> Acesso em 15 fev. 2009.
RUMBAUGH, James et al. Modelagem e Projetos baseados e Objetos. Rio de Janeiro: Campus, 1997.
Recommended