poo - aula 003

Post on 26-Jun-2015

933 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related