Код в поддержку постов о снижении time2market за счет применения практик сoding kata https://habr.com/ru/post/718746/.
Тест: посмотрите насколько хорошо Вы справляетесь с кодом, имеющим большую цикломатическую сложность
Вам будет предложено реализовать новое требование в двух версиях кода.
Одну версию кода писал программист Лирой, который не пользовался практиками coding kata и создал код с цикломатической сложностью 19.
Вторая версия кода получилась путем применения заклинания "Рефакторус копис", в результате чего код распутался и его цикломатическая сложность снизилась до 5.
Перед реализацией требований вооружитесь секундомером, карандашом и бумагой - они понадобятся для того, чтобы записать сколько времени вы потратите на внесение изменений каждый из вариантов кода и сколько ошибок вы допустите (не беспокойтесь, цикл тестирования займет меньше секунды т.к. к коду прилагаются автотесты).
Ожидание: решение задачи с цикломатической сложностью 19 займет существенно больше времени и будет сопряжено с существенно бОльшим количеством ошибок, нежели решение задачи с цикломатической сложностью 5.
Привет и добро пожаловать в команду Gilded Rose. Как вы знаете, мы - небольшая гостиница, расположенная в отличном месте одного известного города, которой управляет дружелюбный трактирщик по имени Эллисон. Мы также покупаем и продаем лучшие товары. К сожалению, качество наших товаров постоянно ухудшается по мере приближения срока реализации. У нас есть система, поддерживающая работу склада. Ее разработал серьезный тип по имени Лирой, отправившийся навстречу новым приключениям. Ваша задача — добавить новую функцию в нашу систему, чтобы мы могли начать продавать новую категорию товаров. Сначала введение в нашу систему:
- Все предметы имеют срок реализации (sell_in), который обозначает количество дней, в течение которых мы должны продать предмет.
- Все предметы имеют значение качества (quality), которое указывает, насколько ценен предмет.
- В конце каждого дня наша система снижает оба значения для каждого элемента.
Довольно просто, правда? Ну вот тут становится интересно:
- Как только срок реализации истек, качество ухудшается в два раза быстрее.
- Качество предмета никогда не бывает отрицательным.
- «Выдержанный бри» (Aged Brie) на самом деле тем лучше, чем старше он становится.
- Качество предмета никогда не превышает 50.
- "Sulfuras", будучи легендарным предметом, никогда не продается и не теряет качества.
- «Проходы за кулисы» (Backstage passes to a TAFKAL80ETC concert), также как выдержанный бри (Aged Brie), повышаются в качестве по мере приближения срока реализации: качество повышается на 2, если осталось 10 дней или меньше, и на 3, если осталось 5 дней или меньше, но после концерта качество падает до 0.
Недавно мы заключили договор с поставщиком колдовских предметов. Для этого требуется обновление нашей системы:
- Качество «Сотворенных» (Conjured) предметов ухудшается в два раза быстрее, чем у обычных предметов.
Не стесняйтесь вносить любые изменения в метод update_quality и добавлять любой новый код, пока все работает правильно. Однако не изменяйте класс Item или свойство items, так как они принадлежат гоблину в углу, который нападет на вас и убьет вас одним выстрелом, поскольку он не верит в совместное владение кодом (вы можете сделать метод update_quality и свойство items статическими, если хотите, мы вас прикроем). Ваша работа должна быть завершена к пятнице, 18 февраля 2011 г., 08:00:00 по тихоокеанскому стандартному времени (примечание: задание было опубликовано 13 февраля 2011 года).
Просто для пояснения:
- Качество предмета никогда не может повыситься выше 50, однако «Sulfuras» — это легендарный предмет, и поэтому его Качество равно 80, и оно никогда не меняется.
- Сотворенные предметы начинаются с последовательности "Conjured " перед названием предмета.
- Любой предмет может быть сотворенными и его качество изменяется по правилам этого предмета, но вдвое быстрее. Например, качество "Conjured Aged Brie" увеличивается на 2 единицы по мере приближения срока реализации.
Исходное задание https://github.com/emilybache/GildedRose-Refactoring-Kata.
Скопируйте к себе проект
$ git clone https://github.com/vasiliy-mikhailov/gilded_rose_python
$ cd gilded_rose_python
Создайте и активируйте виртуальное окружение
$ python3 -m venv venv
$ source venv/bin/activate
Инсталлируйте необходимые пакеты
$ pip install -r requirements.txt
Запустите тесты. Они уже написаны так, чтобы проверять все требования, включая требование о сотворенных предметах. Поскольку требования о сотворенных предметах не реализованы, то некоторые тесты упадут с ошибками.
$ pytest cyclomatic_complexity_5
$ pytest cyclomatic_complexity_19
Запустите секундомер.
Внесите изменения в код cyclomatic_complexity_5/gilded_rose_сyclomatic_complexity_5.py
Выполните тесты и убедитесь, что ошибок нет. Если возникла ошибка - пометьте себе, что возникла ошибка и повторите попытку изменения кода и выполнения тестов.
По завершении решения задачи с цикломатической сложностью 5 остановите секундомер.
Запишите:
- Удалось ли решить задачу (удалось или не удалось)
- Сколько времени заняло внесение требования в код в минутах
- Сколько ошибок в коде было допущено (сколько раз запуск автотестов привел к ошибке)
Повторите упражнение с файлом cyclomatic_complexity_19/gilded_rose_сyclomatic_complexity_19.py
Предупреждение: у вас может не получиться изменить код с цикломатической сложностью 19, поскольку он весьма запутанный.
На этом этапе можно пояснить, что метрика "цикломатическая сложность" показывает количество разных путей в коде. Чтобы разобраться в коде программист сначала перегружает пути к себе в голову и затем решает задачу. Поскольку довольно комфортно можно удержать в голове 7 +/- 2 пути, а значение 19 существенно превышает эту цифру, то и внесение исправлений в подобный код происходит существенно медленнее и сопровождается существенно бОльшим количеством ошибок, нежели в код с цикломатической сложностью 5.
Запишите сколько времени заняло внесение требования в код с цикломатической сложностью 19 и сколько ошибок было допущено.
После того, как тесты для кода с цикломатической сложностью 19 выполнились без ошибок, запишите:
- Удалось ли решить задачу (удалось или не удалось)
- Сколько времени заняло внесение требования в код в минутах
- Сколько ошибок в коде было допущено (сколько раз запуск автотестов привел к ошибке)
Опционально: поделитесь вашими результатами с автором задания. Для этого перейдите по ссылке https://github.com/vasiliy-mikhailov/gilded_rose_python/issues/new и cоздайте Issue с информацией о результатах выполнения задачи в свободной форме.
Удачи!