Задание для Java разработчика
Преамбула
В нашей игре есть такая механика как кланы, иначе говоря скопления игроков объединенные общей целью. У каждого клана есть своя казна с золотом. Есть различные способы пополнения казны клана. Можно выполнять задания, сражаться на арене, просто пополнить казну из своего кармана и т.д. И конечно же мы следим за всеми действиями, чтобы в случае чего служба поддержки могла как-то отвечать на вопросы пользователей в случае какого-то недопонимания.
Примерная иерархия
// Упрощенный объект клана
public class Clan {
private long id; // id клана
private String name; // имя клана
private int gold; // текущее количество золота в казне клана
}
// Есть сервис, посвященный кланам.
// Да это выглядит как 'репозиторий'.
// Но это сервис, просто все остальные методы не нужны для примера
public interface ClanService {
Clan get(long clanId);
}
// Так же у нас есть ряд сервисов похожих на эти.
// Их суть в том, что они добавляют(или уменьшают) золото в казне клана
public class UserAddGoldService { // пользователь добавляет золото из собственного кармана
private final ClanService clans;
public void addGoldToClan(long userId, long clanId, int gold) {
Clan clan = clans.getClan(clanId);
// clan.[gold] += gold;
// как-то сохранить изменения
}
}
// Еще один такой сервис
public class TaskService { // какой-то сервис с заданиями
private final ClanService clans;
void completeTask(long clanId, long taskId) {
// ...
// if (success)
{
Clan clan = clans.getClan(clanId);
// clan.[gold] += gold;
// как-то сохранить изменения
}
}
}
Данная структура лишь пример, и вы можете менять её на свое усмотрение.
Задачи
Реализовать логику добавления/уменьшения золота в клан, при этом предусмотреть, что золото может зачислиться из сотни(100) разных потоков в один момент. Разными пользователями по разной причине.
Реализовать отслеживание разных действий начисления золота, чтобы служба поддержки смогла идентифицировать когда и по какой причине в казне изменилось количества золота, сколько было, сколько стало и т.д.
Технические требования
Задание нацелено на демонстрацию ваших знаний java, в частности знание многопоточности. В конце у вас должно получиться функционирующее приложение, иначе говоря работающий код.
Также не стоит использовать высокоуровневые библиотеки такие как Spring, Hibernate. При необходимости лучше использовать что-то на уровне JDBC.
FAQ
Откуда в ClanService появляются новые кланы? Из бд? Или еще откуда-то?
На ваше усмотрение.
Нужно реализовать полноценный REST сервис?
На ваше усмотрение.
Нужно ли сделать например WEB интерфейс?
Вовсе не обязательно, это задание для backend разработчика. Конечно если вы его сделаете - будет круто 😎
А что должно быть в REST/WEB интерфейсах?
Вы делаете или не делаете эти или какие-то другие интерфейсы на свое усмотрение, это не то что нас интересует. Но вы можете сделать что угодно, если вам кажется что это добавит "дополнительных очков🏅".
Нужно ли использовать базу данных? И какую?
На ваше усмотрение. Это было бы хорошей демонстрацией ваших знаний SQL. Можете использовать любую удобную реляционную базу данных, например H2 - её не нужно отдельно устанавливать.
Пффф... Это вы называете заданием? Просто сделаю блокировку на уровне бд. 😏
Задание не должно быть сконцентрировано вокруг бд, это не то что мы хотим проверить. Мы ожидаем что вы проявите незаурядные знания работы с многопоточностью в java 😉
Какую версию java использовать?
Версий 8/11 будет вполне достаточно.
git или final_version_3(1).zip?
Лучше использовать гит.
Подразумевается, что данное приложение будет работать в одном экземпляре или в распределенной режиме (несколько экземпляров)?
В одном экземпляре.
Нужно реализовать %ЭТУ% фичу %ТАК% или %ЭТАК%?
В случае если это не относится к техническим требованием, делайте так, как вам кажется будет лучше на проекте с относительно большой нагрузкой. Самостоятельность и инициативность!
Куда задавать вопрос, если на него нет ответа здесь?
Написать нам на почту. Хотя скорее всего "На ваше усмотрение." 😁
А что нужно сделать?
Нужно сделать Задачи