Modelos e Artefatos
Objetivos
- Definir os modelos e artefatos a serem produzidos durante o processo de desenvolvimento
de software
- Cuidado! Cada processo define os deliverables a entregar
- Não há consenso sobre que deliverables são importantes
- Há "processos leves" (ex. XP) e "processos pesados" (ex. RUP)
- A descrição que segue é mais para "pesado" (embora o professor seja light,
light, light ...)
- Os argumentos de cada lado serão apresentados em outra disciplina
(Engenharia de Software)
Os modelos e outros artefatos (deliverables)
- Artefatos da fase de elaboração
- Documento de business case (investigação preliminar)
- Documento de orçamento e cronograma
- Documento de especificação de requisitos
- Requisitos funcionais (Modelo de use case)
- Requisitos não funcionais
- Modelo conceitual inicial
- Glossário
- Projeto arquitetural (poderá incluir um Modelo de componentes)
- Fase de construção
- Refinamento dos requisitos funcionais (Modelo de use case)
- Refinamento do modelo conceitual (Modelo conceitual)
- Inclui vários tipos de diagramas UML
- Refinamento do projeto arquitetural (poderá incluir um Modelo de
componentes)
- Refinamento do glossário
- Projeto de baixo nível (Modelo de projeto)
- Inclui vários tipos de diagramas UML
- Esquema de banco de dados
- Planos de testes
- Fase de implantação
- Planos de publicação
- Planos de testes alfa, beta
- Planos de treinamento
Modelos de Análise
- Nas várias fases, modelos podem servir para vários propósitos
- Para o caso particular de análise, em que estamos capturando requisitos e tentando entender o domínio do problema, um modelo consiste tipicamente de:
- Breve descrição do sistema desejado
- Um modelo conceitual
- Um glossário
- Uma lista de requisitos funcionais, sob a forma de User Stories ou Use Cases
- Uma lista de requisitos não funcionais
- Artefatos adicionais que dependem muito do processo de desenvolvimento usado
- Testes de aceitação
- Diagramas de interação com o sistema (diagramas de seqüência, por exemplo)
- Definição de contratos
- Detalhes sobre a construção de modelos de análise são objeto de outra disciplina do curso
- Vamos fornecer um exemplo de um modelo de análise para concretizar a discussão
Exemplo de Modelo de Análise
- Em vez do exemplo abaixo, o professor poderá preferir usar como exemplo de modelo de análise o modelo fornecido com o projeto da disciplina
Breve descrição do sistema desejado
- Queremos um programa que nos ajude a avaliar a performance de um portfólio de investimentos ao longo do tempo. Queremos registrar decisões de investimentos, rastrear o valor líquido dos investimentos e calcular o Retorno no Investimento (Return On Investment - ROI).
- Para quem não sabe o que é um "portfólio de investimentos", segue uma breve introdução:
- Um investimento é a compra de ações de uma empresa, títulos do governo brasileiro, etc. Investimentos pagam alguma coisa além do valor investido (eles "dão retorno"), ou assim se espera. Por exemplo, ações de uma empresa podem dar retorno de duas formas: podem dar dividendos (parte do lucro que a empresa apura é dividida entre quem tem ações) ou então o próprio preço da ação pode aumentar; assim, ganha-se dinheiro comprando quando a ação estiver barata e vendendo quando estiver mais cara. "Títulos" por sua vez são empréstimos que você faz a um governo ou empresa. Para ter seu dinheiro, o governo topa pagar juros; claro que seu capital inicial será devolvido também, claro. Um "portfólio" é um conjunto de investimentos que alguém tem. Por exemplo, "seu" portfólio pode ter 1000 ações da Petrobrás, 10000 ações da Telemar e R$10.000,00 em títulos do governo federal brasileiro.
- Para quem a aplicação está sendo desenvolvida?
- Estamos desenvolvendo o Gestor de Portfólio para uso próprio. Esse estudo de caso será um pouco artificial pois nós mesmos estamos assumindo vários papeis (patrocinador, domain expert, usuário e desenvolvedor).
- Que problema está sendo resolvido?
- Queremos um sistema simples que rastreie o valor líquido e sumarize o histórico de investimentos como guia para decisões futuras de investimentos. Queremos estudar a performance dos investimentos de um grupo de ativos financeiros (financial assets) de várias formas. O software deve se focar em ações (stocks) e títulos (bonds), mas deve facilmente aceitar outros tipos de investimentos financeiros como extensões futuras. O sistema não precisa se preocupar com problemas complexos tais como espólios (estates) e trustes (trusts). Também não precisa se preocupar com assuntos de tributação.
- Não é necessário que se dê entrada no histórico completo de preço e dividendos de ações. Só é necessário fornecer os dados que serão de fato utilizados para um cálculo particular. Por exemplo, se quisermos calcular o valor do portfólio para o final de 2003, o sistema deve possuir um preço para esta data para todos os instrumentos que fazem parte do portfólio. Para calcular o ROI de um portfólio para 2002 e 2003, temos que forncer os dados completos para este intervalo, incluindo pagamentos de juros e dividendos.
- Onde será usado?
- Antecipamos que o gestor de Portfólio será usado em casa para gerenciar investimentos pessoais. Para manter a simplicidade, não trataremos da interface do gestor com outras aplicações tais como planilhas ou software para declaração de impostos.
- Quando deve ficar pronto?
- Queremos desenvolver algo útil com alguns homem-semanas (1 homem-mês é quase equivalente a 1 mulher-mês) de trabalho.
- Por que o sistema é necessário?
- O software de finanças pessoais que encontramos não permite calcular o valor do portfólio em vários pontos nos tempo e não suporta portfólios recursivos.
- Definição do Problema a Resolver
- Desenvolver um sistema para a gestão de portfólios de investimentos. A seguinte funcionalidade deve ser provida:
- Deve permitir uma mistura de ativos (assets) e passivos (liabilities), incluindo ações (stocks), títulos (bonds), opções (options), commodities (mercadorias ou bem consumível), fundos mútuos, metais preciosos, itens colecionáveis, dinheiro em caixa (cash), seguros, bens imóveis, empréstimos. Um instrumento financeiro é um ativo, um passivo ou um portfólio.
- Deve dar suporte a hierarquias de portfólios. Portfólios contêm instrumentos financeiros.
- Deve registrar datas de compra e venda de instrumentos financeiros e o preço envolvido.
- Deve rastrear o valor de ativos ao longo do tempo.
- Deve lidar com dividendos pagos em dinheiro e dividendos pagos em ações.
- Deve calcular o Return on Investment (ROI).
- Deve permitir a conversão de moedas com a possível inclusão de uma taxa de conversão
Glossário
- Ativo: Algo que tem valor e pode ser comprado ou vendido diretamente. Ativos podem variar na sua liquidez, isto é, no período de tempo necessário para realizar uma compra ou venda. Ativos podem pertencer a mais de um portfólio. Registramos o valor de cada ativo, a data da avaliação do valor, e todas as transações com as quais um ativo é adquirido ou vendido. O gestor de portfólio dá suporte aos seguintes tipos de ativo: metal precioso, título, ação, opção de ação, imóvel, cash, item colecionável, seguro.
- Passivo: Um ativo com valor negativo é um passivo.
- Título: o direito de receber um pagamento periódico de juros e um ou mais retornos de capital. O valor do principal é fixo, ao contrário de ações cujo valor altera de acordo com a situação da empresa que cede as ações e o estado da economia. Empresas devem pagar juros de títulos que emitem antes de pagar dividendos de ações. O termo "título" inclui anuidades, títulos municipais, títulos federais, títulos corporativos (empresariais), certificados de depósito, etc. Um empréstimo é um título em que o dono do papel deve dinheiro.
- Cash: dinheiro de algumas denominações (Reais, Dólar, ...)
- ItemColecionável: Um item de mérito artístico ou estético, tal como uma pintura, moedas raras, selos e antiguidades. O valor de um item colecionável pode ser estimado através de compras e vendas realizadas no mercado.
- InstituiçãoFinanceira: Uma empresa que mantém contas de portfólios. Bancos, companhias de seguro e corretores de ações são exemplos de instituições.
- IntrumentoFinanceiro: Um ativo ou portfólio.
- Seguro: Uma garantia de pagamento numa situação específica (normalmente uma crise ou desastre) em troca de pagamentos periódicos de um prêmio. Para o gestor de portfólio, um seguro é tratado como instrumento financeiro apenas se tiver "valor de renúncia". Por exemplo, um seguro é um instrumento financeiro se o seguro paga mais do que o custo do benefício e resulta em valor residual.
- Pessoa: o dono de portfólios. Excluímos outras pessoas tais como corretores, gerentes de fundos, etc.
- Portfólio: Uma coleção de instrumentos financeiros que evoluem no tempo através de transações. Um portfólio consiste de instrumentos financeiros que podem ser ativos e subportfólios. Para simplificar, podemos supor que um portfólio tem um único dono. Um portfólio pode ser (mas nem sempre é) mantido por uma instituição financeira. Calculamos p Retorno no Investimento de um portfólio, na forma taxa líquida de retorno (Internal Rate of Return - IRR).
- MetalPrecioso: Um metal que é negociado com alto valor comparado com metais comuns. Por exemplo, ouro, prata e platina são metais preciosos enquanto cobre, chumbo e alumínio são metais comuns. Metais preciosos têm valor alto devido à alta demanda comparada com a oferta. metais preciosos complementam bem um portfólio porque têm liquidez e resistem à inflação (ao contrário de dinheiro que governos podem imprimir à vontade). Do lado negativo, metais preciosos não geram fluxo de caixa.
- Imóvel: terra, terrenos, prédios, ... Um imóvel deve pagar imposto e requer capital de investimento para efetuar manutenção e melhorias. Um imóvel retorna alugueis ou os benefícios de uso próprio. Nosso sistema não detalha o investimento em imóveis.
- Ações: A posse de parte de uma empresa. Donos de ações podem receber dividendos e podem se beneficiar da alta do preço das ações, em função de uma percepção pelo mercado de uma alta de valor da empresa. Para a maioria das ações, a perda máxima se limita ao valor investido. Ações são negociadas em várias bolsas (stock exchange) no mundo onde o valor das ações é estabelecido. Para simplificar, estamos supondo que o "ticker symbol" (abreviação da empresa na bolsa) seja único em todas as bolsas para as ações de uma empresa particular. Há diferentes tipos de ações, tais como "ações preferenciais" que recebem dividendos antes das demais mas sem direito a voto, "ações ordinárias" com direito a voto, etc. Uma ação pode estar sujeita a opções (stock option).
- OpçõesDeAções: O direito de comprar ações até uma certa data a um certo preço (o strike price). Quem possui opções pode exercitar seus direitos (comprar as ações) ou esperar; a escolha termina na data limite. Opções de ações são uma forma comum nos Estados Unidos de "remunerar" os empregados de uma empresa: se o preço das ações subir, o empregado exercita a opção, compra as ações a um preço mais baixo (o strike price), vende as ações (se quiser) e embolsa a diferença. É uma remuneração de mais baixo custo para a empresa.
- Transação: a negociação de uma coleção de ativos por outra coleção de ativos. cada transação tem um tipo: compra, venda, depósito, saque, ajuste contábil, dividendo, juros e retorno do principal. Uma transação é a única forma de alterar os ativos de um portfólio. Duas datas são importantes: a data em que a transação ocorreu e a data em que foi observada e registrada.
- Venda: entrega um ativo e recebe cash
- Compra: entrega cash e recebe outro ativo
- Depósito: a adição de um ativo ao portfólio; normalmente é cash
- Saque: a remoção de um ativo do portfólio; normalmente é cash
- Ajuste contábil: entrada usada para efetuar ajustes manuais ao portfólio quando se descobre uma discrepância; pode ser usado para estorno, etc.
- Dividendos: Um pagamento periódico de ações ou cash como divisão de parte dos lucros de uma empresa
- Juros: Um pagamento periódico de cash devido à posse de um título
- Retorno do principal de um título: Devolução do capital emprestado a um governo ou empresa ao comprar um título deste governo ou empresa. O capital pode ser devolvido de uma única vez ou em parcelas.
- Retorno no investimento: Uma medida de quão bom é um investimento ao longo do tempo. Há muitas maneiras de calcular ROI (Return On Investment).
- Cash flow: No nosso caso, é "investment cash flow". Entradas e saídas de ativos ao longo do tempo devido à compra e venda de ativos.
- Internal Rate of Return (IRR): Uma das formas de calcular ROI. Tem várias formas de expressar a mesma definição. Por exemplo: http://invest-faq.com/articles/analy-int-rate-return.html e http://www.investorwords.com/2564/Internal_Rate_of_Return.html.
Detalhes levantados durante a análise em preparação para fazer o modelo conceitual
- Uma instituição financeira mantém portfólios
- Pessoas possuem portfólios. Um portfólio pode pertencer a várias pessoas (minha esposa exigiu que eu introduzisse esse requisito)
- Títulos pagam juros periodicamente
- Ações pagam dividendos
- Uma opção ("stock option") tem uma ação subjacente.
- A manipulação do portfólio é feita através de transações
- Ativo e passivo podem ser modelados com o mesmo conceito, usando sinais opostos. Portanto, juntaremos as entidades Ativo e Passivo, com nome "Ativo" e usaremos um sinal negativo para dizer se possuímos o ativo (sinal positivo) ou se o devemos a alguém (sinal negativo). Assim, podemos juntar Título (dinheiro que temos) e Empréstimo (dinheiro que devemos) numa mesma classe, que chamaremos Titulo.
- No modelo que segue, não damos detalhes para ativos que não serão implementados. Nos concentramos em ações, títulos, e cash.
- Para simplificar o tratamento de Fundos Mútuos, estamos supondo que tais fundos podem ser ou de Títulos ou de Ações mas não de uma mistura. Além do mais, um Fundo Mútuo de Ações é indistinguível da posse de ações (as duas entidades têm os mesmos atributos) e juntamos os dois conceitos. Da mesma forma, um Fundo Mútuo de Títulos é indistinguível da posse de ações e títulos e juntamos os dois conceitos. A estrutura interna do Fundo Mútuo (quais ações? quais títulos?) não nos interessa porque a posse de partes de um Fundo Mútuo é diretamente negociável, podendo ser comprada e vendida. Não tratamos da composição interna do Fundo. Portanto, Fundos Mútuos somem daqui para frente.
- A compra e venda de ativos se aplicam a Ativos e não a instrumentos financeiros, já que não podemos negociar Portfólios diretamente.
- Transações são usadas para fazer qualquer alteração na composição de Ativos no portfólio. Os tipos de transações possíveis são:
- Compra (entrega cash e recebe outro ativo)
- Venda (entrega um ativo e recebe cash)
- Depósito (a adição de um ativo ao portfólio; normalmente é cash)
- Saque (a remoção de um ativo do portfólio; normalmente é cash)
- Ajuste contábil (entrada usada para efetuar ajustes manuais ao portfólio quando se descobre uma discrepância; pode ser usado para estorno, etc. O ajuste é equivalente a um depósito ou saque, e pode envolver qualquer ativo)
- Dividendo (recepção de ações ou cash como dividendo)
- Juros (recebimento de juros de títulos)
- Retorno do principal (retorno do principal de um título, podendo ser em parcelas)
- Observe que, devido à possível recepção de dividendos em ações e não em cash, uma transação tem vários relacionamentos com ativos:
- AtivoRecebido (o ativo recebido na transação; exemplo, se eu comprar ações da Petrobrás, então é ação da Petrobrás; se eu receber dividendos da Embraer em ações, então são as ações recebidas (da Embraer))
- AtivoCedido (o ativo cedido na transação; exemplo, se eu comprar ações da Petrobrás, então é cash; se eu receber dividendos da Embraer em ações, então é nulo pois não estou cedendo nada)
- AtivoReferenciado (o ativo gerando o dividendo, ou juro, ou retorno de capital; é nulo para outras transações)
- Não usamos subclasses para os tipos de transações porque todos os tipos de transação têm os mesmos atributos. Basta um atributo "tipo"
Modelo conceitual

- Alguns detalhes sobre o modelo conceitual
- Entidades podem ser físicas (produto, empregado) ou não
- Entidades podem ter atributos
- Não usar métodos num modelo conceitual
- Uma chave é um conjunto de atributos que, coletivamente, identificam uma entidade unicamente
- Uma chave pode conter mais atributos do que seria necessário para garantir unicidade
- Uma chave para a qual nenhum subconjunto também é chave chama-se chave candidata
- Uma chave primária é uma chave candidata escolhida para identificar entidades (tipicamente num banco de dados)
- Relacionamentos podem ser de vários tipos
- Associação
- Generalização
- Agregação
- Composição
- Não usar setas de navegabilidade no modelo conceitual
- Em alguns casos, relacionamentos podem ter atributos
- Acima, ver quantidade de ativoRecebido
- Relacionamentos têm cardinalidade
- One-to-one: Uma entidade de tipo A está associada com no máximo uma entidade de tipo B, e uma entidade de tipo B está associada com no máximo uma entidade de tipo A
- One-to-many: Uma entidade de tipo A está associada com qualquer número de entidades de tipo B, e uma entidade de tipo B está associada com no máximo uma entidade de tipo A
- Many-to-one: Uma entidade de tipo A está associada com no máximo uma entidade de tipo B, e uma entidade de tipo B está associada com qualquer número de entidades de tipo A
- Many-to-many: Entidades de tipo A e B estão associadas com qualquer número da outra
User Stories
- Adicionar, remover e alterar uma pessoa.
O CPF é usado como chave.
Ao remover entidades, cuidado para não deixar outras entidades órfãos. Por exemplo, se uma pessoa possui portfólios, então ela não pode ser removida.
- Adicionar, remover e alterar uma instituição financeira
- Adicionar, remover e alterar um instrumento financeiro
- Adicionar e remover donos de portfólios.
- Criar e alterar composições recursivas de portfólios e os atributos de portfólios
- Adicionar, remover e alterar uma transação (comprar, vender, receber dividendos, etc.)
- Adicionar, remover e alterar preços de ativos para qualquer data. Isso só deve ser possível para ativos em que fizer sentido (ex. não se pode alterar o valor de um título)
- Achar o número de conta de um portfólio
- Achar todos os dividendos para uma ação (Achar
todas as transações de divivendos que referenciam uma ação. )
- Achar todos os pagamentos de juros e retorno do principal para um título
- Achar todas as "transações de comércio" para um ativo (isto é, pulando transações de pagamento de dividendos, retorno do principal e juros).
- Achar todas as transações para um portfólio
- Calcular o total de taxas pagas para transações de um portfólio num intervalo de tempo
- Achar os ativos num portfólio para uma data específica. (
Queremos uma lista de todos os ativos, com suas quantidades. Lembre de descer
um portfólio recursivamente e juntar ativos do mesmo tipo somando suas quantidades. Só interessam ativos para os quais a quantidade é > 0.)
- Achar as opções (Stock options) de um portfólio que vencem dentro de 1 mês
- Calcular o valor de um portfólio para uma data específica. (
Estamos supondo aqui que o valor de cada ativo para a data especificada está disponível. Porém, se não estiver, faça algo sensato.)
- Calcular o ROI de um portfólio num intervalo de tempo. Há várias definições para ROI. Na definição usada aqui, o ROI é o "Internal Rate of Return" (IRR). Detalhes sobre o cálculo do IRR podem ser vistos aqui: http://invest-faq.com/articles/analy-int-rate-return.html. A forma de calcular isso é iterativa: supõe uma taxa de retorno (IRR) e calcule o "valor presente" do fluxo de fundos do portfólio com essa taxa para a data final em questão; e altere a taxa de retorno (para cima ou para baixo) até que o valor presente seja zero. Se não houver convergência em 10 iterações, pare dando erro.
Testes de aceitação
- Nessa análise particular, testes de aceitação automáticos foram elaborados pelo cliente com a ajuda do desenvolvedor
- Como exemplo, aqui estão os testes de aceitação da User Story 3
# TA3.1 adicao de um instrumento
zerarObjetos
criarCash id=if1 nome=cash descricao="Dinheiro em caixa"
expect "id=if1,nome=cash,descricao=Dinheiro em caixa,valor=R$0,00" toString id=if1
expect "{[id=if1,nome=cash,descricao=Dinheiro em caixa,valor=R$0,00]}" localizarInstrumento nome=cash
# TA3.2 alteracao de um instrumento
zerarObjetos
criarCash id=if1 nome=cash descricao="Dinheiro em caixa"
alterarCash id=if1 nome=caixa
expect {} localizarInstrumento nome=cash
expect "{[id=if1,nome=caixa,descricao=Dinheiro em caixa,valor=R$0,00]}" localizarInstrumento nome=caixa
# TA3.3 remocao de um instrumento
zerarObjetos
expectError removerInstrumento id=if1
criarCash id=if1 nome=cash descricao="Dinheiro em caixa"
removerInstrumento id=if1
expect {} localizarInstrumento nome=cash
# TA3.4 adicao de um instrumento duplicado
zerarObjetos
criarCash id=if1 nome=cash descricao="Dinheiro em caixa"
expectError criarCash id=if1 nome=caixa descricao="Grana em caixa"
# TA3.5 remocao de um instrumento inexistente
zerarObjetos
criarCash id=if1 nome=cash descricao="Dinheiro em caixa"
expectError removerInstrumento id=if2
# TA3.6 remocao de um instrumento referenciado num portfolio
zerarObjetos
criarPortfolio id=p1 nome=portjacques descricao="Portfolio principal de Jacques" dono="Jacques Sauve" instituicao=Bradesco numeroDeConta=1234-5
criarCash id=if1 nome=cash descricao="Dinheiro em caixa"
# numa transacao, se nao houver data, a data de agora é usada
transDeposito id=t1 instrumento=if1 portfolio=p1 quantidade=10000
expectError removerInstrumento id=if1
# TA3.7 criacao de acoes
zerarObjetos
criarAcoes id=if2 nome=acoesPetrobras descricao="Acoes da Petrobras" nomeDePregao=PETROBRAS tipoAcao=ON
expect "{[id=if2,nome=acoesPetrobras,descricao=Acoes da Petrobras,nomeDePregao=PETROBRAS,tipoAcao=ON,valor=R$0,00]}" \
localizarInstrumento nome=acoesPetrobras
# TA3.8 criacao de titulo
zerarObjetos
criarTitulo id=if3 nome=tituloBR descricao="Titulo da Divida Publica Brasileira"
expect "{[id=if3,nome=tituloBR,descricao=Titulo da Divida Publica Brasileira,valor=R$0,00]}" \
localizarInstrumento nome=tituloBR
intro programa