Contratos

52
Contratos Modelagem Funcional

description

Contratos. Modelagem Funcional. Modelagem Funcional. Especificação das funções externas do sistema Operações de Sistema - inputs Consultas de Sistema - outputs. Artefatos necessários. Modelo conceitual Diagramas de seqüência ou casos de uso expandidos. Contrato de Operação de Sistema. - PowerPoint PPT Presentation

Transcript of Contratos

Page 1: Contratos

Contratos

Modelagem Funcional

Page 2: Contratos

Modelagem Funcional

Especificação das funções externas do sistema Operações de Sistema - inputs Consultas de Sistema - outputs

Page 3: Contratos

Artefatos necessários

Modelo conceitual Diagramas de seqüência ou casos de

uso expandidos

Page 4: Contratos

Contrato de Operação de Sistema Pré-condições Pós-condições Exceções

Page 5: Contratos

Contrato de Consulta de Sistema Pré-condições Resultados

Page 6: Contratos

Pré-condições

definem o que deve ser verdadeiro na estrutura da informação armazenada para que a operação ou consulta possa ser executada

elas não serão testadas durante a execução algum mecanismo externo deverá garantir

sua validade antes de habilitar a execução da operação ou consulta de sistema correspondente

Page 7: Contratos

Pós-condições

estabelecem o que uma operação de sistema muda na estrutura da informação armazenada

Page 8: Contratos

Resultados

Conjunto de informações retornado por uma consulta

Page 9: Contratos

Exceções

eventos que, se ocorrerem, impedem o prosseguimento correto da operação

usualmente não podem ser garantidas a priori

serão testadas durante a execução

Page 10: Contratos

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 11: Contratos

Pré-condição de garantia de parâmetros é semântica Verificações sintáticas são feitas por

tipagem Ex.: Ao invés de escrever “x deve ser

maior do que zero”, usar x:InteiroPositivo na declaração do parâmetro

Uma pré-condição é semântica se para testa-la for necessário consultar informações gerenciadas pelo sistema

Page 12: Contratos

Garantia de Parâmetros

Classe Videolocadora

operação: identificaCliente(nomeCliente:String)

pré:

Existe uma instância da classe Cliente tal que o atributo nome desta instância é igual ao parâmetro nomeCliente.

self.cadastroexists(cliente|cliente.nome=nomeCliente)

Page 13: Contratos

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 14: Contratos

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 15: Contratos

Tipos de restrições complementares Existe (ou não existe) uma instância (ou um conjunto

de instâncias) com determinadas propriedades. Todas as instâncias (ou nenhuma das instâncias) de

uma determinada classe (ou um conjunto definido por uma associação) têm determinadas propriedades.

Uma associação não obrigatória (com multiplicidade de papel 0..1 ou *) existe (ou não existe) entre determinadas instâncias.

Um determinado atributo de uma instância tem um certo valor.

Page 16: Contratos

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() == 1

cliente.debito == 0

Page 17: Contratos

Como garantir pré-condições

Considere a seguinte interface

Page 18: Contratos

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 19: Contratos

Convertendo uma possível exceção em pré-condição Interface modificada

Page 20: Contratos

DS modificado para garantir uma pré-condição

Operação: identificaCliente(nome:String)

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

Pré: clientesize() == 1

Exceções:

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

Page 21: Contratos

DS modificado para garantir ambas

Operação: identificaCliente(nome:String)

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

Pré:

clientesize() == 1

cliente.debito == 0

Exceções: -

Page 22: Contratos

Associações temporárias

são usadas para representar informações que não precisam persistir

Page 23: Contratos

Uso da associação temporária no contrato

Classe Videolocadora

operação: emprestaFita(codigoFita:String)

pré:

Existe um clienteCorrente.

self.clienteCorrentesize()==1

Page 24: Contratos

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 25: Contratos

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 26: Contratos

Destruição de uma instância

Pós: “foi destruído um Cliente cujo nome é igual a nomeCliente”.

Presume-se que quando uma instância é destruída, todas as associações ligadas a ela também o sejam. Deve-se tomar cuidado com questões estruturais (associações obrigatórias) quando um objeto é destruído.

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

Pós:

self.cadastroremove(cliente)

cliente.destroy()

Page 27: Contratos

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 28: Contratos

Destruição de uma associação

Pós: foi destruída a associação de VideoLocadora com clienteCorrente

Pós: self.setClienteCorrente(null)

Page 29: Contratos

Modificação do valor de um atributo de uma instância

Pós: O débito do cliente corrente foi alterado para R$50,00

Pós: self.clienteCorrente.debito = 50

Page 30: Contratos

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 31: Contratos

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 32: Contratos

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 33: Contratos

Contrato para Alteração

Classe Videolocadora

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

pré:

Existe um Cliente com nome = nomeC.

pós:

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

Page 34: Contratos

Em OCL

Classe Videolocadora

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

alias:

cliente = self.cadastro select(nome=nomeC)

pré:

cliente size() == 1

pós:

cliente.endereco = enderecoC

cliente.telefone = telefoneC

Page 35: Contratos

Contrato para Exclusão

Classe Videolocadora

operação: excluiCliente(nomeC:String)

pré:

Existe um Cliente com nome = nomeC.

Esse Cliente não possui associação com nenhum Emprestimo.

pós:

O Cliente com nome = nomeC foi destruído.

Page 36: Contratos

Em OCL

Classe Videolocadora

operação: excluiCliente(nomeC:String)

alias:

cliente = self.cadastro select(nome=nomeC)

pré:

cliente size=1.

cliente.emprestimos size=0.

pós:

self.removeFromCadastro(cliente).

Page 37: Contratos

Três opções para destruir uma instância com segurança

Garantir, via pré-condição, que ela não tenha associações obrigatórias.

Propagar a exclusão através das associações obrigatórias.

Gerar uma exceção, se a operação de exclusão for tentada em uma instância com associações obrigatórias

Page 38: Contratos

Contrato para Consulta

Classe Videolocadora

consulta: consultaCliente(nomeC:String)

pré:

Existe um Cliente com nome = nomeC.

resultado:

Retorna o endereco e o telefone do Cliente

Page 39: Contratos

Em OCL

Classe Videolocadora

consulta: consultaCliente(nomeC:String)

alias:

cliente = self.cadastro select(nome=nomeC)

pré:

cliente size==1

retorno:

cliente collect(Sequence{endereco,telefone})

Page 40: Contratos

Contrato para uma Consulta de Listagem

Classe Videolocadora

consulta: listaClientes()

pré:

retorno:

retorna os nomes de todos os Clientes do cadastro.

Page 41: Contratos

Em OCL

Classe Videolocadora

consulta: listaClientes()

pré:

retorno:

self.cadastro collect(nome)

Page 42: Contratos

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 43: Contratos

Exemplo

Page 44: Contratos

Classe Videolocadora

consulta: listaNomesDeClientes()

pré:

resultado:

this.cadastro collect(nome)

Page 45: Contratos

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 46: Contratos

Classe Videolocadora

consulta: listaCodigosDeFitasDisponiveis()

pré:

retorno:

self.fitas select(emAndamento size() == 0) collect(codigo)

Page 47: Contratos

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 48: Contratos

Classe Videolocadora

consulta: consultaValorDoEmprestimoAberto()

pré:

self.clienteCorrente.emprestimoAberto size() == 1

resultado:

self.clienteCorrente.emprestimoAberto.valorTotal

Page 49: Contratos

Classe Videolocadora

consulta: consultaPrazosDoEmprestimoAberto()

pré:

self.clienteCorrente.emprestimoAberto size() == 1

retorno:

self.clienteCorrente.emprestimoAberto.itensDeEmprestimo collect(prazo)

Page 50: Contratos

Classe Videolocadora

operação: finalizaEmprestimo()

pré:

self.clienteCorrente.emprestimoAberto size() == 1

self.clienteCorrente.emprestimoAberto.itensDeEmprestimo size() > 0

pós:

self.clienteCorrente.setEmprestimoAberto(null)

self.setClienteCorrente(null)

Page 51: Contratos

Trabalho a ser entregue no próximo módulo

1. Escolher um sistema qualquer. Selecionar um caso de uso não trivial. Expandir o 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 52: Contratos

Equipes de 3 pessoas

Cada equipe entregará 3 trabalhos Cada membro executa o passo 1

individualmente. Em seguida cada um repassa o resultado do

passo 1 para outro membro da equipe executar o passo 2.

Em seguida cada um repassa o resultado do passo 2 para o outro membro executar o passo 3.

Identificar em cada trabalho quem fez o que