Code Monkey home page Code Monkey logo

cv04-cs-cart's Introduction

Тестовое задание для архитектора

Задание

Провести рефакторинг существующей системы складского учета и добавить возможность учета нового типа товаров.

Описание системы учета

Система складского учета работает по следующим правилам:

  • У всех товаров есть свойство sell_in, которое показывает, сколько товар еще может храниться.
  • У всех товаров есть свойство quality, которое показывает ценность товара.
  • В конце дня оба свойства товара уменьшаются на 1.
  • Когда у товара кончится срок хранения, его ценность снижается в два раза быстрее.
  • Ценность не может быть отрицательной.
  • Ценность не может быть больше 50.

Нюансы

  • Ценность товара Blue cheese каждый день увеличивается на 1, а не уменьшается.
  • Как только у Blue cheese выйдет срок хранения, его ценность увеличивается на 2 каждый день.
  • Mjolnir — легендарный товар. Он не теряет в ценности — она всегда равна 80. Этот молот не продается, поэтому его срок хранения никогда не уменьшается.
  • Ценность товаров Concert tickets растет со временем:
    • Когда до конца срока хранения остается 10 дней, они прибавляют в ценности по 2 в день.
    • Когда до конца срока хранения остается 5 дней, они прибавляют в ценности по 3 в день.
    • Когда срок хранения истекает, ценность сразу же падает до 0.

Доработки, в которых нуждается система

  • В продаже появились магические товары — их ценность падает вдвое быстрее, чем у обычных товаров.

Требования

  1. Класс \Shop\Shop зарефакторить.
  2. Сигнатуры существующих методов класса \Shop\Shop не изменять.
  3. Класс \Shop\Item не изменять.
  4. Добавить тестовые данные для нового типа товаров.
  5. Результат оформить в виде репозитория на Github.

Решение

Решение 1

  1. Вынести работу с каждым типом товаров в отдельный метод: updateItemBlueCheese, updateItemMjolir, ... Преобразование товаров без нюансов вынести в updateCommonItem
  2. Определение метода для работы с типом товара организовать через дополнительный массив $specialItems.

Решение 2

  1. Вынести работу с каждым типом товаров в отдельный метод: updateItemBlueCheese, updateItemMjolir, ... Преобразование товаров без нюансов вынести в updateCommonItem
  2. Определение метода для работы с типом товара организовать через switch.

Решение 3 (теория)

  1. Перенести работу с типом товаров в класс Shop\Item.
  2. Работу со специальными типа организовать через наследование от Shop\Item.

cv04-cs-cart's People

Watchers

Ilia avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.