Esta é a versão refatorada do Gilded Rose Refactoring Kata original em PHP. O pacote vem com testes de unidade PHP criados, refatoração feita e novos recursos adicionados.
Os Requisitos da Rosa Dourada podem ser encontrados aqui.
php-xml
. Basta seguir as instruções na tela.Para instalar o projeto você precisa:
git clone [email protected]:mantis4444/gilded-rose-refactoring-kata-php.git /desired/directory
.cd /desired/directory
.composer install
. Observe que se você estiver fazendo isso no sistema operacional Windows, precisará usar em vez de
/
para separação de diretórios.
texttest_fixture.php
com o comando php src/texttest_fixture.php
.src/texttest_fixture.php
../vendor/bin/phpunit
.Observe que estas instruções pressupõem que você esteja no diretório do projeto.
Mantive o estilo de codificação original para me adaptar à situação atual. Embora eu tivesse gostado de usar o padrão PSR e os namespaces. Como resultado, o aplicativo suporta a entrada original, portanto o arquivo texttest_fixture.php
não foi tocado.
Primeiro de tudo fiz testes para ter certeza de que o código original está funcionando corretamente e surpreendentemente estava, apesar de sua estrutura de algoritmo confusa. Então o processo de refatoração foi iniciado. No começo reduzi a função update_quality()
o máximo possível. O código ficou muito mais legível, mas ainda havia muitos if
condicionais e eu não via uma maneira de minimizá-lo mais.
Depois de fazer algumas análises percebi que o Polimorfismo é a solução. Primeiro de tudo, criei uma classe de item aprimorada chamada ItemEnhanced
, que estendeu a classe Item
original e intocável para melhorar sua funcionalidade. O primeiro desafio foi aprimorar os itens e dar suporte ao código de instrução original. Enquanto o código original está configurando itens com a classe Item
, tive que encontrar uma maneira de aprimorar os itens sem alterá-los. Fiz isso no construtor de inicialização do aplicativo GildedRose , aprimorando os itens enquanto os configurava. Para melhorar também o objeto do item original, usei links de referência.
Agora a classe ItemEnhanced
possui a funcionalidade que todos os tipos de itens compartilham. No próximo passo criei classes para cada tipo de item que teriam sua funcionalidade especial. Eles estão estendendo a classe ItemEnhanced
e, portanto, o Item
original também. As funções do ItemEnhanced
que estão sendo usadas apenas nessas classes de tipo de item são protegidas para acessibilidade apenas na classe de tipo de item.
Depois que a refatoração for concluída, os testes serão aprovados com êxito. Agora era hora de adicionar novas funcionalidades. Com a nova estrutura do aplicativo ficou fácil fazer isso. Primeiro criei uma nova classe de tipo de item para o item "Conjurado" com suas regras específicas. Então criei novos testes para isso.
Voila, tudo funciona perfeitamente, o código é muito mais legível e flexível. Eu diria que os testes poderiam melhorar muito. Eles poderiam ser muito mais específicos do que são agora.