Il s'agit de la version refactorisée du Kata de refactorisation Gilded Rose original en PHP. Le package est livré avec des tests unitaires PHP créés, une refactorisation effectuée et une nouvelle fonctionnalité ajoutée.
Les exigences de Gilded Rose peuvent être trouvées ici.
php-xml
. Suivez simplement les instructions à l’écran.Pour installer le projet dont vous avez besoin :
git clone [email protected]:mantis4444/gilded-rose-refactoring-kata-php.git /desired/directory
.cd /desired/directory
.composer install
. Notez que si vous le faites sous Windows, vous devez utiliser au lieu de
/
pour la séparation des répertoires.
texttest_fixture.php
avec la commande php src/texttest_fixture.php
.src/texttest_fixture.php
../vendor/bin/phpunit
.Notez que ces instructions supposent que vous vous trouvez dans le répertoire du projet.
J'ai conservé le style de codage original pour m'adapter à la situation actuelle. Bien que j'aurais aimé utiliser le standard PSR et les espaces de noms. En conséquence, l'application prend en charge l'entrée originale, le fichier texttest_fixture.php
n'a donc pas été touché.
Tout d'abord, j'ai fait des tests pour m'assurer que le code original fonctionnait correctement et, de manière surprenante, il l'était, malgré sa structure algorithmique désordonnée. Ensuite, le processus de refactorisation a commencé. Au début, j'ai réduit autant que possible la fonction update_quality()
. Le code est devenu beaucoup plus lisible, mais il y avait encore trop de conditions if
et je ne voyais pas comment je pourrais le minimiser davantage.
Après avoir fait quelques analyses, j'ai réalisé que le polymorphisme était la solution. Tout d'abord, j'ai créé une classe d'objets améliorée appelée ItemEnhanced
qui étendait la classe Item
originale et intouchable pour améliorer ses fonctionnalités. Le premier défi consistait à améliorer les éléments et à prendre en charge le code d'instruction original. Alors que le code d'origine configure les éléments avec la classe Item
, j'ai dû trouver un moyen d'améliorer les éléments sans les modifier. Je l'ai réalisé sur le constructeur d'initialisation de l'application GildedRose , en améliorant les éléments tout en les définissant. Pour améliorer également l' objet d'origine, j'ai utilisé des liens de référence.
Désormais, la classe ItemEnhanced
possède les fonctionnalités que partagent tous les types d’éléments. À l'étape suivante, j'ai créé une classe pour chaque type d'élément afin qu'ils aient leur propre fonctionnalité spéciale. Ils étendent la classe ItemEnhanced
donc également l' Item
d'origine. Les fonctions de ItemEnhanced
qui sont utilisées uniquement dans ces classes de types d'éléments sont protégées pour l'accessibilité dans la classe de types d'éléments uniquement.
Une fois la refactorisation terminée, les tests réussissent. Il était désormais temps d'ajouter de nouvelles fonctionnalités. Ayant une nouvelle structure de l’application, c’était facile de le faire. J'ai d'abord créé une nouvelle classe de type d'élément pour l'élément "Conjured" avec ses règles spécifiques. Ensuite, j'ai créé de nouveaux tests pour cela.
Voila, tout fonctionne à merveille, le code est beaucoup plus lisible et flexible. Je dirais que les tests pourraient être beaucoup améliorés. Ils pourraient être beaucoup plus précis qu’ils ne le sont actuellement.