Este semestre vamos desenvolver um Sistema de Informação lidando com portfólios de instrumentos financeiros. Vários aspectos da análise inicial são dados na descrição que segue, já que não temos Domain Experts nem usuários finais envolvidos. Porém, você mesmo terá que adicionar detalhes onde forem necessários para completar a análise. Cometemos assim um pecado, pois os engenheiros de software não devem inventar suas próprias respostas na fase de análise. Mas, como o ótimo é inimigo do bom, teremos que proceder desta forma.
Veja o resultado de alguns passos iniciais de análise, abaixo:
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 o aluno que 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.]
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).
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.
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.
Queremos desenvolver algo útil com alguns homem-semanas (1 homem-mês é quase equivalente a 1 mulher-mês) de trabalho. Em outras palavras, tem que ficar pronto até o fim da disciplina. Não devemos nos preocupar com eficiência.
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. (Agora, para ser bem sincero, o software é necessário porque o professor quer avaliar os alunos através de um projeto relativamente pequeno mas não trivial).
Deve haver completo desacoplamento entre a interface (GUI) e a lógica de negócio de forma a podermos ter várias interfaces para o sistema. De forma alguma o sistema deve permitir que o usuário altere dados diretamente no banco de dados (ou outro mecanismo de persistência). Topamos não usar um Sistema de Gerência de Banco da Dados no projeto.Mas, quem quiser usar um BD deve ficar à vontade.
Desenvolver um sistema para a gestão de portfólios de investimentos. A seguinte funcionalidade deve ser provida:
O desenvolvedor deve se familiarizar com este mundo através de revistas, sites Web, portais financeiros, etc. para bolar entidades, atributos, e relacionamentos entre entidades.
Para ajudar a pensar nas entidades e relacionamentos, olhe bem para a definição do problema. Além disso, lembre que:
Lembre também que a manipulação do portfólio pode ser feita através de transações.
O seguinte glossário ajudará a entender o domínio do problema. Como o professor é safado, ele deixou que você preenchesse as definições. Preencher isso vai ajudar muito a entender o domínio do problema. Forneça o máximo de detalhes possível para ajudar a entender como cada uma dessas coisas pode afetar o sistema sendo desenvolvido. Este site ajudar: http://www.investorwords.com. Porém, tomem cuidado! Certos termos podem estar sendo usados de forma diferente na descrição do projeto e no site. Não confie cegamente nas definições que achar na Internet sobre o assunto!
Certos Use Cases acima têm algoritmos não óbvios que detalhamos aqui.
1 a 7. Para operações de cadastro (CRUD - Create/Read/Update/Delete), cuidado com alguns pontos:
9. [Achar todos os dividendos para uma ação] Ache todas as transações de divivendos que referenciam uma ação.
10. [Achar todos os pagamentos de juros e retorno do principal para um título]. Semelhante a 9.
14. [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.
16. [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.
17. [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.
Vocês vão observar que não pedi interface gráfica (Swing ou Web). Tem três motivos:
Entregue o modelo conceitual e glossário para seu projeto. Forneça explicações suficientes para que o professor entenda seu modelo conceitual. Tenha certeza que todas os User Stories podem ser realizadas com o modelo que você criou.
Embora a análise feita no milestone 1 envolva o sistema completo, faremos várias simplificações ao projeto nas fases de design e implementação. As simplificações são:
Entregue seu projeto arquitetural.
Além do mais, para fornecer dados de entrada para seu sistema, vamos usar uma linguagemzinha textual. Você deve bolar essa linguagem e descrevê-la completamente no seu relatório. A linguagem pode ser muito simples mas deve permitir ativar toda a lógica de negócio para realizar os Use Cases mencionados acima, porém através de comandos textuais em vez de uma interface gráfica. Seu sistema deve ler os comandos na entrada padrão System.in. Desta forma, será fácil executar comandos já digitados em arquivos através do redirecionamento de entrada do shell (usando <).
Um dos comandos de sua linguagem deve permitir testar o resultado (string) de um comando de forma que você poderá expressar testes de aceitação de cada Use Case na sua linguagem.
Junto com seu projeto arquitetural e a descrição de sua linguagem, forneça 19 arquivos chamados uc1.txt, ..., uc17.txt, p1.txt e p2.txt. O arquivo uc1.txt contém comandos na sua linguagem que exercitam a lógica de negócio do Use Case 1 e serve de teste de aceitação para este Use Case. O mesmo ocorre com os arquivos uc2.txt até uc17.txt. Os arquivos p1.txt e p2.txt servem para testar a persistência do seu sistema. Primeiro p1.txt é rodado, depois p2.txt é rodado e testa se houve persistência da informação manipulada em p1.txt. (Depois da simplificação descrita acima, não é necessário fornecer os arquivos uc1.txt, uc2.txt, uc4.txt e uc15.txt.
Entrega dos Use Cases 1 a 7. Use um arquivo XML para a persistência dos dados (use java.beans.XMLEncoder, ou http://www.javaworld.com/javaworld/javatips/jw-javatip138.html, por exemplo). (Como projeto da disciplina BD 1, você poderia sugerir ao professor o uso de um BD relacional nesse projeto). Entregue o código fonte documentado. Entregue também a saída do javadoc. Nos comentários, identifique claramente os patterns utilizados. Adicionalmente, entregue o código fonte de todos os testes de unidade realizados. Use JUNIT para testes de unidade. Entregue também os arquivos uc1.txt a uc7.txt, p1.txt e p2.txt que servirão de testes de aceitação para os Use Cases. Lembre que o professor vai executar os testes de unidade e os testes de aceitação. Lembre dos seguintes pontos ao entregar o resultado:
Entregue artefatos como descrito acima. para simplificar, não há necessidade de implementar múltiplas moedas e conversões de moedas: trate só com Reais. Não esqueça de incluir todos os testes de aceitação em arquivos uc8.txt, ...
Entregue artefatos como descrito acima. Não esqueça de incluir todos os testes de aceitação em arquivos uc16.txt, ... No seu relatório, inclua uma seção que descreve brevemente como colocar uma interface GUI Swing no seu sistema.