##Задача На странице просмотра объявления необходимо вывести название объявления, текст и его стоимость. Стоимость объявления хранится в долларах, выводить надо в рублях по фиксированному системному курсу (1$ - 65рублей). Можно пофантазировать на тему, если курс меняется ежедневно и надо выводить результат с учетом текущего курса и в разных валютах (евро, гривны, тенге).
Есть две PHP-функции для получения данных объявления. Они достались в наследство из старого кода, их нельзя переписать и надо использовать как есть:
- Получение данных об объявлении из базы
function getAdRecord($id)
{
// пример ответа
return [
'id' => $id,
'name' => 'AdName_FromMySQL',
'text' => 'AdText_FromMySQL',
'keywords' => 'Some Keywords',
'price' => 10, // 10$
];
}
- Получение данных об объявлении из кеширующего демона
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');
####Вопросы:
-
В реальном приложении выбор источника данных (база или демон) делается не через get-запрос. Допустим это конфиг или какой-то балансировщик, но так или иначе системе уже известно, какой источник выбран в данный момент. Как получить информацию об объявлении в других частях приложения из выбранного источника? Как получить объявление из конкретного источника по-требованию?
-
Как централизованно включить/отключить логгирование во всех частях приложения?
Это абстрактная и упрощенная задача. Чтобы быстро получить необходимый результат достаточно написать пол-страницы примитивного кода. Возможно, в реальных условиях, так действительно стоит поступить. Но, представим, что все серьезно, и этот код часть большой и сложной системы, который надо будет дальше поддерживать и развивать.
В рамках задачи НЕ надо прикручивать MVC, необходимо реализовать логику работы на голом PHP с применением ООП без фреймворков.
В качестве бонуса можно написать модульные тесты на phpunit для полученных классов.