Gilded Rose Kata: Um desafio de Refactoring e Testes
A prática leva a perfeição, então nada melhor que praticar refactoring e testes em uma aplicação "de verdade" com o Gilded Rose Kata.
Essa semana eu estava interessado em colocar em prática minhas habilidades de Refactoring, refatorar código ruim em código bom, e Testes em código legado, por isso entrei em um dos fóruns que frequento e pedi para que os membros me enviassem qualquer código que eles acreditavam ser um código ruim.
Coincidentemente um dos membros me apresentou um Code Kata de 2012, que apesar de antigo era exatamente o que eu procurava, então resolvi tentar esse desafio e aproveitar para passá-lo para vocês que acompanham o Blog.
A ideia de melhorar através da prática é algo antigo e existem diversas ferramentas que nos auxiliam nisso. Nós já falamos antes sobre o CodeFights, para ajudar você a melhorar sua habilidade de resolver algoritmos de forma divertida, mas esse Code Kata que vou mostrar para vocês está em uma categoria diferente.
Um Code Kata é uma tentativa de trazer a prática da repetição para o desenvolvimento de software. É análogo ao aprendizado de Karatê, no qual uma forma é repetida várias vezes, e aprende-se um pouco mais com cada repetição. O objetivo é aprender com a prática, através dos pequenos aprendizados ao longo do percurso, e não apenas com a solução final do problema.
O código do desafio está hospedado em um repositório público com nome de GildedRose-Refactoring-Kata no GitHub. No repositório temos a opção de escolher entre diversas linguagens e também temos um arquivo de texto que nos apresenta a especificação de requisitos do sistema.
O desafio em questão se trata de um software para uma pequena pousada chamada Gilded Rose que fica em um ponto estratégico de um Distrito de Trocas. O dono da pousada quer adicionar uma nova funcionalidade para seu sistema, mas por causa das péssimas decisões de design do programador anterior, estender novas funcionalidades se tornou um trabalho extremamente difícil. Logo, o nosso trabalho é adicionar a nova funcionalidade ao sistema ao passo que melhoramos seu design e garantimos que a aplicação não quebre.
Os leitores que jogam jogos online devem ter percebido que esse Code Kata é uma referência ao mundo de World of Warcraft. A própria pousada Gilded Rose é um local dentro do jogo e os itens apresentados na especificação de requisitos do sistema são itens do jogo. :)
Mas então, como devemos começar com esse desafio?
Clonando o repositório
Bem, a primeira coisa que devemos fazer é clonar o repositório do desafio utilizando o git com o seguinte comando.
git clone https://github.com/emilybache/GildedRose-Refactoring-Kata.git
Depois disso você só precisa abrir a IDE e importar o projeto na linguagem de sua escolha. No meu caso, utilizei o Eclipse e importei o projeto na linguagem Java, então vou mostrar para vocês como fazer o mesmo no seu Eclipse:
Com Eclipse aberto vá em File -> Import.
Na tela que abrir, selecione a pasta Maven e a opção Existing Maven Projects.
Clicamos então em Next e seguimos para a próxima tela onde devemos clicar em Browse para selecionar a pasta com o projeto.
Então navegamos até a pasta Java dentro da pasta GildedRose-Refactoring-Kata.
E, por fim, clicamos em Finish para finalizar a importação.
Depois disso o Maven vai resolver as dependências do Projeto e, então, você pode começar a melhorar o design da aplicação.
Colocando a mão na massa
Bem, a primeira coisa que precisamos fazer é verificar as Especificações de Requisitos do Sistema. Toda especificação pode ser lida no arquivo de texto chamado GildedRoseRequirements.txt (Arquivo em Inglês). A versão traduzida pode ser lida aqui
Ler e entender os requisitos é uma tarefa importante. Basicamente, o desafio desse Code Kata começa na interpretação completa dos requisitos e do problema, então preste muita atenção na leitura.
Atente-se principalmente nesse trecho:
Sinta-se livre para fazer qualquer alteração no método
updateQuality
e adicionar código novo contanto que tudo continue funcionando perfeitamente. Entretanto, não altere o código da classeItem
ou da propriedadeItems
na classeGildedRose
pois elas pertencem ao Goblin que irá te matar com um golpe pois ele não acredita na cultura de código compartilhado.
Você possui liberdade total para modificar o sistema, desde que não modifique a classe item
e que suas alterações não quebrem o sistema (que já funciona). Você deve criar os testes unitários para todos os cenários possíveis para garantir que a aplicação não quebre quando você começar a modificar o sistema.
Não se esqueça também dos artigos que mostramos aqui no Blog da TriadWorks sobre manter suas funções pequenas e concisas respeitando a responsabilidade, as boas práticas para parâmetros de funções e as 5 dicas que vão melhorar a legibilidade do seu código, que podem, e provavelmente irão, te ajudar durante o desafio.
A partir daqui é por sua conta. Então, bom refactoring e divirta-se. :)
Conclusão
Esse desafio, apesar de simples, me rendeu boas horas refatorando e melhorando o design da aplicação. Pegar uma classe que nunca vi e aplicar testes unitários nela antes de começar a refatorar o código do Gilded Rose foi uma tarefa mais complexa do que eu esperava, devido a imensa quantidade de condicionais utilizados no método updateQuality
que precisa ser testado.
Acredito que os Code Katas sejam uma boa forma de colocar em prática nossas habilidades de desenvolvedor e aprender mais através da experiência de encarar novos problemas. E além desse Code Kata, o repositório da Emily Bache possui outros Code Kata para você tentar como o Tennis-Refactoring-Kata, ou Racing-Car-Katas, entre outros. :)
E se você começou a fazer esse desafio do Gilded Rose e teve dificuldades em aprimorar o design da aplicação sem quebrá-la, principalmente por causa da falta de testes, dá uma olhada no curso de TDD e Testes Automatizados da TriadWorks que com certeza vai te ajudar com o refactoring de aplicações legadas, como também com o desenvolvimento de novas aplicações!
Por fim, essa ai é minha recomendação de atividade para praticar no final de semana. E se você tiver algum outro desafio desse estilo, conta pra gente nos comentários!
You might also be interested in these articles...
Desenvolvedor na TriadWorks - Email
Posted in: boa praticaclean codecurly lawjunitone thingprogramaçãorefactoringtddtestestestes automatizados