Estudo de Caso TPV Projetando uma solução com … › ~ines › cursos › proj-si › ...5....

Post on 05-Jul-2020

0 views 0 download

Transcript of Estudo de Caso TPV Projetando uma solução com … › ~ines › cursos › proj-si › ...5....

Estudo de Caso TPV

Projeto e Desenvolvimento de Sistemas de Informação

UNIVERSIDADE ESTADUAL PAULISTAINSTITUTO DE BIOCIÊNCIAS, LETRAS E CIÊNCIAS EXATASDEPARTAMENTO DE CIÊNCIAS DE COMPUTAÇÃO E ESTATÍSTICA

Estudo de Caso TPVProjetando uma solução com

objetos e Padrões GRASP

Atividades da Fase ProjetarRefinarPlano

Sincronizarartefatos

Analisar Projetar Construir Testar

1. Definir Casos deUso Reais

2. Definir Relatórios, IU e “Storyboards”

3. Refinar a arquitetura do sistema

4. Definir diagramasde interação

5. Definir Diagramas deClasses de Projeto

6. Definir o EsquemaDo Banco de Dados

Como Criar Diagramas de Comunicação

� Atribuir responsabilidades e criar os diagramas de comunicação são as atividades mais criativas da fase de projeto.projeto.

� Não há soluções mágicas ou não justificadas. Elas devem ser baseadas em raciocínios lógicos e racionais.

Diagramas de Comunicação e artefatos anteriores

Operação: entrarItem

Pós-condições:

1. Se for uma nova venda,

uma nova venda foi criada...entrarItem(cup,

SistemaCaixa

:TPV

entrarItem(cup, qtd)

uma nova venda foi criada...

Operação: registrarPagamento

Pós-condições:

1. ...

entrarItem(cup,

quantidade)

terminarVenda()

registrarPagamento

( quantia) :TPV

registrarPagamento

(quantia)

Diagrama de

seqüência do

sistema

ContratosDiagrama de

comunicação

Criação dos Diagramas de Comunicação

� Crie um diagrama separado para cada operação do sistema em desenvolvimento no passo iterativo corrente.

� Para cada evento do sistema, crie um diagrama com o evento como a mensagem inicial.inicial.

� Se o diagrama se tornar complexo, separe-o em diagramas menores.

� Usando as responsabilidades e as pós-condições dos contratos, projete um sistema de objetos que interagem entre si para executar as tarefas. Use GRASP (e outros conhecimentos) para apoiar a sua decisão.

Diagramas de Comunicação para a aplicação TPV

Na iteração corrente: dois casos de uso estão sendo tratados:

� Comprar Itens� entrarItem� entrarItem� terminarVenda� EfetuarPagamento

� Inicializar� Inicializar

Diagramas de Comunicação para a aplicação TPV

Lembretes: � As pós-condições são somente uma

pista inicial.pista inicial.� Use o modelo conceitual como apoio.� O contrato é a base para o diagrama de

colaboração� Comece escolhendo a classe

controladora do evento (ou método)

Eventos de Sistema do TPV

:TPV

:TPV

entrarItem

terminarVenda

1: ???()

1: ???()

:TPV

:TPV

registrarPagamento

inicializar

1: ???()

1: ???()

Modelo Conceitual e Diagrama de Comunicação

� Ponto de partida para os objetos que interagem entre si� Novos conceitos poderão surgir, assim � Novos conceitos poderão surgir, assim

como conceitos previamente identificados poderão ser ignorados.

� É um guia, porém pode conter erros e omissões.

Modelo Conceitual do TPV

*

1

1 Loja

1..*1

Catálogo de Produtos

*

Usado-por

*

1..*

Estoca

0..1

1

Especificação de ProdutodescriçãopreçoCUP

1..*

Contém

*

Descreve

*

LinhadeItemdeVendaquantidade

1..*

Contido-em

0..1

Registra-venda-de

*

Descritos-por

1

1

Caixa

1

Gerente

1..*

1..*

1

1

Pagamentoquantia

1

1

Cliente

1

1

*

TPV

< Registra-Vendas-do

1..*

Iniciado por

1

*1

endereçonome

1..*

Possui

*

1

Vendadatatempo

Paga-porIniciada-por

*

Registra-Dados-dav

1

Capturada-em

1

Item

*

Estoca*

Contido-em

Contrato da operação entrarItem

Nome: entrarItem (cup:number, quantidade:integer)

Responsabilidades: entrar(registrar) a venda de um item e

acrescentá-lo à venda. Exibir a descrição e o preço do item.

Pós-condições:

• Se for uma nova venda, uma Venda foi Criada (c.i.)

• Se for uma nova venda, a nova Venda foi associada ao TPV (f.a)• Se for uma nova venda, a nova Venda foi associada ao TPV (f.a)

• Uma LinhadeItemdeVenda foi criada (c.i)

• A LinhadeItemdeVenda foi associada à Venda (f.a)

• LinhadeItemdeVenda.quantidade recebeu o valor de quantidade

(m.a)

•A LinhadeItemdeVenda foi associada a um(a) (Especificaçãode)

Produto, com base no CUP (f.a)

Diagrama de Comunicação de entrarItem (Cont)

� Escolhendo a classe Controlador: � Opções: TPV ou nova classe SistemadeVarejo,

Loja, Caixa, Controlador-ComprarItens� Escolha: TPV

� Satisfatório se houver poucas operações de � Satisfatório se houver poucas operações de sistema e o controlador fachada não estiver assumindo muita responsabilidade

� Tenha em mente que agora o TPV é um objeto no “mundo do software”. Ele é uma abstração de software que representa o registrador.

Diagrama de Comunicação de entraItem

segundo o

padrão

Controlador

:TPVentrarItem(cup,qtd)

Diagrama de Comunicação de entrarItem (Cont)

Exibir a descrição e o preço do item

� Não é responsabilidade dos objetos do domínio (TPV ou VENDA) se comunicarem com a camada de ou VENDA) se comunicarem com a camada de interface do usuário (Padrão Separação entre Modelo e Visão):� Tudo o que é necessário, com relação a essa

responsabilidade, é que os dados sejam conhecidos (ou sejam calculados, conforme as necessidades).

� A apresentação da descrição e do preço será ignorada, por enquanto.

Criar uma nova venda

-se for uma nova venda, uma Venda foi criada

-se for uma nova venda, a nova Venda foi associada ao TPV

:TPV

entrarItem(cup,qtd)

:Venda1:[nova_venda] criar()

segundo o

padrão

Criador

:TPV :Venda

:linhadeItemde

Venda

1:[nova_venda] criar()

1.1:criar() segundo o

padrão

CriadorColeção vazia, conterá

futuramente, instâncias de

Linha de Item de Venda

(multiobjeto)

Próximo passo

Criar uma nova linhadeItemdeVenda� Uma LinhadeItemdeVenda foi criada

(c.i)� A LinhadeItemdeVenda foi associada à � A LinhadeItemdeVenda foi associada à

Venda (f.a)� LinhadeItemdeVenda.quantidade

recebeu o valor de quantidade (m.a)

Criar uma nova LinhaDeItemDeVenda

:TPV

entrarItem(cup,qtd)

:Venda1:[nova_venda] criar()

1.1:criar()3.1:criar(espec,qtd)

3:criarLinhadeItem(espec,qtd)

:linhadeItemde

Venda

1.1:criar()

3.2:adicionar(lv)

lv:linhadeItemdeVenda

3.1:criar(espec,qtd)

segundo o

padrão

Criador

Próximo passo

Encontrar a especificação do produto� A LinhadeItemdeVenda foi associada a um(a)

(Especificaçãode) Produto, com base no CUP (f.a)� Quem deveria ser responsável por recuperar uma

EspecificaçãodeProduto a partir do CUP? Ou seja EspecificaçãodeProduto a partir do CUP? Ou seja quem deveria ser responsável por conhecer uma EspecificaçãodeProduto?

� Quem deve ter a responsabilidade de encontrar os dados (especificação) do produto ?

� Quais dados devem ser armazenados de forma permanente?

Próximo passo

Encontrar a especificação do produto-> definir claramente a responsabilidade:

� Quem deveria ser responsável por conhecer uma Especificação de conhecer uma Especificação de Produto baseado em uma correspondência de CUP?

� Que tipo de problema temos? Criação? Escolha de um Controlador? Especialista?

Próximo passo

Encontrar a especificação do produto� Padrão Especialista sugere: o objeto

que tenha a informação requerida para cumprir a responsabilidade deve fazê-locumprir a responsabilidade deve fazê-lo

� Quem sabe tudo sobre a Especificação de Produto?

� Observe isso no modelo conceitual:

*

1..1

1..1 Loja

1..*1..1

Catálogo de Produtos

*

1..1Usado-por

*1..1

1..*

Estoca

0..1

1..1

Especificação de ProdutodescriçãopreçoUPC

1..*1..1

Contém

*

Descreve

*

LinhadeItemdeVendaquantidade

1..*

Contido-em

0..1

Registra-venda-de

1..1

*

Descritos-por

Modelo Conceitual do TPV

1..1

1..1

Caixa

1..1

Gerente

1..*

1..*

1..1

1..1

Pagamentoquantia

1..1

1..1Cliente

1..1

1..1

*

1..1TPV

1..1

1..1

< Registra-Vendas-do

1..11..*

Iniciado por

1..1

*1..1

endereçonome

1..*

1..1Possui

*

1..1

Vendadatatempo

1..1

1..1Paga-por

1..1

1..1

Iniciada-por

1..1

*

Registra-Dados-dav

1..1

1..1Capturada-em

1..1

Item

*1..1

Estoca*

1..1

Contido-em

1..1

Próximo passo

Visibilidade para um Catálogo de Produtos� Quem deveria enviar a mensagem

especificação para o Catálogo de Produtossolicitando uma Especificação de Produto?

� É razoável assumir que uma instância de TPV e de Catálogo de Produtos foram TPV e de Catálogo de Produtos foram criados durante o caso de uso inicial Inicializar e que exista uma conexão permanente do objeto TPV para o objeto Catálogo de Produtos.

� Assumindo isso, TPV pode enviar a mensagem especificação para Catálogo de Produtos

Diagrama de Comunicação de entrarItem (completo)

:TPV

entrarItem(cup,qtd)

:Venda1:[nova_venda] criar()

1.1:criar()3.1:criar(espec,qtd)

3:criarLinhadeItem(espec,qtd)

2:espec:=especificação(cup)

:linhadeItemde

Venda

1.1:criar()

3.2:adicionar(lv)

lv:linhadeItemdeVenda

3.1:criar(espec,qtd)2:espec:=especificação(cup)

2.1:espec:=encontrar(cup)

:Catálogode

Produtos

:Especificaçãode

Produto

Considerações � Um objeto, ao enviar uma mensagem para outro

objeto, deve ter visibilidade deste outro objeto.� Na versão final de uma aplicação real de ponto de

vendas, é improvável que todas as Especificação de Produto estarão realmente na memória.

� Um BD OO ou relacional será usado, e as � Um BD OO ou relacional será usado, e as recuperações serão realizadas sob demanda.

� Observe que as mensagens que estão sendo enviadas aos multiobjetos são interpretadas como mensagens ao próprio objeto Coleção.( 1.1 criar, 2.1 Encontrar, 3.2 adicionar)

Diagrama de Comunicação:terminarVenda

Contrato da Operação:

Nome: terminarVenda()

Responsabilidades: Registrar que é o fim da

entrada de itens de venda e exibir o total da venda

Pós-condições:

Venda.estáCompleta recebeu o valor true

Um Diagrama de Comunicação será construído para

satisfazer as pós-condições e responsabilidades de

terminarVenda.

Diagrama de Comunicação: terminarVenda

Pós-condições:

Venda.estáCompleta recebeu o valor true

terminarVenda()

TornarseCompleta()

{ estáCompleta := V}

:TPV :Venda1:tornarseCompleta()

segundo o

padrão

Especialista

segundo o

padrão

Controlador

Encerramento da entrada de itens

Quem deve ser responsável pela exibição da informação total da venda ?

� Isso deverá ser feito pela camada de apresentação ( a ser discutida mais adiante)

� Durante a criação do diagrama de comunicação, não se preocupe com a exibição de informações, exceto quando a exibição de informações, exceto quando a informação requerida ainda não é conhecida.

� Garanta que toda informação a ser exibida seja conhecida e esteja disponível nos objetos do domínio.

� Exemplo: terminarVenda deve informar o total da venda.

Processo de raciocínio para encontrar um Especialista para o

total da venda� Defina a responsabilidade:

� Quem deveria ser responsável por conhecer o total da venda?

� Resuma a informação requerida:� O total da venda é a soma dos subtotais de todas

as linhas de itens de vendas.� Subtotal da linha de item de vendas :=

quantidade da linha de item * preço na descrição do produto.

� Liste a informação necessária para satisfazer esta responsabilidade e as classes que conhecem esta informação.

Informação Requerida para calcular o total da Venda

Classe Especialista

EspecificaçãodeProduto.preço EspecificaçãodeProduto

LinhadeItemdeVenda.quantidade LinhadeItemdeVenda

Todas as LinhasdeItemdeVenda

na Venda correnteVenda

tot:=total()

:Venda

tot:=total()2*: st:=subtotal()

Calcular o total da venda

1*:[para cada]liv:=prox():LinhadeItemdeVenda

subtotal() {

return quantidade*espec.preço() }

2*: st:=subtotal()liv:LinhadeIte

mdeVenda

espec: Especifi

caçãodeProduto

:Venda

2.1:pr:=preçototal() {

tot:=0

para cada linha de item de

venda liv

tot:= tot + liv.subtotal()

}

Discussão� A mensagem total não está associada a

evento de sistema (não é uma operação de um diagrama de sequência)

Nem todo o diagrama de comunicação começa com uma

mensagem de um evento de sistema; eles podem começar mensagem de um evento de sistema; eles podem começar

com qualquer mensagem para a qual o projetista deseja

mostrar as interações.

Quem enviará a mensagem total para a Venda?

Provavelmente será um objeto na camada de apresentação

Diagrama de Comunicação de registrarPagamento

Contrato da Operação:

Nome: RegistrarPagamento(quantia: Number)

Responsabilidades: Registrar o pagamento, calcular o troco e

imprimir o recibo.

Pós-condições:Pós-condições:

• Um Pagamento foi criado (ci)

• Pagamento.quantiaFornecida recebeu o valor de quantia

(ma)

• O Pagamento foi associado à Venda (fa)

•A Venda foi associada à Loja, para acrescentá-la ao registro

histórico de vendas completadas (fa)

Registrar Pagamento

:TPV

registrarPagamento(quantiaFornecida)

Controlador: TPV ou Venda ?

:TPV

Fazer um DC

Com Venda como

controlador

Registrar Pagamento

registrarPagamento(quantia

Fornecida)

1: registrarPagamento(quantia

Criando o pagamento

Criador +

acoplamento baixo

Candidatos: TPV e Venda

:TPV :Venda1: registrarPagamento(quantia

Fornecida)

:Pagamento

1.1:criar(quantiaFornecida)

Registrando a Venda

Padrão Especialista� Quem é o responsável por conhecer

todas as vendas registradas e fazer todas as vendas registradas e fazer esse registro?

- Loja

- DiáriodeVendas

*

1..1

1..1 Loja

1..*1..1

Catálogo de Produtos

*

1..1Usado-por

*1..1

1..*

Estoca

0..1

1..1

Especificação de ProdutodescriçãopreçoUPC

1..*1..1

Contém

*

Descreve

*

LinhadeItemdeVendaquantidade

1..*

Contido-em

0..1

Registra-venda-de

1..1

*

Descritos-por

Registrando a Venda

1..1

1..1

Caixa

1..1

Gerente

1..*

1..*

1..1

1..1

Pagamentoquantia

1..1

1..1Cliente

1..1

1..1

*

1..1TPV

1..1

1..1

< Registra-Vendas-do

1..11..*

Iniciado por

1..1

*1..1

Lojaendereçonome

1..*

1..1Possui

*

1..1

Vendadatatempo

1..1

1..1Paga-por

1..1

1..1

Iniciada-por

1..1

*

Registra-Dados-dav

1..1

1..1Capturada-em

1..1

Item

*1..1

Estoca*

1..1

Contido-em

1..1

Registrando a venda: Alternativas

VendaVenda

...... ...

...

Loja

acrescentarVen

da(v:Venda)acrescentarVen

da(v:Venda))

DiáriodeVendas......

Registra-dados-da

Registra-dados-daLoja é responsável por

conhecer e acrescentar Vendas

completadas

:TPV

registrarPagamento()

:Venda

1: registrarPagamento(quantiaFornecida)

2 : acrescentarVenda(v)

Registrando uma venda completada

:Pagamento

1.1:criar(quantiaFornecida)2 : acrescentarVenda(v)

2.1 : acrescentrar(v)

:Loja

VendasCompletadas: Venda

Calculando o Troco

Quem é responsável por conhecer o troco?

Troco = Dinheiro fornecido para pagamento –Total da VendaEspecialistas parciais: Venda e PagamentoEspecialistas parciais: Venda e PagamentoControlador ?

Pagamento -> visibilidade

para venda (acréscimo de

acoplamento)

Venda -> visibilidade para

pagamento (já possui tal

visibilidade)

Calculando o TrocoControlador: Venda

trc:=troco()

Venda – troco()

{return pg.quantia() –

total() }

:Venda pg:Pagamento1: qtia:=quantia()

2: t:=total()

OBS: Um DC pode começar com

qualquer mensagem para a qual o

projetista deseja mostrar as

interações.

Diagrama de Comunicação de Iniciar

� Deixe o diagrama Iniciar por último.� Informações significativas relacionadas com as atividades

de inicialização devem já ter sido descobertas

� Objetivo: criar o objeto inicial do domínio.� Esse objeto cria então os demais objetos

necessários.necessários.� Então, a operação Iniciar deve:

� Enviar a mensagem criar() para o objeto inicial do domínio.� No seu método de inicialização, o objeto inicial é,

responsável pela criação de outros objetos do domínio do problema e por suas inicializações.

public class TPVApplet extends Applet

{

public void init ( )

{

tpv = Loja.getTPV ( )

}

Exemplo de inicialização, a partir de um applet Java

}

// Loja é o objeto inicial do domínio

// O construtor de Loja cria os outros

// objetos do domínio

private Loja loja = new Loja ( );

private TPV tpv;

private Venda venda;

A Operação Inicializar da aplicação TPV

� Ocorre quando um gerente liga o sistema do ponto de venda e carrega o software.� Suponha que exista uma interface gráfica de

usuário e que um objeto da camada de apresentação será responsável pela criação do objeto inicial do domínio do problema (ex. uma objeto inicial do domínio do problema (ex. uma instância de um applet java – coordenador da aplicação e da camada de apresentação)

� O controle permanecerá no applet, após o objeto inicial do domínio ter sido criado.

� O diagrama de colaboração de Inicializar pode ser interpretado como uma mensagem criar() enviada para criar o objeto inicial.

Escolhendo o objeto inicial do domínio

� Escolha como um objeto inicial do domínio:� Uma classe que representa todo o sistema � Uma classe que representa todo o sistema

de informação.� Uma classe que representa todo o negócio

ou organização.

Nesta aplicação Loja será escolhida como objeto inicial

Objetos persistentes: Especificação de Produto

� Em uma aplicação real, as instâncias de Especificação de Produto residirão em um BD.

� O projeto de como carregar objetos, � O projeto de como carregar objetos, dinamicamente, sob demanda, de um BD OO é simples. (BD relacional é mais difícil)

� Por enquanto faremos uma hipótese simplificadora: todas as instâncias de Especificação de Produto podem ser ‘magicamente’ criadas na memória pelo objeto Catálogo de Produtos

Contrato

Nome: Iniciar

Responsabilidades: Iniciar o sistema.

Tipo: Sistema

Refs cruzadas:

Notas:

Exceções:

Saída:

Pré-condições:Pré-condições:

Pós-condições:

• Uma Loja, TPV, CatálogodeProdutos e

(Especificaçãode)Produto foram criadas (ci)

• CatálogodeProdutos foi associado a EspecificaçãodeProduto (af)

• Loja foi associada a CatálogodeProdutos (af)

• Loja foi associada a TPV (af)

• TPV foi associado a CatálogodeProdutos (af)

cp:Catálogode

:Loja

criar()

:TPV

:Especificãode

2 : criar (cp)

1 :criar ( )

1.1 criar ()

1.2.2* : adicionar (ep)

Passa refer. do catálogo de produtos a TPV,

que terá visibilidade permanente a ele.

cp:Catálogode

Produtos:Especificãode

Produto

ep:EspecificaçãodeProduto

1.2.2* : adicionar (ep)

1.2.1* : criar(cup,preço,descrição)

1.2 : carregarEspecProd( )

O asterisco, no número de

seqüência, indica que a

mensagem ocorre em uma seção

que se repete

Comentários

� Multiplicidade : observe que a loja cria somente um objeto TPV.

� Persistência: num sistema real, � Persistência: num sistema real, Especificação de Produto residirá num meio de armazenamento permanente (Disco + SGBD)

Loja:Loja

Como ligar a camada de apresentação à camada do domínio

1: criar()

:TPVApplet Loja:Loja:TPVApplet2 p:= getTPV:TPV

Uma vez que o applet tem uma conexão para a

instância de TPV, ele pode repassar ao mesmo

mensagens de eventos do sistema: entrarItem(),

terminarVenda() e outras.

Como ligar a camada de apresentação à camada do domínio

tpv:TPVCamada do

Domínio

1: entrarItem(cup,qtd)

Evento do sistema

:TPVApplet

aoEntrarItem()Camada de

apresentação

(Applet Java)

Como ligar a camada de apresentação

à camada do domínioPara obter o subtotal

corrente, o TPVAPPLET:

•Obtém uma referência para

a venda

•Armazena essa referência

em um atributo

•Envia uma mensagem total

para a Venda para obter a

venda:Venda

tpdv:TPV

Camada do

Domínio

1:entrarItem(cup,qtd)

:TPVApplet

aoEntrarItem()Camada de

apresentação

2 :[nenhuma venda] venda:=getVenda ( ) : Venda

3: t:=total(): Float

para a Venda para obter a

informação necessária para

exibir o total corrente na

janela

Responsabilidades das camadas de apresentação e do domínio

� A camada de apresentação não deve ter responsabilidades sobre a lógica da aplicação.

� Camada de apresentação deve ser � Camada de apresentação deve ser responsável somente por tarefas de apresentação (interface), tais como atualizar widgets (componentes da interface)

� A camada de apresentação deve repassar todas as solicitações para a camada do domínio.

Resumo

• Projetar interações de mensagens e atribuir

responsabilidades é a parte principal do projeto OO.

• Essas escolhas de projeto tem um impacto profundo

sobre a capacidade de extensão, clareza, facilidade de sobre a capacidade de extensão, clareza, facilidade de

manutenção de um sistema de software OO e sobre o

grau de qualidade dos componentes reutilizáveis.

• Os padrões GRASP resumem alguns dos princípios

mais gerais e mais comuns usados por projetistas de

sistemas OO (princípios de bons projetos)

Próxima aulaRefinarPlano

Sincronizarartefatos

Analisar Projetar Construir Testar

1. Definir Casos deUso Reais

2. Definir Relatórios, IU e “Storyboards”

3. Refinar a arquitetura do sistema

4. Definir diagramasde interação

5. Visibilidade e Diagramasde Classes de Projeto

6. Definir o EsquemaDo Banco de Dados