Skip to content

vasiliy-mikhailov/gilded_rose_python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Код в поддержку постов о снижении 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 с информацией о результатах выполнения задачи в свободной форме.

Удачи!

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages