Técnicas de Construção
de Programas
Trabalho Final: Sistema de Votação para o Colegiado do Depto. de
Informática Aplicada do Instituto de Informática.
Guilherme Bender e Jonas Meinerz
Trabalho Final

Trabalho desenvolvido por Guilherme Bender e Jonas Meinerz para a disciplina
de Técnicas de Construção de Programas no semestre 2012/2 pela
Universidade Federal do Rio Grande do Sul sob tutela da Prof. Erika Cota.

Os diagramas apresentados neste trabalho foram feitos utilizando a
ferramenta open source StarUML (staruml.sourceforge.net/).

Os testes caixa-preta foram feitos utilizando o framework gratuito JUnit
(junit.org/).

A programação foi realizada com o auxílio da IDE gratuita NetBeans
(netbeans.org/).
Análise de qualidade sobre o código
original
Análise de qualidade

O código original não era satisfatório em:

Extensibilidade;

Reusabilidade;

Decomponibilidade;

Componibilidade;

Compreensibilidade;

Continuidade.
Análise de qualidade

Mudanças propostas:

Adicionar ambiente gráfico;

Padronizar código;

Refatorar código repetido;

Documentar o código;

Salvar o estado atual do sistema;

Refatorar classes que não atendem aos princípios de OO;

Refatorar Switch-Cases muito extensos;

Refatorar classes com métodos sem código;

Programar utilizando a técnica TDD;

Tratar exceções;

Mudar o mecanismo de votação;
Modelagem do projeto
Diagrama de Classes
Original
Nossa proposta
Diagrama de classes

As diferenças entre o diagrama considerado ideal pelos integrantes desse
grupo e o diagrama apresentado no trabalho original eram demasiadas;

Refatorar o código original seria mais custoso e complexo do que construir um
sistema completamente novo;

Decidimos que iniciariamos um novo sistema baseado no nosso diagrama de
classes;
Diferenças entre o diagrama de classes e
a implementação

Na implementação existe uma classe chamada “VotingSystem” que atua como
gerenciador das votações e é a única classe com a qual a interface do sistema
se comunica;

Modelamos no diagrama “Chief” e “Secretary” como classes derivadas de
“FacultyMember”. Na implementação, porém, a única coisa que os distingue
é o campo “role”;
Diagrama de Sequência

Definimos a implementação do sistema de votações baseada no seguinte
diagrama de sequência:
Diagrama de Sequência

O login de usuário, por sua vez, foi implementado seguindo a seguinte
modelagem:
Qualidade do Sistema
Fatores externos
Qualidade do sistema:
Fatores Externos

Buscamos tornar fácil a interação do sistema com o usuário, produzindo uma
interface intuitiva (implica em melhor facilidade de uso);

Nenhum processo executado pelo sistema é demorado ou requer qualquer
tipo de espera do usuários (implica em melhor velocidade);

Adicionamos o salvamento do estado atual do programa, fazendo com que ele
seja útil;

A partir da configuração atual do sistema, seria descomplicado fazê-lo rodar
em um servidor web ou sincronizar as informações salvas pelo programa, para
que usuários possam votar ao mesmo tempo;
Qualidade do sistema:
Fatores Externos

Buscamos assegurar a corretude do programa com testes (automatizados ou
não) e de fato o programa realiza as funções definidas em sua especificação;

Para aumentar a robusteza do sistema, tratamos as possíveis exceções e casos
de “entradas indevidas”;

O sistema é extensível já que os módulos fazem verificações quanto à
consistência dos parâmetros (embora às vezes isso seja redundante) e para
adicionar novas funcionalidades basta extender o “gerenciador” (classe
VotingSystem);
Qualidade do sistema:
Fatores Externos

Não fizemos métodos realmente genéricos porque utilizamos todos os tipos de
métodos genéricos cabíveis para montar o nosso sistema. A sua reusabilidade
é questionável, visto que poucas coisas poderiam ser generalizadas. Todavia,
os métodos que compõem este sistema são métodos reutilizados de
bibliotecas confiáveis;

Os pacotes e classes do sistema são facilmente compatíveis com outros
métodos pois são relativamente consistentes por si só (“relativamente” pois
foram testados por testes de unidade);
Qualidade do sistema:
Fatores Externos

Não existe nenhum procedimento que demande muito processamento e todos
os procedimentos do sistema são executados em tempo real, portanto, é um
sistema eficiente;

O sistema é portável para qualquer ambiente de execução, visto que roda
sobre uma máquina virtual;
Qualidade do Sistema
Fatores internos
Qualidade do Sistema:
Fatores Internos

Padronizamos a nomenclatura das variáveis, classes e métodos do código,
utilizando somente a lingua inglesa e a mesma estrutura de nomenclatura;

Documentamos os métodos simples por si só, mantendo claro o seu
procedimento de execução;

Documentamos os métodos um pouco mais complexos com comentários;

Descrevemos as intenções dos métodos seja por seu nome e explicamos as
possibilidades de retorno com um cabeçalho. No cabeçalho, se necessário, é
dada uma introdução de como aquele método opera;
Qualidade do Sistema:
Fatores Internos

Foram executadas refatorações usando o método original como oráculo;

As funções possuem somente um ponto de retorno;

As cláusulas de fim de laços são bastante claras;

Utilizadas enumerações sempre que adequado;
Testes
Testes

Desenvolvemos vários testes antes mesmo da implementação (para as classes
Voting e FacultyMember, por exemplo);

Utilizamos o framework “JUnit”;

O programa interpreta as entradas de I/O como strings, logo, não há
problemas de incompatibilidade de tipo a serem testados (e se o programador
tentar utilizar um tipo diferente, ocorrerá um erro de compilação);
Testes

Encontramos vários erros nos nossos códigos e também nos equivocamos em
certas refatorações, porém a bateria de testes definida tornou fácil a
constatação dos mesmos;

Na bateria de testes atual, o programa teve sucesso;

Todavia, execução é comprometida em alguns casos de falha de gravação e
leitura de arquivos;
Conclusão
Conclusão

Foi possível implementar tudo que especificamos na etapa 1 do trabalho;

Houveram divergências entre a modelagem (etapas 2 e 3) e a implementação
(etapa 4), o que nos fez ver que não é interessante que a modelagem pode
nunca ter um formato “final” e que as etapas de modelagem e
implementação são mais bem feitas se feitas simultâneamente;

A abordagem orientada a objetos facilitou o desenvolvimento do projeto,
embora no início da implementação muitas vezes fazíamos trechos de códigos
“estruturados”;
Trabalho Final – Técnicas de
Construção de Programas
Guilherme Bender
Jonas Calvi Meinerz
Prof. Érika Cota
Universidade Federal do Rio Grande do Sul
Download

Técnicas de Construção de Programas