Skip to content

Latest commit

 

History

History
90 lines (68 loc) · 5.35 KB

task.md

File metadata and controls

90 lines (68 loc) · 5.35 KB

##Задача На странице просмотра объявления необходимо вывести название объявления, текст и его стоимость. Стоимость объявления хранится в долларах, выводить надо в рублях по фиксированному системному курсу (1$ - 65рублей). Можно пофантазировать на тему, если курс меняется ежедневно и надо выводить результат с учетом текущего курса и в разных валютах (евро, гривны, тенге).

Есть две PHP-функции для получения данных объявления. Они достались в наследство из старого кода, их нельзя переписать и надо использовать как есть:

  1. Получение данных об объявлении из базы
    function getAdRecord($id)
    {
        // пример ответа
        return [
            'id'       => $id,
            'name'     => 'AdName_FromMySQL',
            'text'     => 'AdText_FromMySQL',
            'keywords' => 'Some Keywords',
            'price'    => 10, // 10$
        ];
    }
  1. Получение данных об объявлении из кеширующего демона
    function get_deamon_ad_info($id)
    {
        // пример ответа: строка разделенная табуляцией
        return "{$id}\t235678\t12348\tAdName_FromDaemon\tAdText_FromDaemon\t11";
    }

где колонки:

0. id - объявления
1. id - кампании
2. id - пользователя
3. название объявления
4. текст объявления
5. стоимость объявления в $

В рабочей системе пользователю отдается объявление из базы или от демона. Чтобы сэмулировать такое поведение, для простоты добавим в GET-запрос параметр "from=", например:

В зависимости от строки HTTP-запроса надо вывести информацию об объявлении - заголовок, текст и стоимость: для запроса /?id=1&from=Mysql ответ:

    <h1>AdName_FromMySQL</h1>
    <p>AdText_FromMySQL</p>
    <p>стоимость: Х руб</p>

для запроса /?id=1&from=Daemon ответ:

    <h1>AdName_FromDaemon</h1>
    <p>AdText_FromDaemon</p>
    <p>стоимость: Х руб</p>

Если в запрос добавить дополнительный параметр log, например: /?id=1&from=Mysql&log=1, тогда надо зафиксировать факт обращения к источнику данных в лог-файле. Надо сохранить время запроса, название источника данных (точное название PHP-фукнции) и ID объявления:

"[time] getAdRecord(ID=1)"

или

"[time] get_deamon_ad_info(ID=1)"

Мы используем какой-то гипотетический логгер из внешней библиотеки, который ничего не знает о нашем коде, и дописывать мы его тоже не можем:

    $logger = new FileLogger('/path/to/file');
    $logger->log('log message');

####Вопросы:

  1. В реальном приложении выбор источника данных (база или демон) делается не через get-запрос. Допустим это конфиг или какой-то балансировщик, но так или иначе системе уже известно, какой источник выбран в данный момент. Как получить информацию об объявлении в других частях приложения из выбранного источника? Как получить объявление из конкретного источника по-требованию?

  2. Как централизованно включить/отключить логгирование во всех частях приложения?

Это абстрактная и упрощенная задача. Чтобы быстро получить необходимый результат достаточно написать пол-страницы примитивного кода. Возможно, в реальных условиях, так действительно стоит поступить. Но, представим, что все серьезно, и этот код часть большой и сложной системы, который надо будет дальше поддерживать и развивать.

В рамках задачи НЕ надо прикручивать MVC, необходимо реализовать логику работы на голом PHP с применением ООП без фреймворков.

В качестве бонуса можно написать модульные тесты на phpunit для полученных классов.