21
Contratos Modelagem Funcional Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Embed Size (px)

Citation preview

Page 1: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

ContratosModelagem Funcional

Prof. Dr. Daniel D. AbdalaBaseada nas transparências de professor Leandro Becker

Page 2: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Contratos – Modelagem Funcional

Contratos são a forma de detalhar como as operações e consultas do sistema devem ocorrer;

Podem ser descritos de maneira informal (textual) ou de maneira não ambígua (pseudo-código)

Utilizam os casos de uso expandidos ou diagramas de seqüência e a modelagem conceitual;

Page 3: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Contrato de Operação de Sistema

Um contrato de operação do sistema nada mais é que um texto estruturado composto pelas seguintes partes:• Pré-condições;• Pós-condições;• Exceções.

Especifica em que estado o sistema deve estar para que a operação possa ocorrer;

Especifica em que estado o sistema deve ser deixado uma vez que a operação chega ao seu termino;

Especifica como o sistema deve se comportar em situações excepcionais.

Page 4: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Contrato de Consulta de Sistema

Um contrato de consulta do sistema nada mais é que um texto estruturado composto pelas seguintes partes:• Pré-condições;• Resultados.

Especifica em que estado o sistema deve se encontrar para que a consulta possa ocorrer;

Especifica quais serão os resultados produzidos/retornados pela consulta.

Page 5: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Tipos de Pré-condições

Garantia de parâmetros: pré-condições que garantem que os parâmetros da operação ou consulta correspondem a elementos válidos do sistema de informação

Restrição complementar: pré-condições que garantem que a informação se encontra em uma determinada situação desejada

Page 6: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Em um contexto não ambíguo

é possível simplificar a escrita da pré-condição

Classe Videolocadora

operação: identificaCliente(nomeCliente:String)

pré:

Existe um Cliente cujo nome é igual a nomeCliente.

self.cadastroexists(nome=nomeCliente)

Page 7: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Restrição complementar exemplo: se o modelo conceitual

especifica que uma associação tem multiplicidade de papel 0..1, uma pré-condição complementar poderá especificar que, para uma instância específica, a associação efetivamente existe (ou não existe) ;

uma pré-condição nunca poderá contradizer as especificações do modelo conceitual, apenas complementá-las.

Page 8: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Exemplo

Classe Videolocadora

operação: identificaCliente(nomeCliente:String)

pré:

Existe um Cliente cujo nome é igual a nomeCliente.

Este Cliente possui débito igual a zero.

Alias: cliente = self.cadastroselect(nome=nomeCliente)Pré:

clientesize() == 1cliente.debito == 0

Page 9: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Diagrama de seqüência

com exceções

Operação: identificaCliente(nome:String)Alias: cliente = self.cadastroselect(nome=nomeCliente)

Pré: -

Exceções:

“Nome invalido” se clientesize == 0

“Cliente com debito” se cliente.debito != 0

Page 10: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Pós-condições semânticas Instância: criação e destruição Associação: criação e destruição Atributo: modificação de valor

Page 11: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Criação de uma instância e sua associação com outra instância preexistente

Pós: foi criado um Cliente e associado à Videolocadora

Pós: cliente = Cliente.new() self.addToCadastro(cliente).

Page 12: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Criação de uma associação entre duas instâncias

Pós: O cliente cujo nome é nomeCliente foi associado à VideoLocadora como clienteCorrente

Alias: cliente = self.cadastroselect(nome=nomeCliente) Pós: self.clienteCorrente = cliente

Page 13: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Pós-condição condicional

Pós: se não havia nenhum emprestimoAberto associado ao clienteCorrente, então um novo Emprestimo foi criado e associado ao clienteCorrente como emprestimoAberto.

Pós: self.clienteCorrente.emprestimoAberto@presize==0 IMPLIES self.clienteCorrente.emprestimoAberto=Emprestimo.new()

Page 14: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Contrato para Inserção

Classe Videolocadora

operação: cadastraCliente(nomeC,enderecoC,telefoneC:String)

pré:

Não existe nenhum Cliente com nome = nomeC.

pós:

Foi criado um Cliente e adicionado ao cadastro.

Os atributos nome, endereco e telefone do Cliente foram alterados para nomeC, enderecoC e telefoneC.

O atributo debito do Cliente foi alterado para 0,00.

Page 15: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Em OCL

Classe Videolocadora

operação: cadastraCliente(nomeC,enderecoC,telefoneC:String)

pré:

self.cadastro select(nome=nomeC) size==0

pós:

cliente = Cliente.new()

self.addToCadastro(cliente)

cliente.nome = nomeC

cliente.endereco = enderecoC

cliente.telefone = telefoneC

cliente.debito = 0

Page 16: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Outras Consultas e Operações (específicas dos casos de uso)

Freqüentemente haverá uma cadeia de execução ao longo de um dos fluxos, explicitada no diagrama de seqüência.

Verificar:• Qual é o objetivo de cada operação? • O que cada uma delas espera que tenha sido

produzido pelas anteriores? • O que cada uma delas produz? • Que exceções poderiam ocorrer durante a

execução?

Page 17: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Exemplo

Page 18: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Classe Videolocadora

operação: identificaCliente(nomeC:String)

alias:

cliente = self.cadastro select(nome=nomeC)

pré:

cliente size() == 1

self.clienteCorrente size() == 0

pós:

self.setClienteCorrente(cliente)

Page 19: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Classe Videolocadora operação: emprestaFita(codigoF:String) alias: fita = self.fitas select(codigo=codigoF) pré: self.clienteCorrente size() == 1 fita size() == 1 pós:

self.clienteCorrente.emprestimoAberto size() == 0 IMPLIES emprestimo = Emprestimo.new() emprestimo.data = today() emprestimo.valorTotal = 0 self.clienteCorrente.setEmprestimoAberto(emprestimo) item = ItemDeEmprestimo.new() emprestimo.addItem(item) estado = EmAndamento.new() item.addEstado(estado) estado.setFita(fita) item.setPrazo(fita.filme.tipoDeFilme.prazo) item.setValor(fita.filme.tipoDeFilme.valor) emprestimo.setValorTotal(emprestimo.valorTotal@pre + item.valor)

Page 20: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Fluxo de trabalho:

1. Expandir cada caso de uso e fazer o diagrama de seqüência.

2. Fazer o modelo conceitual.3. Escrever os contratos das

operações e consultas do caso de uso.

Page 21: Prof. Dr. Daniel D. Abdala Baseada nas transparências de professor Leandro Becker

Exercício: contrato empréstimo