Refatoração de Código em Ambientes típicos de desenvolvimento ágil

46
Alessandro Alonso Ferreira Calu REFATORAÇÃO DE CÓDIGO EM AMBIENTES TÍPICOS DE DESENVOLVIMENTO ÁGIL Monografia apresentada ao Programa de Pós-Graduação em Engenharia de Software da Pontifícia Universidade Católica de Minas Gerais, Instituto de Educação Continuada. Orientador: Humberto Torres Marques Neto Belo Horizonte 2010

description

Refatoração de Código

Transcript of Refatoração de Código em Ambientes típicos de desenvolvimento ágil

Page 1: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

Alessandro Alonso Ferreira Calu

REFATORAÇÃO DE CÓDIGO EM AMBIENTES TÍPICOS DE DESENVOLVIMENTO ÁGIL

Monografia apresentada ao Programa de Pós-Graduação em Engenharia de Software da Pontifícia Universidade Católica de Minas Gerais, Instituto de Educação Continuada.

Orientador: Humberto Torres Marques Neto

Belo Horizonte2010

Page 2: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

Aos meus pais, minha esposa e meus filhosPela paciência e apoio.

Page 3: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

“...tempo de derrubar, e tempo de edificar...” Rei Salomão

Page 4: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

RESUMO

Esta monografia apresenta a importância da refatoração de código dentro de

ambientes típicos de desenvolvimento Ágil. São contrapostas características da

alteração de funcionalidades em software tratadas nos processos unificado e em

processos ágeis, destacando-se a importância da refatoração no último. São

apresentados os momentos adequados e os papéis responsáveis por realizar

refatoração de código. É realizado um estudo de caso de utilização de técnicas e

ferramentas de refatoração de código PHP em fontes de um projeto real de uma

fábrica de software.

Palavras-chave: Refatoração de código; Desenvolvimento Ágil; Manutenção

Adaptativa; Manutenibilidade; Gerência de Configuração.

Page 5: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

LISTA DE FIGURAS

FIGURA 1 - O impacto das mudanças proposto por PRESSMAN …........ 16

FIGURA 2 - O custo das mudanças proposto em Extreme Programming. 17

FIGURA 3 - Processo de tarefa Controle de Mudanças …....................... 20

FIGURA 4 - Diagrama Classes antes da Refatoração …......................... 31

FIGURA 5 - Diagrama Sequência gera_pontuacao antes da Refatoração 32

FIGURA 6 - Código Fonte gera_pontuação antes da Refatoração …....... 33

FIGURA 7 - Diagrama Classes, Camada Persistência (Refatoração 1).... 36

FIGURA 8 - Diagrama de Classes do Software (Refatoração 2) ….......... 37

FIGURA 9 - Diagrama de Sequência (Refatoração 3) …............….......... 38

FIGURA 10 - Diagrama de Classes após Refatoração ..............….......... 39

FIGURA 11 - Diagrama de Sequência após Refatoração ….......….......... 40

FIGURA 12 - Código Fonte gera_pontuação após Refatoração............... 41

Page 6: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

LISTA DE TABELAS

TABELA 1 - Caso de Uso: Gerar pontuação automática de mês …........... 30

TABELA 2 - Caso de Teste 1: Funcionário com pontos e sem férias …..... 44

TABELA 3 - Caso de Teste 2: Funcionário com pontos e com férias …..... 45

TABELA 4 - Caso de Teste 3: Funcionário somente com férias …............. 46

Page 7: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

LISTA DE ABREVIATURAS

PDT - PHP Development Tools

ECO - Ordem de Mudança de Engenharia

Page 8: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

LISTA DE SIGLAS

IDE – Ambiente de Desenvolvimento Integrado.

UP – Processo Unificado.

XP – Extreme Programming.

Page 9: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

SUMÁRIO

1. INTRODUÇÃO …............................................................................ 101.1 JUSTIFICATIVA …............................................................................ 121.2 OBJETIVOS …..…............................................................................. 14

2. REVISÃO DA LITERATURA .................................................... 16

3. METODOLOGIA …..................................................................... 24

4. ESTUDO DE CASO ................................................................... 274.1 O SOFTWARE ….............................................................................. 284.2 O REQUISITO .….............................................................................. 294.3 O ESTADO INICIAL …...................................................................... 314.4 CRIANDO CASOS DE TESTE …..................................................... 344.5 REFATORANDO …..................…..................................................... 354.6 O ESTADO FINAL …........................................................................ 39

5. CONSIDERAÇÕES FINAIS …................................................ 42

REFERÊNCIAS .................................................................................. 43

APÊNDICE …...................................................................................... 44

Page 10: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

101. INTRODUÇÃO

A presente monografia aborda um tema importante dentro do

desenvolvimento de software em ambientes típicos de processos ágeis. Num

primeiro momento, podemos entender um ambiente característico de

desenvolvimento ágil como um projeto com diversas entregas parciais para

utilização imediata pelo usuário final. Soma-se a isso a opção de mudança

significativa no escopo ou conjunto de requisitos do sistema durante o ciclo de

produção do mesmo.

Também inclui-se no ambiente de discussão desta monografia sistemas que

sofrem manutenção adaptativa contínua para atender a soluções de negócios

tempestuosos. Seriam empresas que mudam estratégias táticas e regras de fluxos

de processos de forma rápida e constante. Estes softwares precisam lançar novas

versões em intervalos curtos de tempo e com pequenas adaptações.

É importante deixar claro que não é objetivo desta monografia defender ou

discutir a utilização de metodologias ágeis. A refatoração de código pode e deve ser

utilizada dentro do Processo Unificado (UP) caso se faça necessário. O foco aqui é

na realidade a necessidade de planejamento e utilização de refatoração de código

em softwares que sofrem mudanças constantes de funcionalidades. Pretende-se

levantar importantes aspectos da refatoração de código como: o seu custo; o seu

impacto na qualidade do produto e do processo; a sua correta utilização dentro do

processo de desenvolvimento adotado e adaptado pela fábrica de software; e

Page 11: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

11algumas das técnicas e ferramentas conhecidas e oferecidas atualmente para

refatoração rápida e segura.

Page 12: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

121.1 JUSTIFICATIVA

Equipes de desenvolvimento de software tem-se deparado com projetos de

soluções em tecnologia da informação direcionados para empresas clientes com

cenários de negócio instáveis. Estas empresas podem possuir dentre outras

características: estratégias de marketing agressivo, venda de serviços relacionados

a tecnologia de ponta, alta expansão de mercado, mudança constante de

posicionamento de mercado, investimento alto em novas tecnologias para redução

de custo na produção, adaptação constante a mudanças de leis governamentais e

outras necessidades que levam a mudança constante e rápida dos processos

internos e da forma como a informação é tratada. Organizações como estas não

podem esperar muito tempo por novas versões de software customizado que se

adaptem a suas mudanças. Esperar significaria perda de mercado, desatualização

tecnológica, desperdício de valores em custo de produção e quebra de leis.

As fabricas de software precisam atender satisfatoriamente a demanda de

clientes como os descritos acima. Desta forma, projetos de sistemas com liberação

de versões de uso em períodos menores que um ou dois meses são oferecidos. As

equipes de desenvolvimento destes projetos precisam se capacitar e adaptar para

exercer suas atividades de forma eficaz. Precisam sobreviver dentro do ciclo de vida

de um software produzido com várias entregas parciais e em constante manutenção

adaptativa. Fatores como a clareza dos requisitos das partes interessadas e sua

ordem de importância, conhecimento da arquitetura do sistema desenvolvido por

Page 13: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

13toda a equipe, boas práticas de programação e utilização de padrões de projeto na

escrita do código fonte são determinantes.

A refatoração de código ganha um brilho dourado dentro de projetos como

como os descritos acima. Sistemas com alterações, adaptações, correções e

anulações dos requisitos de tempos em tempos tendem a criar algumas distorções

em seu código fonte como: Emendas em fluxos lógicos e condicionais;

descaracterização da entradas, realizações e saídas das funções esperadas pelo

seu nome; perda de sentido da relação e hierarquia de classes e outros problemas

que serão tratados mais detalhadamente adiante.

A refatoração de código pretende manter o código fonte claro, cultivando boas

práticas de programação e utilização de padrões de projeto. Renomeia variáveis,

funções e classes a partir de seu significado. Muda uma função de uma classe para

outra de acordo com suas responsabilidades. Cria classes que se tornam

necessárias e destrói classes que se tornam desnecessárias. Muda hierarquia de

classes conforme mudança em suas relações. Enfim, a refatoração de código prove

manutenibilidade ao sistema produzido garantindo um menor custo nas versões

atual e futuras do mesmo.

Apesar de seus benefícios, a refatoração de código precisa ser realizada de

forma adequada e no momento adequado dentro do ciclo de desenvolvimento do

software. Para tanto é necessária a utilização de técnicas e ferramentas que

otimizam e garantam maior confiabilidade e segurança. É importante também a

determinação dos momentos adequados e os papéis responsáveis por realizar

refatoração de código dentro do processo de desenvolvimento da fábrica de

software.

Page 14: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

141.2 OBJETIVOS

O objetivo principal desta monografia é apresentar a refatoração de código

como um importante aliado para equipes de desenvolvimento de software. Em

algum momento o programador precisará alterar código fonte para corrigir erros,

acrescentar, modificar ou retirar funcionalidades do sistema. Caso isso ocorra várias

vezes em um mesmo caso de uso, ou em um mesmo conjunto de classes, ou em

um mesmo grupo de arquivos fontes, refatorar é uma boa opção.

Normalmente o código fonte de um projeto é alterado por desenvolvedores

diferentes durante sua construção e manutenção. Manter boas práticas de

programação garante manutenibilidade ao software. Manter o código claro e

comunicativo aumenta a produtividade e diminui o risco de alterações do sistema.

Um dos objetivos específicos desta monografia é listar algumas das técnicas e

ferramentas conhecidas atualmente para refatorar código e mostrar como estas

técnicas podem diminuir o custo desta tarefa. Outro dos objetivos é avaliar como a

refatoração de código, por conseguinte, pode diminuir o custo de alterações e

lançamentos de novas versões de software.

É preciso apontar dentro da definição do processo de software de uma

fábrica, setor ou equipe de desenvolvimento quem, em qual momento e como se

realizará refatoração de código. Ou ainda se ficará a cargo da equipe de

programadores a utilização deste recurso nos momentos em que julgar necessário.

É também objetivo desta monografia localizar a refatoração de código dentro do

processo de desenvolvimento de software. Pretende-se propor ainda, um fluxo de

Page 15: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

15tarefas que realizadas viriam a cumprir a atividade de refatoração de código dentro

deste processo.

Enfim, um último objetivo seria mostrar e discutir requisitos para uma

ferramenta de refatoração de código eficaz. Ferramentas de refatoração adequadas

agilizam ainda mais esta atividade, tornando-a menos entediante, mais precisa e

consequentemente mais utilizada. Apresenta-se nesta monografia alguns dos

atributos necessários para adoção, aquisição ou mesmo construção de uma

ferramenta de refatoração.

Page 16: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

162. REVISÃO DA LITERATUA

Uma das pré-suposições básicas do desenvolvimento Ágil é: custa menos

realizar alterações em sistemas com versões já em utilização do que tentar levantar

detalhadamente todos os requisitos desejados pelo cliente antes de começar a

construir a primeira versão software. Este é um dos pontos de diferença entre o

Processo Unificado (UP) é processos Ágeis como por exemplo o Extreme

Programming (XP).

PRESSMAN (2001) chama de mito a consideração de que mudanças de

software podem ser facilmente realizadas. Ele apresenta ainda um gráfico

representativo do custo de mudanças ao longo do ciclo de vida do sistema.

Figura 1: O impacto das mudanças proposto por PRESSMAN Fonte: PRESSMAN, 2001

PRESSMAN sugere o Gerenciamento de Configuração para o controle de

mudanças de software durante o clico de desenvolvimento e vida do mesmo. As

Page 17: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

17atividades do Gerenciamento de Configuração seriam: “(1) Identificar Mudanças; (2)

Controlar Mudanças; (3) Garantir que mudanças sejam corretamente

implementadas; (4) Reportar mudanças as partes interessadas.” (PRESSMAN,

2001, p.225). PRESSMAN admite que mudanças em software são inevitáveis,

prepara-se para o tratamento destas mudanças, mas não deseja nem estimula a sua

ocorrência para o processo de desenvolvimento de software.

Como mostra KRUCHTEN (2003), o Processo Unificado (UP) provê

atividades para concepção e fechamento do escopo do projeto logo na primeira fase

de desenvolvimento do software com as seguintes características: seleção dos

requisitos mais importantes, visão geral do software, custo total, prazo, recursos

necessários e riscos previstos. Prossegue então o ciclo de vida de desenvolvimento

para a fase de elaboração onde então todo o restante dos requisitos são detalhados.

O Processo Unificado (UP) segue o mesmo critério quanto a mudanças defendido

por PRESSMAN. Procura definir todas as funcionalidades do software

detalhadamente antes de construir o mesmo para diminuir o risco de alterações na

arquitetura, no desenho ou no próprio código do sistema após desenvolvido.

Metodologias ágeis pensam de forma diferente. BECK propõe um outro

gráfico para variação do custo de mudanças no tempo de vida de um sistema:

Figura 2 - O custo das mudanças proposto em Extreme Programming Fonte: BECK, 1999

Page 18: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

18BECK (1999) justifica o gráfico por um lado pela existência em ferramentas

que mapeiam as classes de um projeto, suas responsabilidades e a troca de

mensagens entre elas. Desta forma se torna menos trabalhoso verificar o impacto de

uma mudança de funcionalidade específica do projeto de software. Por outro lado

BECK baseia-se em três fatores relacionados ao processo Extreme Programming

(XP): o desenho simples; os testes automáticos e praticas padronizadas de

modificação de desenho.

O Desenho Simples é uma das práticas do Extreme Programming. BECK

(1999) descreve que o desenvolvimento extremo não precisa se preocupar em

antecipar mudanças no projeto de software, realizando na interação atual somente

os requisitos negociados com o cliente. Classes complexas, utilizadas como

fundamento estrutural do código no desenvolvimento de projetos longos, não são

bem recebidas no XP.

Os testes automáticos possibilitados por ferramentas adquiridas no mercado

ou construídas pela própria equipe de desenvolvimento conferem segurança na

realização de mudanças no código. BECK (1999) atribui ao programador ou a

equipe de programadores a responsabilidade de sempre realizar testes automáticos

unitários, registrando e acrescentando na lista novos testes concebidos durante o

desenvolvimento de novas funcionalidades. Somando-se aos testes automáticos,

BECK (1999) atribui ao cliente, que também participa da equipe de desenvolvimento

no XP, a responsabilidade de realizar testes funcionais nas alterações realizadas no

sistema.

Page 19: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

19O terceiro fator apontado por BECK (1999) são as praticas padronizadas de

modificação de desenho. Estas práticas estão ligadas aos padrões de desenho

apresentados pela Gangue dos Quatro:

Padrões de desenho tornam fácil o reuso com sucesso de desenhos de arquiteturas. Expressando comprovadas técnicas como padrões de desenho elas se tornam mais acessíveis para desenvolvedores de novos sistemas. Padrões de desenho ajudam a você substituir desenhos alternativos que venham comprometer a reusabilidade. (GAMMA, HELM, JOHNSON, VLISSIDES, 1995, p.7)

Para garantir a manutenção do código fonte com um desenho padronizado,

BECK (1999) coloca como uma das práticas do XP a refatoração do código.

FOWLER oferece dois conceitos para refatoração de código:

Refatoração (substantivo): uma alteração feita na estrutura interna do software para torna-lo mais fácil de ser entendido e menos custoso de ser modificado sem alterar o seu comportamento observável. (FOWLER, 2004, p.52)

Refatorar (verbo): reestruturar software aplicando uma série de refatorações sem alterar seu comportamento observável. (FOWLER, 2004, p.53)

A Gangue dos Quatro (GAMMA, HELM, JOHNSON, VLISSIDES, 1995) afirma

que padrões de projeto são alvos para refatoração. Segundo FOWLER “Muitas

refatorações (…) são sobre a introdução de padrões em um sistema” (FOWLER,

2004, p.98) .

É importante perceber que tanto o UP quanto XP preveem mudanças e criam

meios para tratá-las. Ao trabalhar com mudanças mais rigidamente na Gerência de

Configuração do Processo Unificado ou mais intensamente nas diversas pequenas

interações dos processos ágeis, utilizar refatoração para manter o código segundo

padrões consagrados de desenho ajuda a diminuir os custos e a garantir a qualidade

do software. FOWLER (2004) lista quatro razões por que se deve refatorar.

A primeira razão apontada por FOWLER é que refatoração melhora o projeto

de software mantendo sua manutenibilidade. “Sem refatoração, o projeto do

Page 20: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

20programa termina por se deteriorar” (FOWLER, 2004, p.54). Descrevendo a tarefa

Controlar Mudanças da Atividade de Gerencia de Configuração, PRESSMAN (2001)

alerta que em projetos de softwares de longa duração não controlar mudanças leva

rapidamente para o caos. Apresenta então um processo sistemático para controle de

mudanças conforme a figura que pode ser vista abaixo:

Fonte: PRESSMAN, 2001

Neste processo quatro passos são semelhantes ou podem utilizar técnicas de

refatoração: Change report is generated (Relatório de mudanças gerado), Make the

change (Realizar mudança), Review (audit) the change (Revisar Mudança) e ECO

Page 21: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

21(Ordem de Mudança de Engenharia) generated (Gerar ECO). Segundo PRESSMAN,

o relatório da mudança é gerado a partir da avaliação da importância da mudança

versus seu impacto nos artefatos do projeto e nas funcionalidades do sistema. Após

a mudança ser realizada, ela é revisada segundo critérios definidos na ECO (Ordem

de Mudança de Engenharia).

A segunda razão apontada por FOWLER é “refatoração torna o software mais

fácil de entender” (FOWLER, 2004, p.54). Em Extreme Programming (XP) o

entendimento do código é um fator muito importante. Como o XP diminui a

quantidade de artefatos produzidos durante o desenvolvimento, o código ganha

status de documentação. Um código complexo ou confuso nesta situação inviabiliza

o processo. BECK (1999) descreve que dentro da equipe de desenvolvimento XP

os novos membros são cada vez mais e mais encorajados a aceitar

responsabilidades. Um dos quatro valores do Extreme Programming é a

comunicação. Um código complexo e confuso não comunica nada e desencoraja

qualquer um de colocar as mãos nele. Descrevendo sobre a atividade codificar, uma

das quatro atividades básicas do XP, BECK(1999) lista como um código bem escrito

pode comunicar: expressando intentos táticos do sistema, descrevendo algorítimos,

pontuando passos para uma futura expansão ou contração e indiretamente também

provendo uma especificação para o sistema em todos os seus níveis.

A terceira razão apontada por FOWLER é “refatorar ajuda a encontrar falhas”

(FOWLER, 2004, p.55). Como resultado “Refatorar me ajuda ajuda a ser muito mais

efetivo na escrita de código robusto” (FOWLER, 2004, p.55). Existe porém o risco da

própria refatoração introduzir erros no projeto. Podemos listar pelo menos duas

formas de se evitar isso. Uma é a criação de ferramentas automáticas de teste a

Page 22: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

22partir de casos de teste e também testes unitários. BECK (1999) lista dentro do

trabalho do programador, ou par de programadores, as atividades de refatoração de

código e realização de testes unitários. Estas atividades devem ser realizadas a

medida da necessidade e de forma entrelaçada.

A outra forma de se evitar erros na refatoração e a utilização de ferramentas

para esta atividade. ROBERTS e BRANT (2004) listam alguns critérios técnicos e

práticos necessários para uma ferramenta de refatoração. Como critérios técnicos

temos: “a habilidade de procurar diversas entidades do programa por todo

programa” (ROBERTS,BRANT, 2004, p. 342) que pode oferecida pela existência de

um Banco de Dados o Programa; Árvores de Análise Semântica que são “uma

estrutura de dados que representa a estrutura interna do próprio método”

(ROBERTS,BRANT, 2004, p. 343); e Acurácia de forma a manter o comportamento

do código após refatorado. Como critérios práticos temos velocidade na realização

automática de refatorações, a opção de desfazer refatorações voltando ao estado

anterior e a integração com outras ferramentas em um único ambiente de

desenvolvimento.

A quarta e última razão apontada por FOWLER é que refatoração aumenta a

velocidade de desenvolvimento do software. Segundo FOWLER (2004) isso

acontece em dois momentos. No próprio momento da alteração do código no

presente, onde o desenvolvedor estuda o código enquanto o refatora e, após

entender melhor o comportamento do código, implementa a alteração mais

rapidamente. Esta primeira situação é ilustrada hipoteticamente por BECK (1999)

que simula uma situação de alteração de código por um par de programadores onde

Page 23: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

23em um certo momento são realizadas refatorações para melhor entendimento do

código. E também em um momento futuro:

Um bom projeto é essencial na manutenção da velocidade de desenvolvimento de software. Refatorar ajuda você a desenvolver software mais rapidamente, porque evita que o projeto do sistema deteriore. A refatoração pode até mesmo melhorar um projeto. (FOWLER, 2004, p.56)

Page 24: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

243. METODOLOGIA

Como metodologia desta monografia adota-se a abordagem dedutiva:

Partindo-se das circunstâncias utilizadas como justificativa para Processos de

Desenvolvimento Ágil e caminhando-se para a defesa da refatoração de código. E

qualitativa: Realizando-se um estudo de caso onde utilizam-se técnicas e

ferramentas de refatoração.

Boa parte do conteúdo desta monografia é apresento no capítulo anterior,

Revisão da Literatura, isso porque o estudo teórico foi escolhido como uma das

modalidades de trabalho. Estuda-se a importância da refatoração de código. A outra

modalidade de trabalho, apresentada no próximo capítulo, é o Estudo de Caso. São

experimentadas técnicas de refatoração de código em um projeto real de software.

a) As etapas de pesquisa e elaboração desta monografia foram realizadas na

seguinte ordem:

• Estudo de referencial teórico em literatura sobre refatoração de código,

padrões de projeto de código, processos de desenvolvimento de software e

metodologias ágeis.

• Escolha de porção código de projeto de real para experimentação de técnicas

de refatoração de código.

• Preparação de ambiente para execução de técnicas de refatoração de código.

• Experimentação de técnicas de refatoração, registro de etapas e resultados.

• Elaboração de revisão de literatura de literatura de monografia.

Page 25: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

25• Análise de resultados de estudo de caso em contraponto com revisão de

literatura.

• Finalização de monografia com registro de análise de resultados e

conclusões.

b) Os métodos utilizados são:

• Estudo de referencial teórico.

• Avaliação de ferramentas de refatoração de código.

• Testes de funcionalidades de softwares antes e após refatoração.

• Avaliação de qualidade de código antes e após refatorado.

• Registro de problemas e medidas tomadas.

• Registros de resultados positivos e negativos em utilização de técnicas e

ferramentas de refatoração de código.

c) As ferramentas utilizadas são:

• Eclipse Galileo for PHP Developers (Build id: 20100218-1602), disponibilizado

para download em http://eclipse.org/ .

• PHPDoc 1.4.2 released, disponibilizado para download em http://phpdoc.org/ .

• Visual Paradigm for UMP Community Edition Version 6.4 (Build20081026),

disponibilizado para download em http://www.visual-paradigm.com/.

• BrOffice.org 3.1.0 (OOO310m11 Build: 9399), disponibilizado para download

em http://www.openoffice.org .

Page 26: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

26d) O ambiente utilizado para experimentação no estudo de caso possui as seguintes

configurações:

• Notebook Dell Inspiron 1545. Processador: Intel(R) Core(TM) 2 Duo CPU

T6500 @2.5GHz 2.10GHz. Memória RAM: 3,00 GB.

• Sistema Operacional: Windows Vista Home Edition Service Pack1.

• Servidor Web: Wamp Server Version 2.0, Created by Romain Bourdon

([email protected]), Sources are available at SourceForge. Disponibilizado

para download em http://www.wampserver.com

Page 27: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

274. ESTUDO DE CASO

Esta seção contém refatoração de código utilizada na prática. O objetivo

principal é experimentar algumas das técnicas existentes de refatoração. O processo

será testar as funcionalidades do código existente, aplicar alguma técnica de

refatoração, testar novamente funcionalidades do código, aplicar mais algumas

técnicas de refatoração, testar mais uma vez funcionalidades do código, corrigir

eventuais erros, refatorar, e testar . Foi preparado um ambiente com o Eclipse como

ferramenta de desenvolvimento e refatoração e o Wamp, Apache + PHP + MySQL,

como Servidor Web. Outra ferramenta de refatoração utilizada é o PHPDocument.

Não é apresentado um estudo completo de técnicas nem de ferramentas de

refatoração pelo fato de não ser este o objetivo deste estudo de caso. Seria

necessário escrever um livro para testar exaustivamente técnicas de refatoração.

Também não foram encontradas muitas ferramentas de refatoração de código para

linguagem PHP. O PHPDocument auxilia a montar um banco de dados de classes,

atributos e métodos do programa a ser refatorado. O ambiente de Desenvolvimento

Integrado (IDE) Eclipse na versão instalada possui a ferramenta PDT 2.1(PHP

Development Tools 2.1) que oferece alguns recursos úteis para refatoração de

código.

Descreve-se primeiramente o software de cujo parte código sofrerá

refatoração. Depois é apresentado o requisito específico que será trabalhado, o caso

de uso relacionado a este requisito, um diagrama de classes que ajudará a entender

a estrutura desta parte do sistema e um diagrama de sequência que ajudará a

Page 28: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

28entender o seu funcionamento. Para fins de comparação, coloca-se uma porção do

código que será refatorado no seu estado inicial.

Antes de refatorar são elaborados casos de teste e é construída uma

ferramenta de testes automáticos que será executada a cada refatoração do código.

Durante a refatoração são exibidos diversos diagrama de classes, quando as

responsabilidades das classes mudam, diagrama de sequência, quando a sequência

de métodos muda e porções refatoradas de código quando necessário. Foram

priorizados os diagrama de classes e sequência ao código em si porque eles são

mais compactos e descrevem mais claramente a mudança.

Por fim coloca-se uma porção de código após refatorado, um diagrama de

classes e um diagrama de sequência com o objetivo de comparação com os seus

paralelos no estado inicial.

4.1 O SOFTWARE

O sistema objeto deste estudo de caso tem um propósito bem simples:

calcular pontuação de funcionários de uma equipe de trabalho e classificar estes

funcionários segundo a pontuação. Na realidade não é um sistema, mas um sub-

sistema, uma ferramenta que integra com um sistema de gerenciamento de projetos

para recuperar dados de apontamento de horas da equipe de colaboradores e então

calcula as pontuações segundo critérios pré-estabelecidos.

Page 29: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

29A equipe de recursos humanos da empresa cliente que solicitou o sub-

sistema, utiliza as informações de pontuação para premiar os funcionários com o

intuito de estimula-los a chegar pontualmente ao local de trabalho e também sair

após o horário esperado. Apesar da empresa não exigir um horário fixo de chegada

e saída dos seus funcionários, precisa da presença das equipes dos diversos

projetos dentro do horário comercial, onde seus clientes podem ter acesso a eles.

4.2 O REQUISITO

Abaixo o requisito transcrito da documentação do projeto de desenvolvimento

do sub-sistema de calculo de pontuações de funcionários:

Indicadores de Cumprimento de Horário: Serão distribuídos até 10 pontos por dia por funcionário, relacionado ao cumprimento de horários.

Até 5 (cinco) pontos para horário de chegada: chegando até as 09:00 horas, o funcionário recebe 5 (cinco) pontos; combinando com o gerente até o dia anterior sobre eventuais atrasos, recebe 5 (cinco) pontos, limitado a 2 dias por mês; chegando das 9:00 hrs até as 9:30 hrs, avisando até 09:00 hrs sobre o atraso, recebe 4 (quatro) pontos; chegando das 9:00 hrs até as 9:30 hrs sem avisar sobre o atraso, recebe 3 (três) pontos; chegando das 9:30 hrs até as 10:00 hrs, avisando até as 09:00 hrs sobre o atraso, recebe 2 (dois) pontos; chegando das 9:30 hrs até as 10:00 hrs, sem avisar sobre o atraso, recebe 1 (um) ponto; chegando das 10:00 hrs até as 10:30 hrs, avisando até as 9:00 hrs sobre o atraso, recebe 1 (um) ponto; chegando após às 10:00 hrs, sem avisar sobre o atraso, não recebe pontos.

Até 5 (cinco) pontos para horário de saída: combinando com o gerente até o dia anterior sobre saídas mais cedo, recebe 5 (cinco) pontos, limitado a 2 (dois) dias por mês; saindo após às 17:30 hrs, o funcionário recebe 5 (cinco) pontos; saindo das 17:00 hrs até às 17:30 hrs, o funcionário recebe 4 (quatro) pontos; saindo das 16:30 hrs até às 17:00 hrs, o funcionário recebe 3 (três) pontos; saindo das 16:00 hrs até às 16:30 hrs, o funcionário recebe 2 (dois) pontos; saindo antes das 16:00 hrs o funcionário não recebe pontos.

Orientações gerais: combinando com o gerente até o dia anterior sobre ausências de um período, o funcionário recebe 3 (três) pontos; faltando a um período sem um aviso prévio o funcionário recebe 5 (cinco) pontos; faltando a um dia sem aviso prévio o funcionário perde 10 (dez) pontos; funcionários em férias ou em recesso recebem por dia a média de pontos por dia obtida no mês anterior; ao final de cada mês, para cada hora

Page 30: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

30devedora no banco de horas o funcionário perderá 2 (dois) pontos. (Documentação de Projeto de Software)

No projeto estudado, a empresa cliente solicitou o desenvolvimento do

sistema num prazo de uma semana. A equipe de recursos humanos haviam

anunciado o programa de pontos no mês anterior e desejavam realizar a primeira

premiação. Não foi elaborada nenhuma documentação além do requisito e do código

fonte. No entanto, um primeiro trabalho para entender melhor o código que se

pretende refatorar será elaborar um documento descritivo de caso de uso, um

diagrama de classes e um diagrama de sequência.

O descritivo de caso de uso é apresentado abaixo:

Tabela 1: Caso de Uso - Gerar pontuação automática de mês.

Descritivo de Caso de Uso: Gerar pontuação automática de mês

Descrição: Realizar calculo de pontuação mensal de funcionários durante o mês.

Condições Prévias:- Integração com sistema de Gerenciamento de Projetos ter recuperado dados de apontamentos de horas de funcionários em projetos.Fluxo Básico:1) Usuário inicia caso de uso.2) Sistema exibe tela solicitando Mês para geração de pontuação.3) Usuário informa Mês e confirma inicio de processamento.4) Sistema busca lista de funcionários.5) Para cada funcionário sistema busca apontamentos de horas no mês indicado.6) Para cada dia de apontamento de horas do funcionários sistema calcula pontuação diária. 6.1) Sistema calcula pontuação por hora de chegada segundo regras: Até 5 (cinco) pontos para horário de chegada: chegando até as 09:00 horas, o funcionário recebe 5 (cinco) pontos; combinando com o gerente até o dia anterior sobre eventuais atrasos, recebe 5 (cinco) pontos, limitado a 2 dias por mês; chegando das 9:00 hrs até as 9:30 hrs, avisando até 09:00 hrs sobre o atraso, recebe 4 (quatro) pontos; chegando das 9:00 hrs até as 9:30 hrs sem avisar sobre o atraso, recebe 3 (três) pontos; chegando das 9:30 hrs até as 10:00 hrs, avisando até as 09:00 hrs sobre o atraso, recebe 2 (dois) pontos; chegando das 9:30 hrs até as 10:00 hrs, sem avisar sobre o atraso, recebe 1 (um) ponto; chegando das 10:00 hrs até as 10:30 hrs, avisando até as 9:00 hrs sobre o atraso, recebe 1 (um) ponto; chegando após às 10:00 hrs, sem avisar sobre o atraso, não recebe pontos. 6.2) Sistema calcula pontuação por hora de saída segundo regras: Até 5 (cinco) pontos para horário de saída: combinando com o gerente até o dia anterior sobre saídas mais cedo, recebe 5 (cinco) pontos, limitado a 2 (dois) dias por mês; saindo após às 17:30 hrs, o funcionário recebe 5 (cinco) pontos; saindo das 17:00 hrs até às 17:30 hrs, o funcionário recebe 4 (quatro) pontos; saindo das 16:30 hrs até às 17:00 hrs, o funcionário recebe 3 (três) pontos; saindo das 16:00 hrs até às 16:30 hrs, o funcionário recebe 2 (dois) pontos; saindo antes das 16:00 hrs o funcionário não recebe pontos.6.3) Sistema adiciona pontos relacionados a regra: combinando com o gerente até o dia anterior sobre ausências de um período, o funcionário recebe 3 (três) pontos.7) Sistema registra pontuação diária de funcionário.8) Sistema verifica existência de período de férias do funcionário dentro do mês.9) Sistema registra pontuação média diária de funcionário do mês anterior para cada dia do período de férias.10) Sistema calcula desconto de horas de funcionário relacionados a horas devedoras no mês segundo regra: para cada hora devedora no banco de horas o funcionário perderá 2 (dois) pontos. 11) Caso existam mais funcionários para processar sistema retorna ao passo 5). Caso NÃO existam finaliza o caso de uso.

Condições Posteriores: - Pontuações mensais de funcionários registradas.

Page 31: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

314.3 O ESTADO INICIAL

Através do código fonte de todo o projeto pode-se elaborar o diagrama de

classes apresentado abaixo:

Figura 4: Diagrama de Classes antes da Refatoração

Page 32: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

32Abaixo está o diagrama de sequencia do método gera_pontuacao() da classe

gera_pontuacao_automatica_mes:

Figura 5: Diagrama de Sequência método gera_pontuação antes da Refatoração.

Page 33: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

33Apresenta-se abaixo o código fonte PHP do método gera_pontuacao:

Figura 6: Código Fonte gera_pontuacao antes da Refatoração

Function gera_pontuacao(){ if(!$dia_processamento)

{ $dia_processamento = date("Y-m-d");

}

$query = " SELECT cod_funcionario, cod_funcionario_interface FROM TB_FUNCIONARIO WHERE 1=1"; $result = $bd->SQL_query_result($query); if ($bd->SQL_num_rows_result($result))

{ while(list($cod_funcionario, $cod_funcionario_interface) = $bd->SQL_fetch_result($result))

{ $motivo->remove_motivos_automaticos($cod_funcionario, $dia_processamento); $query = " SELECT

MIN(hor_entrada) entrada, MAX(hor_saida) saida, dta_ponto FROM TB_PONTO_FUNCIONARIO WHERE

dta_ponto BETWEEN '" .$this->data_processamento_inico."'AND '" .$this->data_processamento_fim."'

AND cod_funcionario = '" .$cod_funcionario."'GROUP BY

cod_funcionario, dta_ponto" ; $result2 = $bd->SQL_query_result($query); if ($bd->SQL_num_rows_result($result2))

{ while($vet_ponto = $bd->SQL_fetch_assoc_result($result2))

{ if($vet_ponto["entrada"] > "09:00:00")

{ if($vet_ponto["entrada"] > "09:30:00")

{ if($vet_ponto["entrada"] > "10:00:00")

{ if($vet_ponto["entrada"] > "12:00:00")

{ $interface->insere_motivo_funcionario($cod_funcionario, '4', $vet_ponto["dta_ponto"]);

}}

else{ $interface->insere_motivo_funcionario($cod_funcionario, '9', $vet_ponto["dta_ponto"]);

}}

else{ $interface->insere_motivo_funcionario($cod_funcionario, '8', $vet_ponto["dta_ponto"]);

}}

else{ $interface->insere_motivo_funcionario($cod_funcionario, '7', $vet_ponto["dta_ponto"]);

} if($vet_ponto["saida"] < "17:30:00")

{ if($vet_ponto["saida"] < "17:00:00")

{ if($vet_ponto["saida"] < "16:30:00")

{ if($vet_ponto["saida"] < "13:00:00")

{ $interface->insere_motivo_funcionario($cod_funcionario, '5', $vet_ponto["dta_ponto"]);

} if($vet_ponto["saida"] > "16:00:00")

{ $interface->insere_motivo_funcionario($cod_funcionario, '13', $vet_ponto["dta_ponto"]);

}}

else{ $interface->insere_motivo_funcionario($cod_funcionario, '12', $vet_ponto["dta_ponto"]);

}}

else{ $interface->insere_motivo_funcionario($cod_funcionario, '11', $vet_ponto["dta_ponto"]);

}}

else{ $interface->insere_motivo_funcionario($cod_funcionario, '10', $vet_ponto["dta_ponto"]);

}}

} $query_ferias = " SELECT

cod_usuarioFROM

" .BANCO_INTERFACE.".ferias WHERE

flg_status_ferias = '1' AND dth_inicio_ferias <= '" .$vet_ponto["dta_ponto"]."' AND dth_fim_ferias >= '" .$vet_ponto["dta_ponto"]."'AND cod_usuario = '" .$cod_funcionario_interface."'";

$result_ferias = $bd->SQL_query_result($query_ferias); if ($bd->SQL_num_rows_result($result_ferias))

{ $interface->insere_motivo_funcionario($cod_funcionario, '6', $vet_ponto["dta_ponto"]); $interface->insere_pontos_ferias($cod_funcionario, $vet_ponto["dta_ponto"]);

}}

} echo "Processamento finalizado!";

}

Page 34: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

34O Diagrama de Classes inclui as classes persistentes, tabelas do banco de

dados e as classes relacionadas a camada de controle do sistema que implementam

as regras de negócio. A classes da camada visual não foram documentadas por

fazerem parte de uma framework e estarem fora do âmbito deste estudo de caso

Através do Diagrama de Sequencia percebe-se alguns problemas no código

fonte relacionado a geração de pontuações de funcionário: a camada de persistência

do código esta entrelaçada com a camada de controle; as responsabilidades das

classes não estão bem estabelecidas; existe um forte acoplamento entre as classes

e o método gera_pontuacao é longo. Durante a refatoração será tratado cada um

destes problemas.

O código fonte do método gera_pontuacao além de longo tem um fluxo

complexo e não comunica exatamente o seu propósito. Durante a refatoração este

método será quebrado em vários métodos que terão nomes descritivos de cada

etapa da geração de pontuação.

4.4 CRIANDO CASOS DE TESTE

A partir do Descritivo de Caso de Uso, ver Tabela 1, foram elaborados três

casos de teste. Um caso de teste para funcionário com registro de pontos e sem

férias, um caso de teste para funcionário somente com férias e um caso de teste

para funcionário com férias e registro de pontos no mês. Nos registros de pontos dos

funcionários são realizados testes de fronteira. Foi criada uma ferramenta que

Page 35: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

35realiza os três casos teste de uma só vez no código, sinalizando caso ocorram erros.

Esta monografia não são explicadas as técnicas de testes de software, para saber

mais sobre assunto consulte MYERS (1985). Os casos de teste criados podem ser

vistos no Apêndice A.

4.5 REFATORANDO

Criados os casos de teste e construída a ferramente que executa

automaticamente os testes, o próximo passo é começar efetivamente a refatorar o

código para corrigir os problemas encontrados. É tratado cada um dos problemas de

por vez:

a) Resolvendo o problema - a camada de persistência do código esta

entrelaçada com a camada de controle: Para resolver este problema foram

criadas ou refatoradas as classes do tipo entidade que são responsáveis por manter

os dados do sistema. Foi criada uma classe para manter cada uma das tabelas com

atributos referentes aos campos da tabela e métodos para gravar, recuperar e

apagar registros. Foi utilizado o padrão de desenho Factory Method da Gangue dos

Quatro (GAMMA, HELM, JOHNSON, VLISSIDES, 1995), desta forma todas as

classes entidades descendem de uma nova classe tabela e são fabricadas por uma

classe fabrica_tabela. Para representar esta refatoração é exibido abaixo um

diagrama de classes somente com as classes entidade após a refatoração.

Page 36: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

36

Figura 7: Diagrama de Classes de Camada de Persistência (Refatoração 1)

Após esta refatoração é possível mudar o Diagrama de Classes Inicial do

Software atualizando as classes de entidades e retirando a classe class_bd. Esta

classe, bem como a nova classe fabrica_tabela, podem ficar escondidas dentro de

um pacote de persistência do projeto. Para isso é preciso refatorar os métodos que

fazem acesso direto a classe class_bd para acessarem métodos das classes de

entidade. Isso pode ser feito utilizando o métodos de refatoração Extrair Método e

Criar um Método Padrão (FOWLER, 2004).

b) Resolvendo o problema - as responsabilidades das classes não estão

bem estabelecidas: Para resolver este problema todos os métodos das classes

foram avaliados e movidos de uma classe para outra de acordo com a

Page 37: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

37responsabilidades destas. Foi utilizado o método de refatoração Mover Método

(FOWLER, 2004). Alguns métodos estavam replicados e foram suprimidos. Foi

criada a classe data_hora para tratar de informações de data e hora. Abaixo a

diagrama de classes após estas movimentações de métodos.

Figura 8: Diagrama de Classes do Software (Refatoração 2)

Page 38: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

38c) Resolvendo o problema - existe um forte acoplamento entre as classes:

Para resolver este problema foi reorganizada a troca de mensagens entre as classes

utilizando-se as técnicas de refatoração Ocultar Delegação e Remover Intermediário

(FOWLER, 2004).

Figura 9: Diagrama de Sequência (Refatoração 3)

d) Resolvendo o problema - o método gera_pontuacao é longo: Para

resolver este problema o método gera_pontuacao foi quebrado em vários métodos

que terão nomes descritivos de cada etapa da geração de pontuação. Foi utilizada a

técnica de refatoração Extrair Método (FOWLER, 2004).

Page 39: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

394.6 O ESTADO FINAL

Abaixo são apresentados os diagramas de classe e sequência e a porção de

código do método gera_pontuacao após a realização de todas as refatorações do

estudo de caso:

Figura 10: Diagrama de Classes após Refatoração

Page 40: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

40

Figura 11: Diagrama de Sequência após Refatoração

Através dos diagramas de classe e de sequência percebe-se como as

responsabilidades das classes estão melhor distribuídas. Percebe-se que somente a

classes de controle gera_pontuacao_automatica_mes tem relação de dependência

com as classes do tipo entidade. Através do código fonte percebe-se mais

facilmente o objetivo do método gera_pontuacao. O desenho das classes e o código

fonte se tornaram menos complexos e mais comunicativos.

Page 41: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

41

Figura 12: Código Fonte gera_pontuação após Refatoração

Function gera_pontuacao_ferias($cod_funcionario, $cod_funcionario_interface){ global $interface, $tb_funcionario_dia, $tb_motivo_funcionario_dia; $lista_ferias = array(); $lista_ferias = $interface->busca_ferias_funcionario($cod_funcionario, $this->data_processamento_inicio, $this->$data_processamento_fim); $media_pontuacao_diaria = $tb_funcionario_dia->get_media_pontos_mes_anterior($cod_funcionario, $this->data_processamento_inicio); if (is_array($lista_ferias) && count($lista_ferias)){ for ($num_ferias = 0; $num_ferias < count($lista_ferias);$num_ferias++)

{ $tb_funcionario_dia->cod_funcionario = $cod_funcionario; $tb_funcionario_dia->dia_funcionario_dia = $lista_ferias[$num_ferias]["dia"]; $tb_funcionario_dia->vlr_pontos_dia = $media_pontuacao_diaria; $tb_motivo_funcionario_dia->cod_motivo_funcionario_dia = $tb_funcionario_dia->grava(0); $tb_motivo_funcionario_dia->cod_funcionario = $cod_funcionario; $tb_motivo_funcionario_dia->cod_motivo = '3'; //Motivo Férias $tb_motivo_funcionario_dia->grava(0);

}}

} function calcula_motivo_entrada($hrs_entrada){ if($hrs_entrada > "09:00:00")

{ if($hrs_entrada > "09:30:00")

{ if($hrs_entrada > "10:00:00")

{ if($hrs_entrada > "12:00:00")

{ return '4'; //Motivo faltou ao periodo

} return ''; // Sem Motivo pois chegou depois das 10:00

} return '9'; //Motivo chegou entre 9:30 e 10:00

} return '8'; // Motivo chegou entre 9:00 e 9:30

} return '7'; //Motivo chegou até as 9:00

} function calcula_motivo_saida($hrs_saida){ if($hrs_saida < "17:30:00")

{ if($hrs_saida < "17:00:00")

{ if($hrs_saida < "16:30:00")

{ if ($hrs_saida < "16:00:00")

{ if($hrs_saida < "13:00:00")

{ return '5'; //Motivo faltou ao periodo

} return ''; // Sem Motivo pois saiu antes das 16:00

} return '13'; // Motivo saiu entre 16:00 e 16:30

} return '12'; //Motivo saiu entre 16:30 e 17:00

} return '11'; // Motivo saiu entre 17:00 e 17:30

} return '10'; //Motivo saiu após as 17:30

} function gera_pontuacao(){ global $tb_funcionario, $tb_funcionario_dia, $tb_motivo_funcionario_dia; $lista_funcionario = array(); $lista_funcionario = $tb_funcionario->buscar(0); if (is_array($lista_funcionario) && count($lista_funcionario))

{ for ($num_funcionario = 0; count($num_funcionario); $num_funcionario++)

{ $cod_funcionario = $lista_funcionario[$num_funcionario]["cod_funcionario"]; $cod_funcionario_interface = $lista_funcionario[$num_funcionario]["cod_funcionario_interface"]; $tb_motivo_funcionario_dia->remove_motivos_automaticos($cod_funcionario, $this->data_processamento_inicio); $lista_ponto = array(); $lista_ponto = $tb_ponto_funcionario->buscar(0); if (is_array($lista_ponto) && count($lista_ponto))

{ for ($num_ponto = 0; count($num_ponto); $num_ponto++)

{ $tb_funcionario_dia->cod_funcionario = $cod_funcionario; $tb_funcionario_dia->dia_funcionario_dia = $lista_ponto[$num_ponto]["dta_ponto"]; $cod_funcionario_dia = $tb_motivo_funcionario_dia->grava(0);

$tb_motivo_funcionario_dia->cod_motivo_funcionario_dia = $cod_funcionario_dia; $tb_motivo_funcionario_dia->cod_funcionario = $cod_funcionario; $tb_motivo_funcionario_dia->cod_motivo = $this->calcula_motivo_entrada($lista_ponto[$num_ponto]["hor_entrada"]); $tb_motivo_funcionario_dia->grava(0); $tb_motivo_funcionario_dia->cod_motivo_funcionario_dia = $cod_funcionario_dia; $tb_motivo_funcionario_dia->cod_funcionario = $cod_funcionario; $tb_motivo_funcionario_dia->cod_motivo = $this->calcula_motivo_saida($lista_ponto[$num_ponto]["hor_saida"]); $tb_motivo_funcionario_dia->grava(0);

}}

$this->gera_pontuacao_ferias($cod_funcionario, $cod_funcionario_interface);}

} echo "Processamento finalizado!";

}

Page 42: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

425. CONSIDERAÇÕES FINAIS

A refatoração de código realizada com as técnicas adequadas e com

ferramentas poderosas podem facilitar muito o trabalho de equipes de

desenvolvimento de projetos que sofrem mudanças constantes. No entanto,

diferente do que os agilístas esperam, o código pode não comunicar de maneira

eficaz os objetivos do software. Durante o estudo de caso percebeu-se a

necessidade de desenhar diagramas de classe, para representar a estrutura do

código de uma forma compacta. Também foram necessários diagramas de

sequência para representar melhor o comportamento dos métodos. Desenhar o

código que se pretende refatorar pode acelerar o processo de refatoração.

Outro aspecto a favor do desenho e contra o código no momento da

comunicação é a universalidade. Diagramas UML podem ser entendidos por um

conjunto bem maior de pessoas que códigos escritos em uma linguagem particular.

Por outro lado o código fonte esta mais perto do programador que é o responsável e

maior interessado da refatoração de código. Uma alternativa seria a utilização de

ferramentas de refatoração que apresentam integração entre desenho e código

fonte.

Por fim, é importante ressaltar a necessidade de criar um processo, ainda que

simples, para a refatoração de código. A equipe de software precisa ser capaz de

detectar os momentos corretos e as locais no código fonte onde é vantajoso

refatorar. Também é necessário definir como uma prática saudável e esperada a

refatoração de código dentro da fábrica de software.

Page 43: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

43REFÊRENCIAS

PRESSMAN, Roger S. Software Engineering: A practitioner's approach. 5th ed. McGraw-Hill, 2001. 860p.

KRUCHTEN, Philipe. The Rational Unified Process: An introduction, 3th ed. Addison-Wesley, 2003. 336p.

BECK, Kent. Extreme Programming Explained: Embrace change. Addison-Wesley, 1999. 137p.

FOWLER, Martin et al. Refatoração: Aperfeiçoando o Projeto de Código Existente. Tradução Acuan Fernandes – Porto Alegre: Bookman 2004. 365p.

ROBERTS, Don; BRANT, J. Ferramentas de Refatoração. In: FOWLER, Martin et al. Refatoração: Aperfeiçoando o Projeto de Código Existente. Tradução Acuan Fernandes – Porto Alegre: Bookman 2004. 365p.

GAMMA, E.; HELM, R.; JOHNSON R.; VLISSIDES, J.; Design Patterns: Elements of Reusable Object Oriented Software. Addison-Wesley, 1995. 358p.

MYERS, G.J. The Art of Software Testing 1st ed. Wiley Interscience, 1985.

Page 44: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

44 APÊNDICE

APÊNDICE A – Casos de Testes

Tabela 2 – Caso de Teste 1: Funcionário com pontos e sem férias

Pontos de Funcionário

Data Chegada Saída Pontos Dia01/02/10 09:00:00 Não Importa Não Importa 17:30:00 Não 1002/02/10 09:01:00 Não Não 17:30:00 Não 803/02/10 09:01:00 Sim Não Importa 17:30:00 Não 1004/02/10 09:30:00 Não Sim 17:30:00 Não 905/02/10 09:00:00 Não Importa Não Importa 17:29:00 Não 906/02/10 Sábado07/02/10 Domingo08/02/10 09:00:00 Não Importa Não Importa 17:29:00 Sim 1009/02/10 09:01:00 Não Não 17:00:00 Não 710/02/10 09:30:00 Não Sim 17:00:00 Não 811/02/10 09:31:00 Não Não 17:30:00 Não 612/02/10 10:00:00 Não Sim 17:30:00 Não 713/02/10 Sábado14/02/10 Domingo15/02/10 Recesso Carnaval16/02/10 Feriado Carnaval17/02/10 10:01:00 Sim Não Importa 17:00:00 Não 918/02/10 10:01:00 Não Não Importa 16:59:00 Não 319/02/10 10:01:00 Não Não Importa 16:30:00 Sim 520/02/10 Sábado21/02/10 Domingo22/02/10 13:00:00 Sim Não Importa 16:29:00 Não 523/02/10 13:00:00 Não Não Importa 16:00:00 Não 224/02/10 09:00:00 Não Importa Não Importa 15:59:00 Não 525/02/10 09:00:00 Não Importa Não Importa 12:00:00 Sim 826/02/10 09:01:00 Não Não 12:00:00 Não 327/02/10 Sábado28/02/10 Domingo

Total de Pontos Mês: 124

Primeiro Caso: Funcionário com registro de pontos e sem férias

AvisouDia Anterior

Avisou Antes das 9:00

Combinou saída cedo

Page 45: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

45

Tabela 3 – Caso de Teste 2: Funcionário com pontos e com férias

Casos de Teste Gerar Pontuação Automática de Mês

Pontos de Funcionário

Data Chegada Saída Pontos Dia01/01/10 09:00:00 Não Importa Não Importa 17:29:00 Não 902/01/10 Sábado03/01/10 Domingo04/01/10 09:00:00 Não Importa Não Importa 17:29:00 Não 905/01/10 09:01:00 Não Não 17:00:00 Não 706/01/10 09:30:00 Não Sim 17:00:00 Não 807/01/10 09:31:00 Não Não 17:30:00 Não 608/01/10 10:00:00 Não Sim 17:30:00 Não 709/01/10 Sábado10/01/10 Domingo11/01/10 09:00:00 Não Importa Não Importa 17:29:00 Não 912/01/10 09:01:00 Não Não 17:00:00 Não 713/01/10 09:30:00 Não Sim 17:00:00 Não 814/01/10 09:31:00 Não Não 17:30:00 Não 615/01/10 10:00:00 Não Sim 17:30:00 Não 716/01/10 Sábado17/01/10 Domingo18/01/10 09:00:00 Não Importa Não Importa 17:29:00 Sim 1019/01/10 09:01:00 Não Não 17:00:00 Não 720/01/10 09:30:00 Não Sim 17:00:00 Não 821/01/10 09:31:00 Não Não 17:30:00 Não 622/01/10 10:00:00 Não Sim 17:30:00 Não 723/01/10 Sábado24/01/10 Domingo25/01/10 09:00:00 Não Importa Não Importa 17:29:00 Sim 1026/01/10 09:01:00 Não Não 17:00:00 Não 727/01/10 09:30:00 Não Sim 17:00:00 Não 828/01/10 09:31:00 Não Não 17:30:00 Não 629/01/10 10:00:00 Não Sim 17:30:00 Não 730/01/10 Sábado31/01/10 Domingo

Total de Pontos Mês Janeiro: 15001/02/10

Férias40

02/02/1003/02/1004/02/1005/02/1006/02/10 Sábado07/02/10 Domingo08/02/10 09:00:00 Não Importa Não Importa 17:29:00 Sim 1009/02/10 09:01:00 Não Não 17:00:00 Não 710/02/10 09:30:00 Não Sim 17:00:00 Não 811/02/10 09:31:00 Não Não 17:30:00 Não 612/02/10 10:00:00 Não Sim 17:30:00 Não 713/02/10 Sábado14/02/10 Domingo15/02/10 Recesso Carnaval16/02/10 Feriado Carnaval17/02/10 10:01:00 Sim Não Importa 17:00:00 Não 918/02/10 10:01:00 Não Não Importa 16:59:00 Não 319/02/10 10:01:00 Não Não Importa 16:30:00 Sim 520/02/10 Sábado21/02/10 Domingo22/02/10 13:00:00 Sim Não Importa 16:29:00 Não 523/02/10 13:00:00 Não Não Importa 16:00:00 Não 224/02/10 09:00:00 Não Importa Não Importa 15:59:00 Não 525/02/10 09:00:00 Não Importa Não Importa 12:00:00 Sim 826/02/10 09:01:00 Não Não 12:00:00 Não 327/02/10 Sábado28/02/10 Domingo

Total de Pontos Mês: 118

Segundo Caso: Funcionário com registro de pontos e com férias

AvisouDia Anterior

Avisou Antes das 9:00

Combinou saída cedo

Page 46: Refatoração de Código em Ambientes típicos de desenvolvimento ágil

46

Tabela 4 – Caso de Teste 3: Funcionário somente com férias

Casos de Teste Gerar Pontuação Automática de Mês

Pontos de Funcionário

Data Chegada Saída Pontos Dia01/01/10 09:00:00 Não Importa Não Importa 17:29:00 Não 902/01/10 Sábado03/01/10 Domingo04/01/10 09:00:00 Não Importa Não Importa 17:29:00 Não 905/01/10 09:01:00 Não Não 17:00:00 Não 706/01/10 09:30:00 Não Sim 17:00:00 Não 807/01/10 09:31:00 Não Não 17:30:00 Não 608/01/10 10:00:00 Não Sim 17:30:00 Não 709/01/10 Sábado10/01/10 Domingo11/01/10 09:00:00 Não Importa Não Importa 17:29:00 Não 912/01/10 09:01:00 Não Não 17:00:00 Não 713/01/10 09:30:00 Não Sim 17:00:00 Não 814/01/10 09:31:00 Não Não 17:30:00 Não 615/01/10 10:00:00 Não Sim 17:30:00 Não 716/01/10 Sábado17/01/10 Domingo18/01/10 09:00:00 Não Importa Não Importa 17:29:00 Sim 1019/01/10 09:01:00 Não Não 17:00:00 Não 720/01/10 09:30:00 Não Sim 17:00:00 Não 821/01/10 09:31:00 Não Não 17:30:00 Não 622/01/10 10:00:00 Não Sim 17:30:00 Não 723/01/10 Sábado24/01/10 Domingo25/01/10 09:00:00 Não Importa Não Importa 17:29:00 Sim 1026/01/10 09:01:00 Não Não 17:00:00 Não 727/01/10 09:30:00 Não Sim 17:00:00 Não 828/01/10 09:31:00 Não Não 17:30:00 Não 629/01/10 10:00:00 Não Sim 17:30:00 Não 730/01/10 Sábado31/01/10 Domingo

Total de Pontos Mês Janeiro: 15001/02/10

Férias40

02/02/1003/02/1004/02/1005/02/1006/02/10 Sábado07/02/10 Domingo08/02/10

Férias40

09/02/1010/02/1011/02/1012/02/1013/02/10 Sábado14/02/10 Domingo15/02/10 Recesso Carnaval16/02/10 Feriado Carnaval17/02/10

Férias24

18/02/1019/02/1020/02/10 Sábado21/02/10 Domingo22/02/10

Férias40

23/02/1024/02/1025/02/1026/02/1027/02/10 Sábado28/02/10 Domingo

Total de Pontos Mês: 144

Terceiro Caso: Funcionário com registro de pontos e com férias

AvisouDia Anterior

Avisou Antes das 9:00

Combinou saída cedo