poo - aula 003
TRANSCRIPT
Professor Dal Prá
Aula 003
Professor Dal Prá
Objetivos das próximas aulas
• Orientação a objetos
– Conceitos
– UML
• Como criar modelos (diagramas) que representem o que
iremos desenvolver em Java
– Como aplicar este conceitos no Java
Base para todo o restante do curso
Professor Dal Prá
Orientação a Objetos
• criada em 1967 (Simula)
• SmallTalk (Anos 70 / Xerox )
• C++ ( C com OO / AT&T)
• Atualmente
– Java
– Object Pascal (Delphi)
– .NET
– PHP
• Usar linguagem OO híbrida não garante que o sistema seja OO;
Professor Dal Prá
Orientação a Objetos
• Novo paradigma, ou seja, nova forma de
pensar
• Abstração mais próxima do mundo real
– Conta Bancária
• Atributos: saldo, limite;
• Funcionalidades: debitar, creditar, transferir;
– Não significa que será totalmente intuitivo;
• Desenvolver software não é fácil para todos;
Professor Dal Prá
Orientação a Objetos
• Padroniza o pensamento
– Análise orientada a objetos;
– Projeto orientado a objetos;
– Programação orientada a objetos (POO – OOP);
Professor Dal Prá
Orientação a Objetos
• Melhor organização do sistema
– cada objeto terá uma função específica:
• Conta Bancária: controla a movimentações do
correntista;
• Correntista: guardar informações do cliente do banco;
• Formulário: receber informações digitadas pelo usuário;
• Botão: Executar uma ação após o clique do usuário;
– Maior Produtividade (não precisa repetir uma
lógica que é de responsabilidade de outro objeto);
Professor Dal Prá
Orientação a Objetos
Alta coesão
• Objetos super especializados
– Maior reusabilidade dos objetos
– Menor impacto nas manutenções
– Maior velocidade nas manutenções
Não criar estruturas que “FAZEM TUDO”
Professor Dal Prá
Orientação a Objetos
• Um sistema orientado a objetos é um grande
diálogo entre objetos (cooperação);
Interface com o
Usuário Lógica de
Negócios da
Conta Bancaria
Acesso ao Banco
de Dados
1 - Você pode me passar o extrato do
Correntista Junior durante o período X?
2 - Você pode me
passar o meu histórico
de movimentações
durante o período X ?
3 - Ok. Ai está a lista de
movimentações.
4 – Segue o extrato do correntista.
Professor Dal Prá
Conceitos Básicos OO
• Abstração
• Classes
– Atributos
• Tipos
• Valores padrão
– Métodos
• Assinaturas
• Repostas
• Objetos
– Referência
Professor Dal Prá
Conceitos Avançados OO
• Relacionamentos
– Dependência
– Herança
• Conversões
– Associação
• Encapsulamento
– Modificadores de acessos
• Classes
• Atributos
• Métodos
– Padrão de codificação de classes no Java
Professor Dal Prá
Conceitos Avançados
• Polimorfismo
– Classes abstratas
– Interfaces
• Diminuir o acoplamento entre classes
Professor Dal Prá
Como representar estes
conceitos antes mesmo de
implementá-los?
Professor Dal Prá
Unified Modeling Language - UML
• Linguagem de Modelagem Unificada
– Linguagem: o que for “escrito” em UML deve ser entendido;
– Modelagem: imagens valem mais do que mil palavras;
– Unificada: melhores idéias entre várias técnicas (Booch, OOSE, OMT);
• Não é padrão, mas é muito utilizada;
• Pré-requisito em muitas oportunidades;
Professor Dal Prá
Unified Modeling Language - UML
• Modelos expressam
– Aspectos estáticos: informações a serem
manipuladas ou armazenadas;
– Aspectos dinâmicos: perguntas e
respostas entre objetos e mudança de
estados (mudança nos valores
armazenados nos objetos);
Professor Dal Prá
Mas para que vamos usar isso ?
• Modelar
– Compreender o que vamos fazer;
– Projetar antes de codificar;
– Documentar
– Facilitar a comunicação entre os membros da
equipe e também o cliente;
• $ em manutenção > $ desenvolvimento;
Para simplificar ...
Não vamos usar 100% da UML
Professor Dal Prá
Professor Dal Prá
Abstração
• Não é um conceito exclusivo da OO;
• Problemas do mundo real Conceitos de
programação linguagem de programação;
• Linguagem OO a torna mais fácil;
• Nomes dos objetos do mundo real serão
utilizados nos objetos que estarão dentro do
programa;
Professor Dal Prá
Abstração
• Nosso cliente pedirá:
“ Preciso controlar os saques, depósitos e
dados das contas bancárias dos meus
clientes. Preciso saber o número da
conta, o nome do cliente, qual o saldo e
o limite ”
Professor Dal Prá
Abstração
• O analista/arquiteto vai converter isso em um modelo
– UML, no caso de OO
• O Programador vai pegar o modelo definido e vai materializar ele nas linhas de códigos
– Linguagens de programação;
• Java, no nosso caso
– Ferramentas;
– Bancos de dados;
– Comunicação com periféricos;
Professor Dal Prá
Vamos abstrair o problema
de nosso cliente
Professor Dal Prá
Sistema OO é composto
por vários objetos
cooperantes, mas como
eu defino um objeto?
Professor Dal Prá
Classes
• Representa um novo tipo de dado
– Características de um objeto
UML
ContaBancaria
Podemos dizer que ...
• É o projeto que definirá como será um objeto
dentro do sistema
– Podemos fazer uma analogia ao projeto de uma casa
• Mostra como será a casa, porém não é a casa construída!
Professor Dal Prá
Professor Dal Prá
Assim se que se “declara” uma clase no Java
class NomeDaClasse {
// corpo da classe
} Arquivo: NomeDaClasse.java
Professor Dal Prá
Classes
class ContaBancaria {
}
Arquivo: ContaBancaria.java
Professor Dal Prá
Temos a classe, mas como
vamos guardar os dados
dentro desta classe?
Professor Dal Prá
Classes - Atributos
• Definem os possíveis estados do objeto
– Atributos
• Nome
• Tipo
– Valor padrão
– Valor inicial
Professor Dal Prá
Classes – Atributos
UML
ContaBancaria
numero: int
nomeCliente : String
saldo : double
limiteCredito : double = 100.0
Professor Dal Prá
Classes – Atributos
Java
// virá com o valor padrão TipoDoAtributo nomeDoAtributo; // definido um valor inicial TipoDoAtributo nomeDoAtributo = valorInicial;
Professor Dal Prá
Classes – Atributos
class ContaBancaria{
int numero;
String nomeCliente;
double saldo;
double limiteCredito = 100.0;
}
Professor Dal Prá
Classes – Atributos
• Valores default
–numéricos : 0
–boolean : false
Professor Dal Prá
Agora temos
• novo tipo de dado chamado ContaBancaria
– Poderá armazenar
• numero
• nomeCliente
• saldo
• limiteCredito
• Mas e o que ele irá fazer? Qual será a
contribuição dele para o sistema? Ele apenas
armazenará informações?
Professor Dal Prá
Classes – Métodos
• Define quais ações poderão ser executadas
– Habilidades que estarão definidas em uma classe
– Método
• Assinatura ( regra para formular uma pergunta )
– Argumentos
» Nome
» Tipo
• Retorno ( resposta à pergunta )
– Sem resposta
– Tipo
Professor Dal Prá
Classes – Métodos
ContaBancaria
numero: int
nomeCliente : String
saldo : double
limiteCredito : double = 100.0
saca ( valor : double ) : boolean;
deposita ( valor : double ) : void;
UML
Professor Dal Prá
Classes – Métodos
Java
retorno nomeMetodo(tipoArgumento nomeArgumento){
// corpo do método
}
retorno nomeMetodo(tipoArgumento1 nomeArgumento1,...,
tipoArgumentoN nomeArgumentoN){
// corpo do método
}
Professor Dal Prá
Classes – Métodos
Java
retorno nomeMetodo(tipoArgumento nomeArgumento){
// corpo do método
}
1. Sempre será necessário definir um retorno, mesmo
que seja NADA
2. O nome do método dos argumentos deverá ser
intuitivo, para facilitar a comunicação entre os
desenvolvedores
Professor Dal Prá
Classe – Métodos
class ContaBancaria { int numero;
String nomeCliente;
double saldo;
double limiteCredito = 100.0;
boolean saca(double valor) {
saldo -= valor;
return true;
}
void deposita(double valor){
saldo += valor; }
}
Professor Dal Prá
Classes – Métodos
boolean saca(double valor) {
saldo -= valor;
return true;
} 1. Tipo de retorno (resposta)
2. Nome do método (v. imperativo)
3. Argumento esperado (para formular a pergunta)
4. Executando a ação
5. Retornando o valor esperado (tipo do return tem que ser igual ao definido no método)
1 2 3
4
5
Professor Dal Prá
Classes – Métodos
void deposita(double valor){
saldo += valor;
}
1. void == sem nada ( não vai retornar
nenhum valor )
2. Nome do método
3. Argumentos
4. Executando a ação
5. Aonde está o return?
1 2 3
4
Professor Dal Prá
Classes
Definido um novo tipo de
dado, como faço para
executar ele, ou seja,
como faço para dar vida a
esta nova estrutura dentro
do sistema ?
Professor Dal Prá
Objeto
• É uma execução de uma determinada classe
– instância
Podemos dizer que ...
• É o projeto posto em prática
– É casa construída segundo o que foi definido no
projeto
Professor Dal Prá
Professor Dal Prá
Objeto
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.nomeCliente = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Professor Dal Prá
Objeto
contaJunior é uma variável
do tipo ContaBancaria, certo?
Professor Dal Prá
Objeto
• contaJunior é uma variável que guarda o ponto da
memória (um número) aonde um objeto do tipo
ContaBancaria foi criado
– Pense em um copo (variável) com um controle remoto
• Chamasse variável de referência para um objeto
– Objeto, para simplificar
Professor Dal Prá
Objeto
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.nomeCliente = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Pede para o Java reservar um
espaço na memória e criar um
novo objeto do tipo
ContaBancaria
Professor Dal Prá
Objeto
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.nomeCliente = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Guarda o endereço da memória
aonde está o OBJETO
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.nomeCliente = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Professor Dal Prá
Objeto
Navega pelo “endereço de
memória” aonde nosso objeto
está e joga valores para os
atributos dele
Professor Dal Prá
Objeto
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.nomeCliente = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Utiliza a variável que guarda
o endereço da memória aonde
está nosso objeto para poder
chamar um método, ou seja,
acionar uma habilidade do
nosso objeto
Professor Dal Prá
Objeto
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
ContaBancaria conta2 = contaJunior;
conta2.numero = 1143166;
conta2.nomeCliente = "José Dal Prá Junior";
conta2.saldo = 100.0;
conta2.limiteCredito = 10.0;
conta2.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Se eu executar este código, o
que acontece ? Por quê?
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
ContaBancaria conta2 = contaJunior;
conta2.numero = 1143166;
conta2.nomeCliente = "José Dal Prá Junior";
conta2.saldo = 100.0;
conta2.limiteCredito = 10.0;
conta2.deposita(10);
System.out.println(contaJunior.saldo);
}
}
Professor Dal Prá
Objeto
Estão apontando para o mesmo
endereço de memória!
Professor Dal Prá
Objeto
public class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
ContaBancaria conta2 = contaJunior;
// ...
System.out.println(contaJunior == conta2);
}
}
O que irá imprimir ?
Por que imprimiu este valor ?
Professor Dal Prá
Objeto
class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.nomeCliente = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
ContaBancaria mesmaConta = new ContaBancaria();
mesmaConta.numero = 1143166;
mesmaConta.nomeCliente = "José Dal Prá Junior";
mesmaConta.saldo = 100.0;
mesmaConta.limiteCredito = 10.0;
mesmaConta.deposita(10);
System.out.println(contaJunior == mesmaConta);
}
}
O que será impresso na tela?
Por que?
Professor Dal Prá
Objeto
contaJunior == mesmaConta
Está comparando se as variáveis
estão apontando para o mesmo
lugar na memória!
Professor Dal Prá
Objeto
contaJunior.numero == mesmaConta.numero
Para comparar se os objetos são
iguais, eu preciso comparar os
valores que estão armazenados
nos atributos
Isso vai mudar de CLASSE para
CLASSE
Professor Dal Prá
Objeto
Imprima o valor da expressão:
contaJunior.numero == mesmaConta.numero
Qual o resultado ?
Professor Dal Prá
Abstração
• Nosso cliente pede:
“Preciso que seja possível fazer
transferência de valores entre contas”
Professor Dal Prá
O que temos que fazer ?
Professor Dal Prá
Como ficará nosso método ?
transfere( numeroOrigem : int,
numeroDestino : int,
valor : double ) : boolean
OU
transfere( contaOrigem : ContaBancaria,
contaDestino : ContaBancaria,
valor : double) : boolean ??????
Professor Dal Prá
Ficará
transfere( destino : ContaBancaria,
valor : double ) :
boolean;
Isso por que vamos transferir
valores da conta atual para a
conta destino.
Professor Dal Prá
Classes – Métodos
UML
ContaBancaria
numero: int
nomeCliente : String
saldo : double
limiteCredito : double = 100.0
saca ( valor : double ) : boolean;
deposita ( valor : double ) : void;
transfere( destino : ContaBancaria,
valor : double ) : boolean;
Professor Dal Prá
Classes – Métodos
Java
boolean transfere( ContaBancaria destino,
double valor)
{
this.saldo -= valor;
destino.saldo += valor;
return true;
}
Professor Dal Prá
Classes – Métodos
•O que é esse this ???
•Eu posso definir um objeto
como argumento ?
boolean transfere( ContaBancaria destino, double valor) { this.saldo -= valor; destino.saldo += valor; return true; }
Professor Dal Prá
Classes – Métodos
Mas Professor, parece que eu já vi esta lógica de
diminuir um valor do saldo.
Olha, posso estar enganado, mas eu fiz uma
lógica parecida para somar um valor no saldo!
Professor Dal Prá
Classes – Métodos
Aonde estão estas lógicas já
existentes ?
Professor Dal Prá
Classes – Métodos
ContaBancaria
numero: int
nomeCliente : String
saldo : double
limiteCredito : double = 100.0
saca ( valor : double ) : boolean;
deposita ( valor : double ) : void;
transfere( destino : ContaBancaria,
valor : double ) : boolean;
Professor Dal Prá
Classes – Métodos
boolean transfere( ContaBancaria destino,
double valor) {
this.saca(valor);
destino.deposita(valor);
return true;
}
Professor Dal Prá
Classes – Métodos
Podemos melhorar a lógica
implementada na nossa
classe ContaBancaria
?
Professor Dal Prá
Classes – Métodos
boolean saca(double valor) {
if (saldo < valor) {
return false;
}
saldo -= valor;
return true;
}
Professor Dal Prá
Classes – Métodos
boolean transfere( ContaBancaria destino, double valor) {
boolean sacou = this.saca(valor);
if (!sacou) {
return false;
}
destino.deposita(valor);
return true;
}
Professor Dal Prá
Utilizando o novo método
ContaBancaria contaJunior = new ContaBancaria();
// ...
ContaBancaria contaDestino = new ContaBancaria();
boolean transferiu = contaJunior.transfere(contaDestino, 100);
if (transferiu == true)
{
System.out.println("Transferiu");
}
else
{
System.out.println("Erro na transferência");
}
System.out.println(contaJunior.titular.nome);
System.out.println(contaJunior.saldo);
Professor Dal Prá
Abstração
• Nosso cliente pede:
“ Além do nome do cliente, preciso
guardar o CPF e o sexo dele”
Professor Dal Prá
Classes - Atributos
ContaBancaria
numero: int
nomeCliente : String
saldo : double
limiteCredito : double = 100.0
CPFCliente : String
sexoCliente : boolean
saca ( valor : double ) : boolean;
deposita ( valor : double ) : void;
transfere( destino : ContaBancaria,
valor : double ) : boolean;
Professor Dal Prá
Classes - Atributos
ContaBancaria
numero: int
nomeCliente : String
saldo : double
limiteCredito : double = 100.0
CPFCliente : String
sexoCliente : boolean
saca ( valor : double ) : boolean;
deposita ( valor : double ) : void;
transfere( destino : ContaBancaria,
valor : double ) : boolean;
Uma conta tem CPF ?
Tem sexo ?
Não é muita responsabilidade para
uma pobre ContaBancaria ?
O que fazer?
Professor Dal Prá
Usando a UML
Professor Dal Prá
e fazendo isso com Java
class Cliente {
String nome;
String CPF;
boolean sexo;
}
Professor Dal Prá
Aonde vou colocar as duas classes?
• Diagrama de classes
– Vai mostrar as classes que fazem parte do sistema
• Atributos
• Métodos
– Relacionamento entre elas
Professor Dal Prá
Classes - Relacionamentos
Como posso representar a ligação entre as classes
?
Professor Dal Prá
Classes - Associação
Este é um relacionamento de ASSOCIAÇÃO
Está IMPLÍCITO que existirá
um atributo do tipo Cliente
dentro de ContaBancaria e
também que terá um atributo
do tipo ContaBancaria dentro
de Cliente
Professor Dal Prá
Classes - Associação
Mas e se eu quiser mudar o nome
dos atributos ?
Professor Dal Prá
Classes – Associação
ContaBancaria terá um
atributo titular do tipo
Cliente. E Cliente terá um
atributo conta do tipo
ContaBancaria.
Professor Dal Prá
Classes – Associação
class ContaBancaria {
int numero;
double saldo;
double limiteCredito = 100;
Cliente titular;
}
Professor Dal Prá
Classes – Associação
class Cliente {
String nome;
String CPF;
boolean sexo;
ContaBancaria conta;
}
Professor Dal Prá
Mudando nosso código
class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.titular = new Cliente();
contaJunior.titular.nome = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.titular.nome);
System.out.println(contaJunior.saldo);
}
}
Professor Dal Prá
E se eu não criar um Cliente para a contaJunior?
class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
// contaJunior.titular = new Cliente();
contaJunior.titular.nome = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.titular.nome);
System.out.println(contaJunior.saldo);
}
}
Professor Dal Prá
Classes – Atributos
• Atributos do tipo “variável de referência” tem
como valor default null
– não está apontando para nenhum ponto da memória
Professor Dal Prá
Classes – Associação
class ContaBancaria {
int numero;
double saldo;
double limiteCredito = 100;
Cliente titular = new Cliente();
}
Professor Dal Prá
Mudando nosso código
class Programa {
public static void main(String[] args) {
ContaBancaria contaJunior = new ContaBancaria();
contaJunior.numero = 1143166;
contaJunior.titular.nome = "José Dal Prá Junior";
contaJunior.saldo = 100.0;
contaJunior.limiteCredito = 10.0;
contaJunior.deposita(10);
System.out.println(contaJunior.titular.nome);
System.out.println(contaJunior.saldo);
}
}
Comentários no código fonte
• Lembre-se: o melhor comentário é o seu
próprio código fonte
– Se você precisar de comentários em quantidade
exagerada, deve existir algum problema na
implementação (código confuso)
Professor Dal Prá
Comentários no código fonte
// cometário de linha
/*
comentário de bloco
*/
/**
Comentário de método, que pode gerar HTML com a documentação das classes
*/
Professor Dal Prá
Alguns exemplos de javadocs de frameworks
http://docs.oracle.com/javase/6/docs/api/
http://docs.jboss.org/hibernate/orm/3.5/api/
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/
http://joda-time.sourceforge.net/apidocs/index.html
http://hc.apache.org/httpclient-3.x/apidocs/
Professor Dal Prá
Vamos documentar nosso código
• Digitar documentação nos métodos feitos
• Ver que o Eclipse mostrar esta documentação
• Exportar documentação
Professor Dal Prá
Professor Dal Prá
Ferramente UML
• Jude Community
• Instalar
• Construir o Diagrama de Classes das classes
que já abstraímos
Professor Dal Prá
Exercícios
1. Modele um funcionário. Ele deve ter pelo menos o nome do funcionário, o departamento onde trabalha (String), seu salário (double), a data de entrada no banco (String), seu RG (String) e um valor booleano que indique se o funcionário está na empresa no momento ou se já foi embora. Você deve criar alguns métodos de acordo com sua necessidade. Além deles, crie um método bonifica que aumenta o salario do funcionário de acordo com o parâmetro passado como argumento. Crie, também, um método demite, que não recebe parâmetro algum, só modifica o valor booleano indicando que o funcionário não trabalha mais aqui. A idéia aqui é apenas modelar, isto é, só identifique que informações são importantes e o que um funcionário faz. Desenhe no Jude Community tudo o que um Funcionario tem e tudo que ele faz.
Professor Dal Prá
Exercícios
2. Implemente o que foi definido no diagrama
Dica:
– Crie a classe, compile
– Crie os atributos, compile
– Crie um método, compile
– Crie outro método, compile
Professor Dal Prá
Exercícios
3. Crie uma classe TestaFuncionario, com um
método main, para que possamos criar um
objeto do tipo funcionário e testa-lo;
Professor Dal Prá
Exercícios
4. Crie um método “mostra” para a classe
Funcionario. Este método deverá
imprimir uma mensagem de
apresentação do funcionário com todas
as informações que a classe armazena.
Não será passado nenhum parâmetro
para o método e não será necessário
retornar nenhum valor.
Professor Dal Prá
Exercícios
5. Dentro da classe para teste, crie pelo
menos 3 funcionários, atribua valores
para eles e execute pelo menos uma vez
cada método.
Professor Dal Prá
Bibliografia
• Apostila – Capitulo 2
Mão na massa!
https://gist.github.com/1391412