• Nenhum resultado encontrado

Classes. class Cliente { };

N/A
N/A
Protected

Academic year: 2021

Share "Classes. class Cliente { };"

Copied!
31
0
0

Texto

(1)
(2)

Geração de Código

• Uma vez definidos os diagramas de colaboração e o diagrama de classes de projeto, a geração de código é uma tarefa passível de automatização.

• Trata-se aqui de gerar o código das classes

correspondentes à camada de domínio da aplicação, ou seja, as classes que realizam toda a lógica do sistema a partir das operações de sistema.

• As demais camadas (persistência, interface, etc.) são geradas em outra fase do processo.

• Pode-se admitir, porém, que, uma vez gerada a camada de domínio, todas as demais camadas serão derivadas e dependentes desta.

(3)

Classes

class Cliente {

};

(4)

Atributos

class Cliente {

private String nome; private Float debito; private Integer idade; }

(5)

Métodos para alterar e acessar

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; } }

(6)

Porque não usar atributos

públicos?

• Deve-se observar que para viabilizar o funcionamento do mecanismo de persistência é fundamental que os

atributos sejam acessados e modificados unicamente pelas operações de alteração e consulta.

• Em hipótese alguma outro método, mesmo métodos da própria classe poderão acessar ou alterar estas variáveis diretamente.

• Isso acontece porque quando da implementação do

mecanismo de persistência será necessário ter controle sobre qualquer alteração sofrida pelos objetos, para

verificar se estão inconsistentes com o banco de dados.

• A melhor forma de garantir isso é sabendo exatamente quais os pontos do código onde os atributos são

(7)

Associações

As associações do DCP são transformadas em

variáveis de instância, da mesma forma que os

atributos, e terão métodos para alteração e

consulta.

Os atributos geram sempre variáveis cujos tipos

são básicos (alfanuméricos)

As associações geram tipos que são classes de

objetos ou estruturas de dados.

Considerando as diferentes multiplicidades de

papel e outras características das associações,

haverá algumas distinções a fazer quanto aos

métodos associados.

(8)

Associações devem

implementar no mínimo

• Um método para criar ou redefinir a associação

• Um método para remover a associação (exceto para associações para 1)

(9)

Acesso aos elementos das

coleções

• Em relação aos métodos que consultam associações com multiplicidade *, observou-se nos diagramas de

colaboração que as mensagens de consulta do tipo

getClienteComNome eram enviadas à coleção em si.

• Porém, é indesejável implementar esta consulta desta maneira, pois visto que este método é específico da

coleção de clientes, seria necessário especializar a classe genérica com a estrutura de dados que representa a

coleção para cada um dos tipos de valor que ela pudesse conter.

• Assim, a aplicação teria classes como

ColecaoDeClientes, ColecaoDeFitas, ColecaoDeEmprestimos, etc.

• Essa abordagem é inconveniente pela proliferação de estruturas praticamente idênticas.

(10)

Como resolver este problema

Uma opção para evitar esse efeito indesejável é

implementar o método de consulta na classe

que está na origem da associação.

Assim, ao invés de implementar

getClienteComNome

em uma subclasse de

Colecao, implementa-se este método na classe

Videolocadora

visto esta estar na origem da

associação.

Desta forma, tanto associações quanto atributos

são consultados por métodos da classe

prefixados com get.

(11)

Associação unidirecional para

1

• A associação unidirecional para 1, deve ser armazenada em uma variável de instância na classe de origem da associação e seu tipo deve ser a classe de destino.

• Assim, uma associação unidirecional para 1 de

ItemDeEmprestimo para Emprestimo corresponderá a uma variável de instância na classe ItemDeEmprestimo declarada com tipo Emprestimo.

(12)

Associação unidirecional para

1

Como associação é estritamente para 1, então

não é possível destruir a associação, e, portanto,

o método para destruir a associação não deve

ser implementado.

Como a associação para 1 é obrigatória para o

objeto na origem, o método criador da classe

deve ter como parâmetro o elemento a ser

associado para que desde o momento da criação

todas as instâncias da classe na origem da

(13)

Associação unidirecional para

1

class ItemDeEmprestimo {

private Emprestimo emprestimo;

public ItemDeEmprestimo(Emprestimo emprestimo) { this.associaEmprestimo(emprestimo )

}

public void associaEmprestimo(Emprestimo emprestimo) { this.emprestimo = emprestimo;

}

public Emprestimo getEmprestimo() { return emprestimo;

} }

(14)

Associação Unidirecional para

0..1

• É possível destruir a associação e, portanto 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.

(15)

Associação Unidirecional para

0..1

class Venda {

private Pagamento pagamento; public Venda() { }

public void associaPagamento(Pagamento pagamento) { this.pagamento = pagamento;

}

public void desassociaPagamento() { this.pagamento = null;

}

public Pagamento getPagamento() { return pagamento;

} }

(16)

Associação Unidirecional para

*

(17)

Associação Unidirecional para

*

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); }

(18)

Um método alternativo para

acesso

public Set getEmprestimosNaData(Date data) { private Set empND = new HashSet(); private Emprestimo atual;

Iterator inter = emprestimos.iterator(); while (inter.hasNext()) {

atual = (Emprestimo) inter.next(); if (atual.data().equals(data)) { empND.add(atual); }; }; return empND; }

(19)

class Videolocadora {

private List reservas = new ArrayList(); public Videolocadora() { }

public void adicionaReserva(Reserva reserva, int posicao) { 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);

} }

Associação

Unidirecional

<<ordered>>

(20)

class Videolocadora {

private Map cadastro = new HashMap(); public Videolocadora () { }

public void adicionaNoCadastro(Cliente cliente) { this.cadastro.put(cliente.getNome(), cliente); }

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); }

}

Associação

Unidirecional

Qualificada

(21)

Associação

Unidirecional

com Classe de

Associação

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)

} }

(22)

Associação Unidirecional com

Multiplicidade 1 na Origem

• a destruição da associação só será possível quando o objetivo for também destruir o objeto no destino da associação

• No caso de associações de 1 para 0..1 ou de 1 para 1 deve-se tomar este mesmo cuidado em relação à operação de

(23)

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; }

(24)

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 != null) { this.cliente.removeEmprestimoAux(this); }; this.associaClienteAux(cliente); cliente.adicionaEmprestimoAux(this); }

public Cliente getCliente() { return cliente;

} }

(25)

Método Delegado

• Deve-se sempre observar o diagrama de colaboração onde ele apareceu.

Toda mensagem com número x, que chega a uma instância 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.

(26)

Métodos Delegados e

Operações de Sistema

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); }

(27)

class Cliente {

private Emprestimo emprestimoAberto; public void emprestaFita(Fita f) {

if (this.getEmprestimoAberto() == null) { this.criaNovoEmprestimo(); }; this.getEmprestimoAberto().criaNovoItem(f); } }

(28)

class Cliente {

private Emprestimo emprestimoAberto; public void criaNovoEmprestimo() {

private Emprestimo e = new Emprestimo(); this.associaEmprestimoAberto(e);

e.setData(Sistema.dataDeHoje()); e.setValorTotal(0);

} }

(29)

class Emprestimo {

private Set itensDeEmprestimo = new HashSet(); public void criaNovoItem(Fita f) {

ItemDeEmprestimo it = new ItemDeEmprestimo(f); this.associaItem(it);

this.setValorTotal(this.getValorTotal()+it.getValor()); }

(30)

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()); }

(31)

Até que ponto desenvolver os

diagramas de colaboração?

Desenvolver o diagrama até chegar às

mensagens 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, 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.

Referências

Documentos relacionados

A hipótese nula sobre o parâmetro 1 ser adquirido de forma competitiva foi rejeitada ao nível de significância de 1%, e para os demais itens de custo, água e energia, a

Considerando a formação da equipe de trabalho, o tempo de realização previsto no projeto de extensão e a especificidade das necessidades dos catadores, algumas

O Município de João Neiva, Estado do Espírito Santo, através da Secretaria Municipal de Administração – SEMAD, sediada na Av. Presidente Vargas,

Convênio de colaboração entre o Conselho Geral do Poder Judiciário, a Vice- Presidência e o Conselho da Presidência, as Administrações Públicas e Justiça, O Ministério Público

Recursos humanos Formadores da ANAFS, apoiados pela equipa do RSBLISBOA, equipa do GIPS/GNR e equipa do Gabinete da GEBALIS, para apoio nas instalações quer da formação teórica, quer

• Os lugares devem estar marcados, de forma a assegurar o máximo de distanciamento Zsico possível (1,5 a 2 m) entre as crianças; • Será realizada a adequada descontaminação

No código abaixo, foi atribuída a string “power” à variável do tipo string my_probe, que será usada como sonda para busca na string atribuída à variável my_string.. O

Assim, este estudo buscou identificar a adesão terapêutica medicamentosa em pacientes hipertensos na Unidade Básica de Saúde, bem como os fatores diretamente relacionados