Провести рефакторинг существующей системы складского учета и добавить возможность учета нового типа товаров.
Система складского учета работает по следующим правилам:
- У всех товаров есть свойство
sell_in
, которое показывает, сколько товар еще может храниться. - У всех товаров есть свойство
quality
, которое показывает ценность товара. - В конце дня оба свойства товара уменьшаются на 1.
- Когда у товара кончится срок хранения, его ценность снижается в два раза быстрее.
- Ценность не может быть отрицательной.
- Ценность не может быть больше 50.
- Ценность товара Blue cheese каждый день увеличивается на 1, а не уменьшается.
- Как только у Blue cheese выйдет срок хранения, его ценность увеличивается на 2 каждый день.
- Mjolnir — легендарный товар. Он не теряет в ценности — она всегда равна 80. Этот молот не продается, поэтому его срок хранения никогда не уменьшается.
- Ценность товаров Concert tickets растет со временем:
- Когда до конца срока хранения остается 10 дней, они прибавляют в ценности по 2 в день.
- Когда до конца срока хранения остается 5 дней, они прибавляют в ценности по 3 в день.
- Когда срок хранения истекает, ценность сразу же падает до 0.
- В продаже появились магические товары — их ценность падает вдвое быстрее, чем у обычных товаров.
- Класс
\Shop\Shop
зарефакторить. - Сигнатуры существующих методов класса
\Shop\Shop
не изменять. - Класс
\Shop\Item
не изменять. - Добавить тестовые данные для нового типа товаров.
- Результат оформить в виде репозитория на Github.
- Вынести работу с каждым типом товаров в отдельный метод: updateItemBlueCheese, updateItemMjolir, ... Преобразование товаров без нюансов вынести в updateCommonItem
- Определение метода для работы с типом товара организовать через дополнительный массив $specialItems.
- Вынести работу с каждым типом товаров в отдельный метод: updateItemBlueCheese, updateItemMjolir, ... Преобразование товаров без нюансов вынести в updateCommonItem
- Определение метода для работы с типом товара организовать через switch.
- Перенести работу с типом товаров в класс Shop\Item.
- Работу со специальными типа организовать через наследование от Shop\Item.