44
Introdução à Análise Orientada a Objetos

AOO-1 aula

Embed Size (px)

DESCRIPTION

Material sobre Análise Orientada a Objetos.

Citation preview

Introdução à Análise Orientada a Objetos

Prof. Paulo [email protected]

Apresentações

Do Professor

Dos Alunos, com suas respectivas experiências profissionais em Orientação a Objetos

Prof. Paulo [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

Comparação Procedural X OO

Programa Classe

Processos

Propriedades

Métodos

Dados

Prof. Paulo [email protected]

Principais elementos da OO Classes

Objetos

Atributos

Construtores

Métodos

Encapsulamento

Herança

Reescrita

Sobrecarga

Polimorfismo

Prof. Paulo [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

Nova Classe: Cliente

class Cliente {

String nome;

String sobrenome;

String endereço;

String cpf;

}

Prof. Paulo [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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 [email protected]

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.