Возможно ли более четко разделить обязанности классов?
Изучаю Java, делаю серверную часть своей игры, моя задача на данный момент - сделать backend, REST-сервис для общения с игровым клиентом.
Есть класс Browser - браузер "битв", где игрок может посмотреть созданные битвы ожидающие противников, отсортировать их (скажем, по длительности битвы или уровню профессионализма оппонента) и, выбрав, присоединиться к "битве".
public class Browser {
private static final List<User> subscribers = ...;
private static final List<PreparedBattle> battles = ...;
public void subscribe() {...}
public void unsubscribe() {...}
...
public void createBattle(User creator, ...) {...}
public void connect(int battleId) {...}
}
И тут есть проблемка - например, в методе createBattle я должен вернуть текущему юзеру подробную информацию о созданной им битве. А остальным игрокам из subscribers мне нужно вернуть просто общую инфу "создана новая битва, id = 55, время битвы 10 мин".
Меня волнует архитектурный вопрос - правильно ли подготавливать и рассылать сообщения прямо из этого класса? Ведь он отвечает за логику приложения - создает битвы, стартует их. Не его обязанность готовить сообщения - создателю одно, остальным другое, потом может и еще что-то добавится такими темпами. Первый же из принципов SOLID говорит что так не надо делать и это разумно.
Выносить функционал общения с User в отдельный класс тоже особо не поможет, как ни крути, сообщение формировать надо все равно в Browser.
Также буду рад если укажете хорошую книгу где рассматриваются такие вопросы, желательно с примерами на Java.
Ответы (1 шт):
В общем, существует так называемый паттерн "Наблюдатель" (Observer). Существует много готовых решений реализующих этот паттерн. Например библиотеки реактивности,такие как RxJava и Project Reactor. Также, для вместо обычного http соединения можно использовать более продвинутый Websocket.