Очень часто вы можете услышать, что классы должны быть хорошо сплоченными и слабо связанными. Для многих людей это может означать что-то немного другое. Поэтому важнее, чем просто услышать лозунг, иметь практические примеры того, что он на самом деле означает. Чтобы добиться слабой связи, в начале следует рассмотреть шину событий.
Почему я на самом деле хочу использовать слабую связь? Представьте себе сценарий, когда вы отображаете одни и те же данные в нескольких формах: в виде диаграммы, в виде таблицы или в устной форме на естественном языке. И давайте сделаем изменения данных с течением времени. Чтобы поддерживать все зависимые компоненты в актуальном состоянии, вам нужно будет вести их список и отправлять свежие данные напрямую всем. Будет сложно, когда их количество меняется со временем (по мере роста проекта) и это делает их зависимыми от источника данных.
С другой стороны, вы можете использовать шину событий в качестве источника изменений, также известных как события.
Как использовать шину событий? Давайте посмотрим на простой пример ниже.
public void init() {
EventBus eventBus = new EventBus();
Chart dataChart = new Chart();
Table dataTable = new Table();
TextPanel textPanel = new TextPanel();
eventBus.register(dataChart);
eventBus.register(dataTable);
eventBus.register(textPanel);
eventBus.post(new DataUpdateEvent(dataResource.fetchCurrent()));
}
class Chart {
@Subscribe
public void onNewData(DataUpdateEvent event) {
// ...
}
}
Просто как тот. Что вы этим выигрываете?
- Вы отделяете классы отображения данных (
Chart
,Table
иTextPanel
) от базового ресурса данных. Вы можете легко изменить источник данных, даже не меняя эти классы. - Их можно легко протестировать. Вам не нужно передавать
EventBus
через конструктор или сеттер. Единственное, что вам нужно сделать, это создать новый экземпляр, например.Chart
и вызовите общедоступный методonNewData
. - Добавить новые источники данных очень просто. Вам просто нужно подключить его к
eventBus
. Источники данных не должны ничего знать о получателях. Таким образом, ваш код открыт для расширений и закрыт для модификаций. - Если зависимые от данных также могут изменять данные, легко распространить изменения на остальных. Просто
post
обновление доeventBus
. Определенные классы не знают о получателях и не должны о них беспокоиться.
Если вы не использовали этот инструмент, попробуйте. Наверняка это сделает ваш код менее связанным.
—
Есть и другие преимущества Event Bus
. В одном классе вы можете подписаться на несколько объектов. Весь механизм типобезопасен, поэтому вы всегда получаете то, что ожидали. И он разработан Google.
Если вы хотите узнать больше, вы можете найти официальные документы здесь.
Первоначально опубликовано на dmydlarz.com 26 сентября 2017 г.