12/08/2009
Objetivos
♦ Modelagem de classes e associações
♦ Separação entre Interface e Domínio.
♦ Modelagem de comportamento em UML: diagrama de
Modelagem e Programação
Orientada a Objetos
colaboração
Atributos
Métodos para alterar e acessar
class Cliente {
private
i t String
St i nome;
private Float debito;
private Integer idade;
}
class Cliente {
private String nome;
private Float debito;
private Integer idade;
public void setNome(String nome) { this.nome = nome; }
public void setDebito(Float debito) { this.debito = debito; }
public void setIdade(Integer idade) { this.idade = idade; }
public String getNome() { return nome; }
public Float getDebito() { return debito; }
public Integer getIdade() { return idade; }
}
Associações devem implementar
no mínimo
Associação unidirecional para 1
♦ Um método para criar ou redefinir a
♦ Deve ser armazenada em uma variável de
associação
♦ Um método para remover a associação
(exceto para associações para 1)
♦ Um método para obter objetos associados
instância na classe de origem da associação
e seu tipo deve ser a classe de destino.
♦ Assim,, uma associação
ç unidirecional para
p 1
de ItemDeEmprestimo para Emprestimo
corresponderá a uma variável de instância
na classe ItemDeEmprestimo declarada
com tipo Emprestimo.
1
12/08/2009
Associação unidirecional para 1
Associação Unidirecional para
0..1
♦ É possível destruir a associação e, portanto
class
l
It
ItemDeEmprestimo
D E
ti
{
private Emprestimo emprestimo;
public ItemDeEmprestimo(Emprestimo emprestimo) {
this.associaEmprestimo(emprestimo )
}
public void associaEmprestimo(Emprestimo emprestimo) {
this.emprestimo = emprestimo;
}
public Emprestimo getEmprestimo() {
return emprestimo;
}
deve ser implementado o método
correspondente.
♦ Não é necessário passar um objeto como
parâmetro para o método criador, pois a
associação para 0..1 não é obrigatória.
}
Associação Unidirecional para
0..1
Associação Unidirecional para
0..1
class
l
V
Venda
d {
private Pagamento pagamento;
class
l
V
Venda
d {
private Pagamento pagamento;
public Venda() { }
public void associaPagamento(Pagamento pagamento) {
this.pagamento = pagamento;
}
public void desassociaPagamento() {
this.pagamento = null;
}
public Pagamento getPagamento() {
return pagamento;
}
public Venda() { }
public void associaPagamento(Pagamento pagamento) {
this.pagamento = pagamento;
}
public void desassociaPagamento() {
this.pagamento = null;
}
public Pagamento getPagamento() {
return pagamento;
}
}
}
Associação Unidirecional para *
Associação Unidirecional para *
♦ Corresponde à implementação de um
conjunto
class Cliente {
private Set emprestimos = new HashSet();
public Cliente () { }
public void adicionaEmprestimo(Emprestimo emprestimo) {
this.emprestimos.add(emprestimo);
}
public void removeEmprestimo(Emprestimo emprestimo) {
this.emprestimos.remove(emprestimo);
}
public Set getEmprestimos () {
return Collections.unmodifiableSet(emprestimos);
}
}
2
12/08/2009
Associação
Unidirecional
<<ordered>>
Um método alternativo para
acesso
public Set getEmprestimosNaData(Date data) {
private Set empND = new HashSet();
private Emprestimo atual;
class Videolocadora {
private List reservas = new ArrayList();
public Videolocadora() { }
public void adicionaReserva(Reserva reserva, int posicao) {
(p
)
this.reservas.add(posicao,reserva);
}
public void removeReserva(Reserva reserva) {
this.reservas.remove(reserva);
}
public void removeReservaNaPosicao(int posicao) {
this.reservas.remove(posicao);
}
public List getReservas() {
return Collections.unmodifiableList(reservas);
}
public Reserva getReservaNaPosicao(int posicao) {
return (Reserva) reservas.get(posicao);
}
Iterator inter = emprestimos.iterator();
while (inter.hasNext()) {
atual = (Emprestimo) inter.next();
if (atual.data().equals(data)) {
empND.add(atual);
};
};
return empND;
}
}
Associação
Unidirecional
Qualificada
Associação
Unidirecional
com Classe de
Associação
class Videolocadora {
private Map cadastro = new HashMap();
public Videolocadora () { }
public void adicionaNoCadastro(Cliente cliente) {
p (
g
() cliente);
)
this.cadastro.put(cliente.getNome(),
}
public void removeDoCadastro(Cliente cliente) {
this.removeDoCadastroPorNome(cliente.getNome());
}
public void removeDoCadastroPorNome(String nome) {
this.cadastro.remove(nome);
}
public Collection getCadastro(){
return cadastro.values();
}
public Cliente getCliente(String nome) {
return (Cliente) cadastro.get(nome);
}
}
class Pessoa {
private Map empresas = new HashMap();
public Pessoa() { }
public void adicionaEmpresa(Empresa empresa) {
this.empresas.put(empresa, new Emprego());
}
public void removeEmpresa ( Empresa empresa ) {
this.empresas.removeKey(empresa);
}
public void removeEmprego ( Emprego emprego ) {
this.empresas.removeValue(emprego);
}
public Set getEmpresas () {
return empresas.keys() ;
}
public Set getEmpregos () {
return empresas.values() ;
}
public Emprego getEmpregoNaEmpresa ( Empresa empresa ) {
return empresas.at(empresa)
}
}
Associação Unidirecional com
Multiplicidade 1 na Origem
♦ a destruição da associação só será possível
Associação
Bidirecional
class Cliente {
private Set emprestimos = new HashSet();
public Cliente () {}
public void adicionaEmprestimoAux(Emprestimo emprestimo) {
emprestimos.add(emprestimo);
}
public void removeEmprestimoAux(Emprestimo emprestimo) {
emprestimos.remove(emprestimo);
}
public void adicionaEmprestimo(Emprestimo emprestimo) {
if (emprestimo.getCliente() != null) {
emprestimo.getCliente().removeEmprestimoAux(emprestimo);
};
this.adicionaEmprestimoAux(emprestimo);
emprestimo.associaClienteAux(this);
}
public void removeEmprestimo(Emprestimo emprestimo) {
this.removeEmprestimoAux(emprestimo);
emprestimo.destroi();
}
public Set getEmprestimos() {
return emprestimos;
}
quando o objetivo for também destruir o
objeto no destino da associação
♦ No caso de associações de 1 para 0..1
0 1 ou de
1 para 1 deve-se tomar este mesmo cuidado
em relação à operação de
criação/redefinição de associação
}
3
12/08/2009
Diagrama de Colaboração UML
class Emprestimo {
private Cliente cliente;
public Emprestimo(Cliente cliente) {
this.associaCliente(cliente);
}
public void associaClienteAux(Cliente cliente) {
this.cliente = cliente;
}
public void associaCliente(Cliente cliente) {
if (this.cliente
(thi li t !=
! null)
ll) {
this.cliente.removeEmprestimoAux(this);
};
this.associaClienteAux(cliente);
cliente.adicionaEmprestimoAux(this);
}
public Cliente getCliente() {
return cliente;
}
♦ Representa a interação entre os objetos, i.e.,
as chamadas de métodos entre eles
♦ Toda
T d mensagem com número
ú
x, que chega
h
a uma instância
i tâ i
da classe A deve ser implementada como a seqüência das
mensagens x.1, x.2, ..., x.n, que saem da instância de A e
são enviadas a outros objetos.
}
Métodos Delegados e Operações
de Sistema
class Cliente {
private Emprestimo emprestimoAberto;
public void emprestaFita(Fita f) {
if (this.getEmprestimoAberto() == null) {
this.criaNovoEmprestimo();
};
this.getEmprestimoAberto().criaNovoItem(f);
}
class Videolocadora {
private Cliente clienteCorrente;
private Map acervo = new HashMap();
public void emprestaFita(String codigoF) {
private Fita f;
f = this.getFita(codigoF);
clienteCorrente.emprestaFita(f);
}
}
}
class Cliente {
private Emprestimo emprestimoAberto;
class Emprestimo {
private Set itensDeEmprestimo = new HashSet();
public void criaNovoItem(Fita f) {
ItemDeEmprestimo it = new ItemDeEmprestimo(f);
public void criaNovoEmprestimo() {
private Emprestimo e = new Emprestimo();
this.associaEmprestimoAberto(e);
e.setData(Sistema.dataDeHoje());
e.setValorTotal(0);
this.associaItem(it);
this.setValorTotal(this.getValorTotal()+it.getValor());
}
}
}
}
4
12/08/2009
Até que ponto desenvolver os
diagramas de colaboração?
♦ Desenvolver o diagrama até chegar às mensagens
class ItemDeEmprestimo {
private EstadoDeItemDeEmprestimo estado;
public ItemDeEmprestimo(Fita f) {
EmAndamento estado = new EmAndamento(f);
this.associaEstado(estado);
this.setPrazo(f.getFilme().getTipoDeFilme().getPrazo());
this.setValor(f.getFime().getTipoDeFilme().getValor());
}
}
básicas de criação e destruição de instâncias e de
associações e de mudança de valor de atributo.
♦ Essas mensagens básicas são normalmente
terminais no diagrama de colaboração,
colaboração sendo as
mensagens intermediárias as mensagens
delegadas.
♦ Faz-se exceção, porém ao caso da operação de
criação de instâncias que, conforme foi visto, pode
implementar outras mensagens básicas à guisa de
inicialização dos atributos e associações do objeto
sendo criado.
Resumindo
Bibliografia
♦ Revisão de técnicas para implementação de
♦ Raul Sidnei Wazlawick, “Análise e Projeto
associações
♦ Modelagem de colaborações
♦ Seperação
S
ã entre interface
i
f
e domínio
d í i
de Sist. de Informação Orient. a Objetos”,
Ed. Campus, 2004. Cap. 8
5
Download

Modelagem e Programação Orientada a Objetos Objetivos Atributos