Это переработанная версия оригинального ката рефакторинга Gilded Rose на PHP. Пакет поставляется с созданными модульными тестами PHP, выполненным рефакторингом и добавленными новыми функциями.
Требования к позолоченной розе можно найти здесь.
php-xml
. Просто следуйте инструкциям на экране.Для установки проекта вам необходимо:
git clone [email protected]:mantis4444/gilded-rose-refactoring-kata-php.git /desired/directory
.cd /desired/directory
.composer install
. Обратите внимание : если вы делаете это в ОС Windows, вам нужно использовать вместо
/
для разделения каталогов.
texttest_fixture.php
с помощью команды php src/texttest_fixture.php
.src/texttest_fixture.php
../vendor/bin/phpunit
.Обратите внимание : в этих инструкциях предполагается, что вы находитесь в каталоге проекта.
Я сохранил исходный стиль кодирования, чтобы адаптироваться к текущей ситуации. Хотя мне бы хотелось использовать стандарт и пространства имен PSR. В результате приложение поддерживает исходный ввод, при этом файл texttest_fixture.php
не был затронут.
Прежде всего, я провел тесты, чтобы убедиться, что исходный код работает правильно, и, как это ни удивительно, так оно и было, несмотря на его беспорядочную структуру алгоритмов. Затем начался процесс рефакторинга. Вначале я максимально сократил функцию update_quality()
. Код стал намного более читабельным, но условных if
по-прежнему было слишком много, и я не видел способа, как можно его еще больше минимизировать.
Проведя некоторый анализ, я понял, что полиморфизм — это решение. Прежде всего я создал расширенный класс предметов под названием ItemEnhanced
, который расширял исходный и неприкосновенный класс Item
для улучшения его функциональности. Первой задачей было усовершенствование Items и поддержка исходного кода инструкций. В то время как исходный код настраивает элементы с помощью класса Item
, мне пришлось найти способ улучшить элементы, не меняя их. Я сделал это в конструкторе инициализации приложения GildedRose , улучшив элементы при их установке. Чтобы улучшить исходный объект элемента , я использовал ссылочные ссылки.
Теперь класс ItemEnhanced
обладает функциональностью, свойственной всем типам элементов. На следующем этапе я создал класс для каждого типа предметов, чтобы они имели свои особые функции. Они расширяют класс ItemEnhanced
а значит и исходный Item
. Функции ItemEnhanced
, которые используются только в этих классах типов элементов, защищены от доступности только в классе типов элементов.
После завершения рефакторинга тесты проходят успешно. Теперь пришло время добавить новую функциональность. Имея новую структуру приложения, это было легко сделать. Сначала я создал новый класс типа предмета для предмета «Сотворенный» со своими особыми правилами. Затем я создал для него новые тесты.
Вуаля, все работает как часы, код стал намного читабельнее и гибче. Я бы сказал, что тесты можно было бы значительно улучшить. Они могли бы быть гораздо более конкретными, чем сейчас.