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